fix: saubere PDF-Extraktion der Fortna-Anleitungen (lib/pdf_extract.py)

Neues Modul lib/pdf_extract.py fuer die Volltext-Konvertierung der 5
Hauptanleitungen, behebt die Qualitaetsprobleme der ersten Version:

- Doppelte Nummerierung entfernt: PDF-Gliederungsnummer wird nur fuer die
  Ueberschriften-Ebene ausgewertet, im RST-Text weggelassen (Sphinx nummeriert)
- Bilder positionsbasiert (bbox) extrahiert und als .. figure:: mit Caption
  an der richtigen Textstelle referenziert (625 Refs, 0 fehlende Bilder)
- Fliesstext zu Absaetzen zusammengefuehrt statt je PDF-Zeile ein Absatz
- Aufzaehlungen als RST-Listen (Bullet-only-Zeilen mit Folgezeile gemergt,
  zusammengelaufene Bullets aufgesplittet)
- Aenderungshistorie-/Dokumentinfo-Tabellen und TOC-Seiten uebersprungen
- Symbolfont-Zeichen (PUA) auf Unicode gemappt

fortna_convert_chapters.py: nutzt pdf_extract statt extract_products, lesbare
Dokumenttitel je Kapitel, Verzeichnislisten fuellen Kapitel ohne DE-Quelle mit
vorhandenen Fremdsprachen (Ersatzteilliste EN).
build_index.py / conf.py: Fremd-Altdateien aus dem Build ausgeschlossen.
Alte Test-.rst aus fruehen convert_to_rst.py-Laeufen entfernt.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Michael Stangl
2026-09-23 13:44:09 +02:00
co-authored by Claude Opus 4.8
parent e7aa3b4e4b
commit c912b1e9d5
5 changed files with 372 additions and 14 deletions
+30 -2
View File
@@ -33,11 +33,39 @@ Ergebnis des ersten Laufs:
(polyglossia 2.13 wirft unter lualatex einen bidi-Fehler), **`iconpackage=none`**
(FontAwesome7 in MiKTeX bricht unter lualatex ab). Beides in `conf.py` kommentiert.
### Extraktion: neues Modul `lib/pdf_extract.py`
Die Volltext-Konvertierung der 5 Hauptanleitungen läuft über das neue Modul
`lib/pdf_extract.py` (`extract_manual()`), das gegenüber der ersten Version deutlich
sauberere `.rst` erzeugt:
- **Keine doppelte Nummerierung mehr:** Die im PDF vorhandene Gliederungsnummer
(z. B. „1.7 Wichtige Informationen") wird nur zur Bestimmung der Überschriften-Ebene
ausgewertet und im RST-Text **entfernt**. Sphinx/LaTeX nummeriert selbst → vorher
„3.2.1 1.1 Wichtige Informationen", jetzt nur noch „3.2.1 Wichtige Informationen".
- **Überschriften-Erkennung** nur bei führender PDF-Gliederungsnummer (kein „fett allein"),
damit Tabellenzellen nicht fälschlich zu Überschriften werden.
- **Bilder positionsbasiert extrahiert und referenziert:** pro Seite werden Text und Bilder
nach Y-Position verwoben; jedes Bild wird als `.. figure::` mit korrektem Pfad und – falls
vorhanden – der folgenden „Abbildung N: …"-Zeile als Caption eingebaut. (625 figure-Refs,
0 fehlende Bilddateien.) Duplikate werden per MD5 entfernt, Titelseiten-Deko und
Vollseiten-Hintergründe herausgefiltert.
- **Fließtext zu Absätzen zusammengeführt:** PDF-Zeilenumbrüche werden nicht mehr zu je einem
Absatz; zusammenhängende Zeilen bilden einen Absatz, Satzende beendet ihn.
- **Aufzählungen als RST-Listen:** einzeln stehende Bullet-Zeichen werden mit der Folgezeile
zusammengeführt, in eine Zeile zusammengelaufene Bullets aufgesplittet → `-`-Listenpunkte.
- **Änderungshistorie-/Dokumentinfo-Tabellen** am Dokumentanfang werden übersprungen (zerfielen
vorher in sinnlose Einzelzellen), ebenso Inhaltsverzeichnis-Seiten und Kopf-/Fußzeilen.
### Behobene Extraktionsprobleme
- **Symbolfont-Zeichen** (Wingdings/Symbol Private-Use-Area, z. B. Aufzählungs-Bullet U+F0B7):
in `extract_products.py` via `clean_pua()` auf echte Unicode-Zeichen (•, →, ✓) gemappt,
restliche PUA-Zeichen entfernt. Vorher erschienen leere Kästchen im PDF.
via `clean_pua()` auf echte Unicode-Zeichen (•, →, ✓) gemappt, restliche PUA-Zeichen entfernt.
Vorher erschienen leere Kästchen im PDF. (In `lib/pdf_extract.py`; die Variante in
`extract_products.py` bleibt für die Produktprogramm-Extraktion bestehen.)
- **Fremd-Altdateien** aus früheren `convert_to_rst.py`-Testläufen (NORD-Getriebe/-Motor im
Anhang, alte Risikobewertung/Contents/Konfig/Ersatzteile-Volltexte) wurden entfernt; die
betroffenen Kapitel liegen konzeptkonform als Verzeichnisliste vor.
### Bekannte Restpunkte (nicht Teil des Auftrags-Scopes)