pdf2md/CLAUDE.md
Dieter Schlüter 5cd5e5d69b --split seiten, --epub-per-file, Nachspann, --from-md --split, --split-chars
- --split seiten mit --pages-per-file N (Standard 20, Ausrichtung an
  Überschriften bis eine Seite neben der Grenze) oder --page-ranges
  (streng; Seiten außerhalb werden eigene Dateien)
- Schnitt nur im fertigen Gesamt-Markdown (lückenlos): vor dem ersten
  Absatz, der auf der Grenzseite beginnt; Überschriften vor dem Schnitt
  wandern in die neue Datei; source_pages aus Anfang/Ende jedes Absatzes
- Seitenzuordnung über die Rohtexte je Seite (pymupdf4llm page_chunks=True,
  aneinandergehängt byte-gleich; Band 1/2 unverändert), auch für OCR-Seiten
- --epub-per-file: ein EPUB je Einzeldatei in <name>/epub/
- Nachspann: Anhang/Autor/Impressum nach dem letzten Kapitel als eigene Datei
- --from-md DATEI --split teile|kapitel: bearbeitetes Markdown nachträglich
  teilen, Bild- und Cover-Pfade angepasst
- --split-chars N; Längen-Abschnitte tragen die Überschrift am Anfang als Titel
- Tests (tests/test_split_pages.py), README, Bedienungsanleitung, CLAUDE.md, TODO

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-03 01:04:50 +02:00

2.7 KiB
Raw Blame 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).
  • convert_pages ruft pymupdf4llm mit page_chunks=True auf und hängt die Seitentexte aneinander (in 1.28.2 byte-gleich mit page_chunks=False); die Rohtexte je Seite braucht --split seiten (block_pages) zur Seitenzuordnung.
  • 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.