Scanned PDF cleaner (Bereinigung von gescannten PDFs)
Handyfotos eines aufgeschlagenen Buches kommen in der Nähe des Buchrückens gekrümmt, schief, grau, mit einem Daumen am Rand und einem schmalen Streifen der nächsten Seite heraus. Diese Fähigkeit verwandelt sie in Seiten, die sich wie ein sauberer Ausdruck lesen.
Die Skripte erledigen die Pixelarbeit. Sie übernehmen die Beurteilung: Sie zeichnen die Ecken jeder Seite nach, sehen sich an, was entfernt wurde, und entscheiden, welche Markierungen außerhalb des Textes gedruckt (behalten) und welche nicht (entfernen) sind. Jeder Schritt schreibt Kontaktbögen, die Sie als Bilder lesen können – schauen Sie sie sich an. Gehen Sie nicht davon aus, dass ein Schritt funktioniert hat.
Einrichtung (einmal pro Maschine)
SKILL=<dieser Skill-Ordner> # der Ordner, der diese SKILL.md enthält
python3 -m venv ~/.cache/scanned-pdf-cleaner-venv
~/.cache/scanned-pdf-cleaner-venv/bin/pip install -q -r "$SKILL/requirements.txt"
PY=~/.cache/scanned-pdf-cleaner-venv/bin/python
Jeder Befehl unten wird ausgeführt als cd "$SKILL/scripts" && $PY <Skript> .... Verwenden Sie pro Dokument einen neuen, leeren Arbeitsordner außerhalb des Benutzerprojekts (einen Scratch- oder Temp-Ordner). Die Dateien des Benutzers werden nur gelesen.
Arbeitsablauf
1. Vorbereiten
$PY prepare.py INPUT.pdf WORK # oder: ein Ordner mit Bildern oder Bilddateien (HEIC: zuerst konvertieren)
Schreibt WORK/src/p-NNN.jpg (aufrechte Fotos), WORK/grid/g-NNN.jpg (jedes Foto mit einem roten Raster alle 100 px, auf allen vier Seiten mit Hundertern beschriftet) und WORK/rough.json mit einem Platzhalter-Umriss pro Foto.
Wenn ein Foto seitlich oder auf dem Kopf steht, drehen Sie es: $PY prepare.py --turn WORK p-003.jpg 90|180|270 (im Uhrzeigersinn).
2. Seiten-Ecken nachzeichnen (Sie)
Lesen Sie jedes Rasterbild. Finden Sie für jedes Foto die Seite, die zum Dokument gehört. Tragen Sie ihre vier Eckpunkte in WORK/rough.json in Quellpixeln ein, geordnet oben-links, oben-rechts, unten-rechts, unten-links der Seite, wie sie gelesen wird. Für Rasterbezeichnung 7 waagerecht und 12 senkrecht schreiben Sie [700, 1200].
{"001": {"src": "p-000.jpg", "quad": [[96,72],[930,92],[945,1468],[70,1480]]}}
- Schlüssel sind die Ausgabeseiten-Reihenfolge (
001,002, …). Halten Sie diese Reihenfolge an die Lesereihenfolge angepasst. - Nehmen Sie die Papierkante der Seite, nicht den Text. Nahe am Buchrücken nehmen Sie die Linie, an der die Seite in den Bund umknickt. Eine Seite, die aus dem Foto läuft, bekommt Ecken auf der Fotokante.
- Ein Foto einer Doppelseite ergibt zwei Einträge mit demselben
src, eine pro Seite, zum Beispiel"005"und"006". - Eine Genauigkeit von etwa 30 Pixeln ist ausreichend. Der nächste Schritt rastet auf die echte Kante ein.
3. Auf die Papierkante einrasten
$PY refine.py WORK
Schreibt WORK/quads.json und WORK/sheets/quads-NN.jpg: orange = Ihre Nachzeichnung, rot = eingerastet, grüner Punkt = oben-links. Lesen Sie die Bögen. Wenn eine rote Umrandung auf einen Schatten, den Tisch oder die Nachbarseite gesprungen ist, korrigieren Sie diese Nachzeichnung und führen Sie den Schritt erneut aus.
4. Glätten, Tonwert korrigieren und Kanten reinigen
$PY clean.py WORK # oder: clean.py WORK 004 007 um einige Seiten zu wiederholen
Für jede Seite wird:
- ihre Textzeilen und die Blocksatz-Spaltenränder gefunden;
- der Textblock ausgerichtet und eine einzige glatte Biegungsoberfläche an jede Zeile angepasst, sodass gekrümmte Zeilen gerade werden;
- Papier auf Weiß und Tinte auf Schwarz getont;
- dunkle Markierungen entfernt, die die Seitenkante berühren: Finger, Buchrückenkrümmung, Knitterfalten und schmale Nachbarseitenstreifen.
Seiten mit weniger als 5 Textzeilen, wie Titelseiten und ganzseitige Abbildungen, erhalten stattdessen eine einfache Vier-Ecken-Transformation. Ausgabe: WORK/pages/, WORK/blocks.json und WORK/sheets/review-NN.jpg, wobei rot = entfernt, blau = zur Entscheidung belassen und grün = Textblock.
Lesen Sie die Review-Bögen. Auf folgende Dinge achten:
- Zeilen immer noch gekrümmt oder die Seite schief: Die Nachzeichnung ist falsch. Korrigieren Sie
rough.json, wiederholen Sie dann refine und clean für diese Seite. - Text innerhalb des grünen Kastens in rot dargestellt: Teilen Sie dem Benutzer mit. Die Kantenreinigung entfernt niemals Text innerhalb des Blocks, es sei denn, er liegt auf dem Seitenrandband.
5. Markierungen außerhalb des Textes auflisten
$PY flags.py WORK
Schreibt WORK/flags/flags-N.jpg: nummerierte Kacheln aller dunklen Markierungen außerhalb des Textblocks.
6. Entscheiden: behalten oder entfernen (Sie)
Lesen Sie die Flag-Bögen und schreiben Sie WORK/decisions.json:
{"keep": [0, 3, 4, 7], "strokes_only": [23], "erase": [{"page": "014", "box": [1500, 300, 80, 900], "mode": "strokes"}]}
- keep: alles Gedruckte. Das umfasst Seitenzahlen, Kolumnentitel, Kapitelnummern, Bildunterschriften, Randbeschriftungen, Tabellenlinien, Abbildungen und Zeichnungen. Gedruckte Schrift ist scharf und regelmäßig. Zeichnungen im Buch sind ebenfalls Druck, selbst wenn es sich um kritzelige Kinderzeichnungen handelt.
- remove: Lassen Sie die Nummer weg. Das umfasst Handschrift, Stift- und Bleistiftnotizen, Verschmierungen, Spritzer, Fingerabdrücke, graue Balken und eingerissene Kantenschatten. Stiftlinien sind dünn, ungleichmäßig und oft schräg und passen nicht zur Schriftart.
- strokes_only: Gedruckte Buchstaben mit einem Stiftstrich durch oder daneben. Es werden nur Striche entfernt, die höher als 1,5 Zeilen sind.
- erase: Ein Kästchen in Seitenpixeln auf
pages/page-KEY.jpgfür Markierungen innerhalb des Textblocks, die Sie entfernen sollen."mode": "all"weißt das Kästchen aus;"strokes"entfernt nur hohe Striche.
Fragen Sie den Benutzer, bevor Sie entfernen, was er möglicherweise behalten möchte. Dies betrifft Stiftunterstreichungen und Notizen zwischen den Zeilen innerhalb des Textes sowie Textmarker. Standard: Randnotizen entfernen, Unterstreichungen innerhalb des Textes behalten. Fragen Sie auch, wenn Sie nicht zwischen Druck und Stift unterscheiden können. Zeigen Sie die Kachel, beschreiben Sie sie nicht.
7. Fertigstellen
$PY finish.py WORK OUT.pdf # --no-frame behält die eigene Rahmung jeder Seite; --dpi 300 standardmäßig
Was es tut:
- Weißt alles außerhalb des Textblocks aus, außer behaltenen Elementen.
- Entfernt hohe, dünne Stift-Klammern, die die Seiten des Blocks umschließen.
- Rahmt jede Seite auf eine einheitliche Seitengröße:
- Text erscheint in einheitlicher Größe: Fotos, die näher oder weiter weg aufgenommen wurden, passen zueinander. Die Skalierung verwendet die Breite des Textblocks oder den Zeilenabstand, wo eine Abbildung die Spalte verengt.
- Seitenränder sind gleich, sodass Inhalt, der an einer Kante saß oder durch die Buchdicke dezentriert wurde, zentriert wird.
- Jede Seite beginnt mit demselben oberen Rand.
Lesen Sie WORK/sheets/final-NN.jpg, bevor Sie übergeben. Überprüfen Sie jede Seite auf verbleibende Verschmierungen, abgeschnittenen Text und alles, was Sie versehentlich behalten haben. Übergeben Sie dem Benutzer dann den PDF-Pfad. Speichern Sie das PDF neben der Eingabe (z. B. <name>_clean.pdf), sofern der Benutzer nichts anderes sagt.
Wie ein gutes Ergebnis aussieht
- Textzeilen gerade und auf gleicher Höhe von Kante zu Kante, einschließlich der Zeile, die dem Buchrücken am nächsten ist.
- Papier reinweiß und Schrift solide schwarz, mit intakten dünnen Strichen. Große, dunkle Zeichnungen behalten ihre Füllung.
- Keine Finger, Schatten, schmale Nachbarseitenstreifen oder Spritzer. Seitenränder gleich und einheitliche Textgröße auf jeder Seite.
Anmerkungen aus der Praxis
- Der Begradiger liest Text, daher ist er bei Seiten, die voller Blocksatzzeilen sind, am besten. Er funktioniert für jede Schrift, einschließlich rechts-nach-links (Hebräisch, Arabisch), da er nur auf Zeilenformen achtet.
- Kurze Zeilen innerhalb von Zeichnungen (Beschriftungen) werden beim Anpassen der Biegung ignoriert, sodass Abbildungen die Seite nicht falten.
- Eine dunkle Zeichnung, die einen Großteil einer Seite ausfüllt, würde bei naiver Tonung zu Grau auswaschen.
tone()hält die Papierschätzung vom umgebenden Papier niedrig. - Wenn die Krümmung einer Seite ein paar Buchstaben am Buchrücken verschluckt, kann das Foto nichts wiederherstellen. Sagen Sie das und erfinden Sie keinen Text.
- Zweispaltige Papiere: Der Block umfasst beide Spalten. Überprüfen Sie den Review-Bogen auf über den Bund hinweg angepasste Zeilen.