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:
parent
8614ea9575
commit
182bb27c53
2 changed files with 16 additions and 7 deletions
16
CLAUDE.md
16
CLAUDE.md
|
|
@ -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.
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue