# 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` (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 /band1.md` ## Konventionen - Hilfetexte, Meldungen, Kommentare und Docstrings auf Deutsch (wie v4); Bezeichner Englisch. - Echttests nie nach `Fertig/` schreiben (dort liegen die Ergebnisse des Nutzers). - 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. - 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: Band 1/2 vorher/nachher diffen; Fließtext darf sich nur an echten Absatz- oder Zeilenwechseln der PDF ändern.