Doku: Testdauer, erprobte Gedichtbände, CLAUDE.md (OCR-Weg, pymupdf4llm 1.28, Output/)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Dieter Schlüter 2026-10-02 22:42:37 +02:00
commit 182bb27c53
2 changed files with 16 additions and 7 deletions

View file

@ -5,25 +5,33 @@ Aktuelles Programm: `pdf2md.py` (Einzeldatei; Name bleibt fest, keine Versionsnu
## Befehle ## Befehle
- Tests: `python3 -m pytest` (Fixtures werden synthetisch erzeugt; OCR braucht `tesseract-ocr-deu`) - Tests: `python3 -m pytest` (ca. 80 s; Fixtures werden synthetisch erzeugt; OCR braucht `tesseract-ocr-deu`)
- Lint: `python3 -m ruff check pdf2md.py tests/` - Lint: `python3 -m ruff check pdf2md.py tests/`
- Echttest: `python3 pdf2md.py --epub Operation_Ljutsch_Band_1_-_Reinhard_Otto_Kranz.pdf <scratch>/band1.md` - Echttest: `python3 pdf2md.py --epub Operation_Ljutsch_Band_1_-_Reinhard_Otto_Kranz.pdf <scratch>/band1.md`
## Konventionen ## Konventionen
- Hilfetexte, Meldungen, Kommentare und Docstrings auf Deutsch (wie v4); Bezeichner Englisch. - Hilfetexte, Meldungen, Kommentare und Docstrings auf Deutsch (wie v4); Bezeichner Englisch.
- Echttests nie nach `Fertig/` schreiben (dort liegen die Ergebnisse des Nutzers). - Echttests ins Scratchpad schreiben, nicht nach `Output/` oder `Fertig/` (dort liegen die
Ergebnisse des Nutzers); Probeergebnisse zum Ansehen nur auf Wunsch nach `Output/Probe/`.
- PDFs/EPUBs/Bilder sind per `.gitignore` ausgeschlossen – keine Binärdateien committen. - PDFs/EPUBs/Bilder sind per `.gitignore` ausgeschlossen – keine Binärdateien committen.
- `pdf2md.py` patcht drei Funktionen in `pymupdf4llm.helpers.document_layout` - `pdf2md.py` patcht drei Funktionen in `pymupdf4llm.helpers.document_layout`
(`get_styled_text`, `text_to_md`, `create_list_item_levels` – letztere nur, um pro Seite (`get_styled_text`, `text_to_md`, `create_list_item_levels` – letztere nur, um pro Seite
die Zeilengeometrie zu merken). Nach einem pymupdf4llm-Update prüfen, ob die Zeilengeometrie zu merken). Nach einem pymupdf4llm-Update prüfen, ob
`tests/test_normalize.py::test_pymupdf4llm_patch_keeps_compound_hyphen` und `tests/test_normalize.py::test_pymupdf4llm_patch_keeps_compound_hyphen` und
`tests/test_verbatim.py` noch grün sind. `tests/test_verbatim.py` noch grün sind.
- Mit pymupdf4llm 1.28.2 getestet (Bildtext-Format `<!-- Start of picture text -->`, OCR-Text
wird über unsichtbaren Text erkannt, nicht über `full_ocred`).
- OCR (`convert_pages`, Lauf `RUN_OCR`): vorhandene unsichtbare Textebenen werden vorher in einer
Kopie entfernt (`drop_invisible_text`), sonst behält pymupdf4llm fremde OCR-Ebenen.
Mit `--keep-lines` werden Scanseiten an pymupdf4llm vorbei direkt aus Tesseract gelesen
(`ocr_lines_md`); Gedichttitel kommen dort aus der PDF-Gliederung.
- Zwischen dem Patch (`lines_to_md`) und `normalize_markdown` laufen interne Markierungen - Zwischen dem Patch (`lines_to_md`) und `normalize_markdown` laufen interne Markierungen
aus dem Private-Use-Bereich (`HARD_BREAK`, `BLOCK_END`, `PARAGRAPH_END`, `STANZA_BREAK`, aus dem Private-Use-Bereich (`HARD_BREAK`, `BLOCK_END`, `PARAGRAPH_END`, `STANZA_BREAK`,
U+E002–U+E005); sie dürfen nie in der Ausgabe landen. U+E002–U+E005); sie dürfen nie in der Ausgabe landen.
- Ausgabe-Markdown beginnt mit einem YAML-Kopf, den `make_frontmatter`/`split_frontmatter` - Ausgabe-Markdown beginnt mit einem YAML-Kopf, den `make_frontmatter`/`split_frontmatter`
selbst schreiben und lesen; pandoc bekommt nur den Text (`markdown-yaml_metadata_block`), selbst schreiben und lesen; pandoc bekommt nur den Text (`markdown-yaml_metadata_block`),
weil `---`-Zeilen im Buchtext sonst als YAML gelesen würden. weil `---`-Zeilen im Buchtext sonst als YAML gelesen würden.
- Regressionsprüfung bei Änderungen am Umbruch: Band 1/2 vorher/nachher diffen; Fließtext - Regressionsprüfung bei Änderungen am Umbruch: Probekorpus (Band 1/2, Zensur-Report, Markdown
darf sich nur an echten Absatz- oder Zeilenwechseln der PDF ändern. Guide, Register, Rust-Kochbuch, Kempis-Scan) gegen den letzten Commit diffen; Fließtext darf
sich nur an echten Absatz- oder Zeilenwechseln der PDF ändern.

View file

@ -6,8 +6,9 @@ für **digitale** PDFs (Textebene vorhanden) ebenso wie für **gescannte** PDFs
per OCR) und für Scans, die bereits eine OCR-Ebene haben (z. B. von `ocrmypdf`). per OCR) und für Scans, die bereits eine OCR-Ebene haben (z. B. von `ocrmypdf`).
Entwickelt an *Operation Ljutsch* (Band 1 und 2), außerdem erprobt an einem deutschen Entwickelt an *Operation Ljutsch* (Band 1 und 2), außerdem erprobt an einem deutschen
Sachbuch, einem englischen Handbuch, einem Mathematikbuch, einem Bericht mit Fußnoten und Sachbuch, einem englischen Handbuch, einem Mathematikbuch, einem Bericht mit Fußnoten, einem
einem englischen Scan von 1893 (Ergebnisse siehe [Grenzen](#grenzen)). englischen Scan von 1893 und zwei gescannten Gedichtbänden (Rilke in Antiqua, Löwenberg 1895
in Fraktur; Ergebnisse siehe [Grenzen](#grenzen)).
## Installation (Ubuntu 24.04) ## Installation (Ubuntu 24.04)
@ -115,7 +116,7 @@ python3 pdf2md.py --epub --ocr-language eng --ocr always scan.pdf scan.md # EP
## Tests ## Tests
```bash ```bash
python3 -m pytest # ca. 45 s; OCR-/EPUB-Tests werden ohne Tesseract/pandoc übersprungen python3 -m pytest # ca. 80 s; OCR-/EPUB-Tests werden ohne Tesseract/pandoc übersprungen
``` ```
Die Test-PDFs (digital, gescannt, mit OCR-Ebene, gemischt, Fotoseite) werden zur Laufzeit Die Test-PDFs (digital, gescannt, mit OCR-Ebene, gemischt, Fotoseite) werden zur Laufzeit