pdf2md/CLAUDE.md

37 lines
2.5 KiB
Markdown
Raw Normal View History

# CLAUDE.md
PDF → Markdown → EPUB für den PocketBook-Reader (digitale und gescannte PDFs).
Aktuelles Programm: `pdf2md.py` (Einzeldatei; Name bleibt fest, keine Versionsnummer im Dateinamen). Frühere Stände (v1–v4) nur noch in der Git-Historie.
## Befehle
- Tests: `python3 -m pytest` (ca. 80 s; Fixtures werden synthetisch erzeugt; OCR braucht `tesseract-ocr-deu`)
- Lint: `python3 -m ruff check pdf2md.py tests/`
- Echttest: `python3 pdf2md.py --epub Operation_Ljutsch_Band_1_-_Reinhard_Otto_Kranz.pdf <scratch>/band1.md`
## Konventionen
- Hilfetexte, Meldungen, Kommentare und Docstrings auf Deutsch (wie v4); Bezeichner Englisch.
- 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.
- `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
die Zeilengeometrie zu merken). Nach einem pymupdf4llm-Update prüfen, ob
`tests/test_normalize.py::test_pymupdf4llm_patch_keeps_compound_hyphen` und
`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
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.
- 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`),
weil `---`-Zeilen im Buchtext sonst als YAML gelesen würden.
- Regressionsprüfung bei Änderungen am Umbruch: Probekorpus (Band 1/2, Zensur-Report, Markdown
Guide, Register, Rust-Kochbuch, Kempis-Scan) gegen den letzten Commit diffen; Fließtext darf
sich nur an echten Absatz- oder Zeilenwechseln der PDF ändern.