pdf2md.py wandelt eine PDF-Datei in eine oder kapitelweise mehrere MD-Dateien um (zur Weiterverarbeitung, z. B. HTML oder für RAG) und kann daraus komplette EPUB-Dateien für den Pocketbook-Reader (und andere Reader) erzeugen.
- Python 100%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
|
|
||
| Info | ||
| tests | ||
| .gitignore | ||
| BEDIENUNGSANLEITUNG.md | ||
| CLAUDE.md | ||
| ljutsch_meta.xml | ||
| pdf2md_v1.py | ||
| pdf2md_v2.py | ||
| pdf2md_v3.py | ||
| pdf2md_v4.py | ||
| pdf2md_v5.py | ||
| pytest.ini | ||
| README.md | ||
| requirements.txt | ||
| TODO.md | ||
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)
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
Ausführliche Schritt-für-Schritt-Anleitung, auch für den Weg „Markdown von Hand bearbeiten, dann EPUB“: BEDIENUNGSANLEITUNG.md.
# 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-|Geheimdienstbleibt mit Bindestrich,Arbeits- undbleibt. - Ü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
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.pyper 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 Versionpdf2md_v1.py…pdf2md_v4.py– frühere Entwicklungsstände (sieheInfo/)Info/– Recherche und Entstehungsgeschichte der Skriptetests/– pytest-Suite