79 lines
3.6 KiB
Markdown
79 lines
3.6 KiB
Markdown
# ljutsch – PDF → Markdown → EPUB
|
||
|
||
Werkzeug, um PDF-Bücher (hier: *Operation Ljutsch*, Band 1 und 2) in sauberes Markdown
|
||
und anschließend in ein EPUB für den PocketBook-Reader umzuwandeln – mit Überschriften,
|
||
Bildern und echten Absätzen. Funktioniert für **digitale** PDFs (Textebene vorhanden)
|
||
ebenso wie für **gescannte** PDFs (nur Bilder, per OCR) und für Scans, die bereits eine
|
||
OCR-Ebene haben (z. B. von `ocrmypdf`).
|
||
|
||
## Installation (Ubuntu 24.04)
|
||
|
||
```bash
|
||
sudo apt install tesseract-ocr tesseract-ocr-deu pandoc
|
||
pip install -r requirements.txt # pymupdf4llm, pymupdf-layout, pytest
|
||
```
|
||
|
||
`tesseract-ocr` wird nur für Scans gebraucht, `pandoc` nur für `--epub`.
|
||
|
||
## Verwendung
|
||
|
||
```bash
|
||
# digitales oder gescanntes PDF -> Markdown (OCR wird automatisch entschieden)
|
||
python3 pdf2md_v5.py buch.pdf buch.md
|
||
|
||
# zusätzlich Bilder und EPUB (Titel/Autor aus den PDF-Metadaten, Seite 1 als Cover)
|
||
python3 pdf2md_v5.py --epub buch.pdf buch.md
|
||
|
||
# Scan in Deutsch und Englisch, 8 parallele OCR-Prozesse
|
||
python3 pdf2md_v5.py --ocr-language deu+eng --jobs 8 scan.pdf scan.md
|
||
```
|
||
|
||
| Option | Bedeutung |
|
||
| :-- | :-- |
|
||
| `--ocr auto` (Standard) | Scanseiten per OCR lesen; vorhandene, gerade OCR-Ebenen übernehmen, schiefe neu erkennen; reine Bildseiten in digitalen PDFs (Fotos, Cover) nur nach erfolgreicher Probe-OCR |
|
||
| `--ocr always` / `--ocr never` (`--no-ocr`) | alle Seiten neu erkennen / keine OCR |
|
||
| `--ocr-language`, `--ocr-dpi` | Tesseract-Sprache(n) (`deu`), Auflösung (300) |
|
||
| `--jobs N` | parallele OCR-Prozesse (Standard 4); reine Textdokumente laufen immer sequenziell |
|
||
| `--images` | Grafiken in `<name>_images/` speichern und verlinken |
|
||
| `--image-format jpg\|png` | Bildformat (Standard jpg; png verlustfrei, aber ca. 3× größer) |
|
||
| `--epub`, `--epub-file PFAD` | EPUB 3 mit pandoc erzeugen (schaltet `--images` ein) |
|
||
| `--lang` | Sprache im EPUB (`de`) |
|
||
| `--keep-headers`, `--keep-footers` | Kolumnentitel bzw. Seitenzahlen nicht entfernen |
|
||
|
||
## Was die Nachbearbeitung macht
|
||
|
||
- **Absätze:** Zeilen werden verbunden; eine Absatzgrenze gilt nur nach Satzende
|
||
(`.` `!` `?` `…`, auch mit `«` `“` `»` usw. dahinter). Auf Scans werden Absätze am
|
||
Einzug erkannt.
|
||
- **Silbentrennung:** `Geheim-|dienst` → `Geheimdienst`, `Militär-|Geheimdienst` bleibt mit
|
||
Bindestrich, `Arbeits- und` bleibt.
|
||
- **Überschriften:** Ebenen aus den PDF-Lesezeichen (Teile `##`, Kapitel `###`);
|
||
Satzreste, die fälschlich als Überschrift erkannt wurden, kommen zurück in den Text.
|
||
- **Inhaltsverzeichnis:** zusammengeklebte Einträge werden getrennt.
|
||
- **Seitenzahlen, Kolumnentitel, Text in Fotos** werden entfernt.
|
||
|
||
## Tests
|
||
|
||
```bash
|
||
python3 -m pytest # ca. 30 s; OCR-/EPUB-Tests werden ohne Tesseract/pandoc übersprungen
|
||
```
|
||
|
||
Die Test-PDFs (digital, gescannt, mit OCR-Ebene, gemischt, Fotoseite) werden zur Laufzeit
|
||
synthetisch erzeugt.
|
||
|
||
## Grenzen
|
||
|
||
- Die Ergebnisqualität hängt von pymupdf4llm/pymupdf-layout ab. Zwei Schwächen der
|
||
Bibliothek gleicht `pdf2md_v5.py` per Patch aus (Bindestriche am Zeilenende, Absätze in
|
||
Scan-Blöcken). Eine weitere ist bekannt: Bei Schriften mit Ligaturen (ff, fi) mit
|
||
übergroßer Glyphenbox kann pymupdf4llm einzelne Zeilen verlieren. Bei den Ljutsch-Bänden
|
||
tritt das nicht auf (geprüft per Wortabgleich PDF ↔ Markdown).
|
||
- OCR-Fehler (z. B. fehlende Leerzeichen) werden nicht korrigiert.
|
||
- Bilder werden als JPEG (Qualität 95) gespeichert; EPUB Band 1 ca. 5 MB.
|
||
|
||
## Dateien
|
||
|
||
- `pdf2md_v5.py` – aktuelle Version
|
||
- `pdf2md_v1.py` … `pdf2md_v4.py` – frühere Entwicklungsstände (siehe `Info/`)
|
||
- `Info/` – Recherche und Entstehungsgeschichte der Skripte
|
||
- `tests/` – pytest-Suite
|