Jisui (自炊) Verarbeitung
Regeln für gescannte Bilder → ZIP / CBZ / PDF. Gilt nicht nur für Bücher, sondern für alles Gescannte (Zeitschriften, Dokumente, Notizen usw.). Dieser Skill entscheidet nicht über den Namen oder Speicherort der Ausgabedatei. Folge dem Aufrufer (der CLAUDE.md des Projekts oder den Anweisungen des Benutzers); falls keines beides festlegt, frage den Benutzer.
Gegebene Pfade
Argumente: $ARGUMENTS
Lies zuerst die angegebenen Pfade (Ordner mit Scans, Bilddateien oder PDFs); falls keine angegeben wurden, verwende das aktuelle Verzeichnis (.) – es sei denn, die Anfrage selbst nennt die Scans. Liste dann rekursiv alle enthaltenen Dateien auf (Unterordner, Dateinamen, Erweiterungen, Anzahl, Bildabmessungen/DPI einiger Dateien) und betrachte ein paar Bilder (erstes, letztes und einige dazwischen). Leite daraus die Struktur ab – z. B. ein Band pro Ordner oder mehrere Bände in einem Ordner, welche Dateien wie das Cover / die Rückseite / der Schutzumschlag / die Seiten des Textkörpers aussehen, Aufteilung in ungerade/gerade Seiten, Duplikate oder ungewollte Dateien – und schlage einen konkreten Jisui-Plan vor (Bände, Seitenreihenfolge, Cover-/Rückseiten-/Umschlagquellen, vorgeschlagene Optionen). Baue diesen Plan in die folgenden Fragen ein, damit der Benutzer ihn in einem Schritt bestätigt oder korrigiert.
Vor dem Start
Frage den Benutzer (ein AskUserQuestion-Aufruf) nach allem, was der Aufrufer nicht bereits entschieden hat:
- Ausgabeformat: ZIP / CBZ / PDF.
- Cover (vorderer Einband): Platzierung – erste Seite der Ausgabe / nicht verwendet / separate Datei neben der Ausgabe; und Quelle – eine vom Benutzer angegebene Datei / der erste Scan / der vordere Teil des Schutzumschlags / ein im Web gefundenes Bild.
- Rückseite: Platzierung – letzte Seite vor dem Schutzumschlag / nicht verwendet / separate Datei neben der Ausgabe; und Quelle – eine vom Benutzer angegebene Datei / der letzte Scan (vor dem Schutzumschlag, falls dieser der letzte Scan ist) / der hintere Teil des Schutzumschlags / ein im Web gefundenes Bild.
- Schutzumschlag (Scan oder Bild des Buchumschlags): dieselben zwei Fragen; Quelle – eine vom Benutzer angegebene Datei / der letzte Scan / ein im Web gefundenes Bild.
Eine Quelle aus den Scans wird aus den Textseiten entfernt, selbst wenn ihre Platzierung „nicht verwendet“ ist (sie wird nicht verarbeitet oder behalten). Falls es keine Quelle für Cover/Rückseite/Schutzumschlag gibt, ist jeder Scan eine Textseite. Bei einem Web-Bild suche nach der Ausgabe, die zu den Scans passt (Titel, Verlag, ISBN falls sichtbar), lade die größte Version in den Arbeitsbereich, zeige sie dem Benutzer und lass sie vor der Verwendung bestätigen.
Seitenverarbeitung
- Cover / Rückseite / Schutzumschlag (wie in „Vor dem Start“ festgelegt). Alle folgenden Schritte gelten nur für Textseiten.
- Cover: wird unbearbeitet verwendet (farbig, Abmessungen unverändert). Einbezogen → die erste Seite. Aus dem vorderen Teil des Schutzumschlags: betrachte den aufrechten Schutzumschlag und finde die Spalten X0–X1 der Vorderseite – zwischen dem Falz des Buchrückens und der vorderen Umschlagklappe (rechts vom Buchrücken bei einem linksgebundenen Buch, links davon bei einem rechtsgebundenen / senkrecht geschriebenen Buch) – und schneide nur diesen Bereich aus, in voller Höhe (farbig).
- Rückseite: dasselbe wie das Cover. Einbezogen → die Seite nach der letzten Textseite (vor dem Schutzumschlag). Aus dem hinteren Teil des Schutzumschlags: die Rückseite, zwischen der hinteren Umschlagklappe und dem Falz des Buchrückens (auf der anderen Seite des Buchrückens als die Vorderseite).
- Schutzumschlag: nur in die richtige Ausrichtung drehen (farbig, Abmessungen unverändert). Pixelgenau drehen; wenn die Abmessungen des JPEG keine verlustfreie Drehung zulassen, PNG verwenden. Einbezogen → die letzte Seite; im PDF wird nur diese Seite in Originalgröße (entsprechend ihrer DPI) eingefügt.
- Separate Datei: speichere sie neben der Ausgabe als
<Ausgabename>-cover.<ext>/<Ausgabename>-back.<ext>/<Ausgabename>-jacket.png, unverändert von dem, was das Skript geschrieben hat.
- Schräglagenkorrektur: für jede Seite die Schräglage innerhalb von ±3° in 0,1°-Schritten erkennen und korrigieren.
- Drehung (die Zeilen sind geneigt) und Scherung (die Zeilen sind waagerecht, aber nur die linken/rechten Kanten des Textblocks sind schräg – dies passiert, wenn das Papier in einem Einzug seitlich verrutscht) getrennt erkennen und korrigieren.
- Seiten mit wenig Text (Titelseiten, Schmutztitel, kurze Seiten) können nicht zuverlässig auf Schräglage geprüft werden; daher nicht korrigieren.
- Randminimierung: auf nur 2 mm (24 Pixel bei 300 dpi) Rand auf jeder Seite des Textblocks zuschneiden.
- Scanschattierungen, dünne Linien an den Seitenrändern oder kleine Sprenkel im Textblock nicht einbeziehen. Schattierungen und Linien an den Seitenrändern aufhellen.
- Einheitliche Abmessungen: alle Textseiten eines Bandes erhalten die gleichen Abmessungen.
- Pro Band eine Zuschnittsgröße festlegen und pro Seite so positionieren, dass der Textblock dieser Seite passt (die Position des Textblocks verschiebt sich um einige mm von Scan zu Scan). Seiten mit wenig Text (Titelseiten, Kapitelanfänge, kurze Seiten) übernehmen die Position einer benachbarten Seite auf derselben Seite (ungerade/gerade), damit sie ihr ursprüngliches Layout behalten.
- Seiten, die aus dem Kasten überlaufen, werden leicht verkleinert, um hineinzupassen.
- Nur auf Anweisung: Bildseiten wie ganzseitige Illustrationen und Titelseiten aus dem Textkasten nehmen und ihnen einen gemeinsamen Bildseitenkasten mit derselben Höhe wie der Text, aber breiter geben (
--picture). Dies ermöglicht kleinere Ränder bei den Textseiten.
- Leerseiten: nicht überspringen; als leere Seiten behalten.
- Jede Seite behalten: keine Seiten löschen, auch Anzeigen nicht.
- Schwarz-Weiß: nur auf Anweisung auf Schwarz-Weiß binarisieren (es ist verlustbehaftet, also nicht standardmäßig).
- Text binarisieren, aber Bildbereiche wie Fotos und Illustrationen nicht binarisieren; sie graustufig belassen.
- Einen Schwellwert von 200 (0–255; Pixel dunkler als dies werden schwarz) als Basis verwenden. Automatische Auswahl (Otsu, etwa 160) machte den Text zu blass.
- Nach der Arbeit den verwendeten Schwellwert melden und den Benutzer fragen, ob dieser Wert richtig aussieht.
- OCR: nur auf Anweisung eine OCR-Textschicht zum PDF hinzufügen (
ocrmypdf -j 2 -l jpn+eng --output-type pdf, Bilder unverändert;-lan die Sprache des Inhalts anpassen, z. B.kor+engfür Koreanisch). Apple OCR neigt bei großen Seitenzahlen zu Zeitüberschreitungen; daher mitqpdfin 50-Seiten-Blöcke aufteilen, jeden OCRen, nur die fehlgeschlagenen wiederholen, dann zusammenführen.- Bei wiederholter Verwendung kann Apple OCR (LiveText) stillschweigend leere Textschichten zurückgeben, ohne Fehlermeldung. Vor dem Zusammenführen jede Seite mit
pdftotextüberprüfen, ob Text extrahiert wurde; für Blöcke mit leeren Textseiten etwas warten und wiederholen. Wenn das nicht hilft, den Mac neu starten.
- Bei wiederholter Verwendung kann Apple OCR (LiveText) stillschweigend leere Textschichten zurückgeben, ohne Fehlermeldung. Vor dem Zusammenführen jede Seite mit
- Lesezeichen (Indizierung): nur auf Anweisung Inhaltsverzeichnis-Lesezeichen (Gliederung) zum PDF hinzufügen.
- Die Seiten des Inhaltsverzeichnisses lesen und Teile/Kapitel/Abschnitte in derselben Hierarchie wie das Inhaltsverzeichnis hinzufügen, mit Überschriften genau wie gedruckt (Vorwort, Nachwort, Kommentar, Anmerkungen, Register usw. einschließen, falls sie im Inhaltsverzeichnis stehen). Zuerst einen Eintrag für das Inhaltsverzeichnis selbst, der auf die Inhaltsverzeichnisseite verweist. Teile/Kapitel ohne Seitenzahl im Inhaltsverzeichnis verweisen auf ihre Titelseite oder die Seite mit ihrer Überschrift.
- Die Zuordnung zwischen gedruckten Seitenzahlen und PDF-Seiten durch Lesen von Seitenzahlen an mehreren Stellen ermitteln. Sie kann sich verschieben (z. B. wegen Frontispizen); daher für jeden Eintrag der obersten Ebene und einige der unteren Ebenen überprüfen, ob die Überschrift tatsächlich auf der Zielseite erscheint.
- Mit
pikepdfunter Verwendung des gleichen Verfahrens wie bei der Metadatenbearbeitung (keine Bildneukompression) schreiben und/PageMode /UseOutlinessetzen. Nach dem Schreiben zurücklesen und überprüfen. Falls es kein Inhaltsverzeichnis gibt, keine Lesezeichen hinzufügen; den Benutzer informieren.
Ausführung
uv run <Ordner dieses Skills>/scripts/jisui.py <Bildordner> <Ausgabeordner> [--threshold N | --gray | --color] [--no-deskew 1,12,...] [--picture 3,24,...] [--dpi N] [--cover first|DATEI|jacket:X0-X1] [--back last|DATEI|jacket:X0-X1] [--jacket last|DATEI] [--jacket-rotate 0|90|180|270] führt Schritt 0 (--cover: kopiert den ersten Scan oder die DATEI unbearbeitet als 0000.<ext>, oder mit jacket:X0-X1 schneidet diese Spalten des aufrechten Schutzumschlags als 0000.png aus (benötigt --jacket); --back: dasselbe für die Rückseite, aus dem letzten Scan (vor dem des Schutzumschlags genommen), geschrieben direkt nach den Textseiten als NNNN.<ext> (.png bei Zuschnitt aus dem Schutzumschlag); --jacket: nimmt den letzten Scan oder die DATEI, dreht ihn im Uhrzeigersinn um --jacket-rotate und schreibt ihn als letztes NNNN.png; verwende sie immer, wenn es eine Cover-/Rückseiten-/Schutzumschlagsquelle gibt, unabhängig von deren Platzierung), Schritte 1–3 und Schritt 6 (Schwarz-Weiß) (mit --gray kein Schwarz-Weiß und Seiten bleiben graustufig; mit --color Seiten bleiben farbig) aus und schreibt die Seitenbilder (PNG) und einen Bericht (<Ausgabeordner>-report.json: Schwellwert, Kastenabmessungen, leere/verkleinerte Seiten und Seiten mit Graustufenbereichen). Seitennummern sind die Ausgabenummern (NNNN.png; das Cover ist 0, die erste Textseite 1). Übergib Seitennummern, die nicht entzerrt werden sollen, an --no-deskew und Bildseitennummern an --picture (der Bericht enthält dann auch die Abmessungen des Bildseitenkastens; die Höhe ist gleich der des Textkastens, daher genügt ein --imgsize). Lege Arbeitsausgaben im Arbeitsbereich ab; schreibe niemals in die ursprünglichen Scans oder die Ordner des Benutzers.
- Nimm kein Beschnittformat an. Standardmäßig werden die Ränder minimiert und die Textseiten einheitlich groß gemacht. Die Auflösung für die Umrechnung mm↔px stammt aus dem DPI-Tag des Bildes; falls kein Tag vorhanden oder unter 150 (ein Platzhalter wie 72), nimm 300 dpi an (andernfalls
--dpi Nübergeben). - Beim Erstellen eines PDFs die Größe mit
img2pdf --imgsize x<Kastenhöhe in mm>festlegen (die Ausgabe-PNGs tragen keine DPI-Informationen). Die Cover-/Schutzumschlagsseite separat ohne--imgsize(Originalgröße entsprechend ihrem DPI-Tag) erstellen und mitpikepdfanhängen. - Überprüfe nach der Verarbeitung einige Seiten als Bilder (Schräglage, Zuschnitt, Binarisierung) und kontrolliere, dass die leeren/verkleinerten Seiten im Bericht Sinn ergeben, bevor du die Ausgabe erstellst.
Ausgabe
Vor dem Packen die Bilder von Cover/Rückseite/Schutzumschlag, deren Platzierung „nicht verwendet“ oder „separate Datei“ ist, aus dem Satz nehmen (und die separaten wie in Schritt 0 speichern).
- ZIP: die verarbeiteten Seitenbilder in der obersten Ebene des Archivs ablegen, mit Dateinamen in Seitenreihenfolge. Bilder nicht neu komprimieren (
zip -0)..DS_Storeund Ähnliches nicht aufnehmen. - CBZ: wie ZIP, mit der Erweiterung
.cbz. Leseprogramme verwenden das erste Bild als Vorschaubild.ComicInfo.xmlnur durch Metadatenbearbeitung hinzufügen. - PDF: dieselben Bilder wie das ZIP ohne Neukompression anordnen (
img2pdf). OCR folgt Schritt 7, Lesezeichen Schritt 8. - Modusnamen: werden durch die Textseiten bestimmt –
color/grayscale/bw(ein farbiges Cover allein macht es nicht zucolor).+ocranfügen, wenn eine OCR-Schicht vorhanden ist, und+toc, wenn Lesezeichen vorhanden sind (niemals bei ZIP/CBZ). Ob dies in den Dateinamen aufgenommen wird, liegt am Aufrufer.
Metadatenbearbeitung (Titel / Autor)
Werte vom Aufrufer (Katalog, Benutzer) übernehmen. Niemals raten und ausfüllen.
- Nur die Felder Titel und Autor. Keine Übersetzer in Autor eintragen.
- PDF: Titel und Autor sowohl im Info-Wörterbuch als auch in XMP schreiben, ohne Seiten neu zu komprimieren (
pikepdf). - EPUB: nur das Haupt-
dc:titleund jedesdc:creatorim OPF ändern (sowie diedcterms:*/file-as-Meta, die diese verfeinern); nichts anderes anfassen. Das ZIP unter Beibehaltung der Eintragsreihenfolge und Kompressionsmethoden neu schreiben, mitmimetypean erster Stelle und unkomprimiert. Standard Ebooks' Untertitel-/Langtitel-Einträge können unverändert bleiben. - CBZ:
ComicInfo.xml(<Title>,<Writer>) am Ende des Archivs schreiben, gespeichert (zip -0), die Bildeinträge unverändert lassen. Bei rechts-nach-links-Büchern (japanischer vertikaler Text, Manga) auch<Manga>YesAndRightToLeft</Manga>einfügen, wenn der Benutzer zustimmt. - ZIP (gescannte Bilder): hat keine Metadaten, daher überspringen.
- An einer Kopie im Arbeitsbereich arbeiten, überprüfen (Seitenanzahl / Einträge unverändert, gelesene Metadaten stimmen mit den angegebenen Werten überein), dann die Originaldatei ersetzen. Das Ersetzen überschreibt die Datei des Benutzers, daher zuerst bestätigen lassen, es sei denn, der Aufrufer hat es genehmigt.