fix: Ueberschriften-Erkennung, Bild-Referenzierung und Symbol-Qualitaet

Behebt mehrere Extraktionsprobleme in lib/pdf_extract.py, die zu doppelter
Nummerierung, sinnentleertem Text und falsch dimensionierten Symbolen fuehrten:

- Ueberschriften nur noch bei grosser/fetter Quellschrift (>= 12.5pt oder bold)
  statt bei jeder Zeile mit Nummern-Praefix. Vorher wurden hunderte normale
  Textzeilen (Querverweise, Aufzaehlungen) faelschlich zu Ueberschriften.
- Bildunterschriften ("Abbildung N: ...") werden nie mehr als Ueberschrift
  gerendert (Caption-Erkennung vor Heading-Check, Merge-Regel verschaerft),
  sondern als kursiver Absatz bzw. figure-Caption.
- Symbole (Warn-/Gebots-/Verbotspiktogramme) werden per Piktogramm-Heuristik
  (Signalfarben + wenige Flaechenfarben) erkannt statt nur ueber Haeufigkeit -
  findet auch Symbole, die im Dokument nur 1x vorkommen (z.B. Warndreiecke).
  Auf quadratische Canvas normalisiert (normalize_symbol) und einheitlich
  klein referenziert (:height: 10mm, :align: left), damit alle Symbole
  unabhaengig vom Seitenverhaeltnis der Quelle gleich gross erscheinen.
- Junk-Erkennung erweitert: gerenderte Kapitelnummern-Bilder, Barcodes und
  Foto-Ausschnitte werden nicht mehr als Symbol/Inhaltsbild extrahiert.
- Manuelle SYMBOL_BLOCKLIST (aHash-basiert) fuer sichtgepruefte Fehlklassi-
  fikationen (Foto-/3D-/Diagramm-Fragmente), damit sie bei erneuter
  Konvertierung nicht wieder auftauchen.
- Verzeichnislisten (Lieferantendoku etc.) werden im LaTeX-Build quer
  (landscape via pdflscape) gesetzt, da die langen Quellpfade in Hochformat
  nicht passten.

assets/shared/symbols/: auf normalisierte .png umgestellt, 7 Fehlklassi-
fikationen (Fotos/3D-Renderings/Diagramme statt Piktogramme) entfernt.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Michael Stangl
2026-09-23 15:23:29 +02:00
co-authored by Claude Sonnet 5
parent 3ebfe06139
commit 982879d9f0
22 changed files with 217 additions and 21 deletions
+12 -1
View File
@@ -245,9 +245,16 @@ def generate_index(chapter: str, items: list[dict], source_root: Path,
lines.append(" Die referenzierten Dokumente liegen im Projekt-Rohmaterial und werden")
lines.append(" hier nicht dupliziert.")
lines.append("")
# Die Verzeichnistabelle enthaelt lange Quellpfade und ist fuer Hochformat zu
# breit -> im LaTeX/PDF-Build quer (landscape) setzen. Fuer HTML wird der
# raw:latex-Block ignoriert (dort bricht die Tabelle ohnehin um).
lines.append(".. raw:: latex")
lines.append("")
lines.append(" \\begin{landscape}")
lines.append("")
lines.append(".. list-table::")
lines.append(" :header-rows: 1")
lines.append(" :widths: 34 18 12 36")
lines.append(" :widths: 30 16 8 46")
lines.append("")
lines.append(" * - Dokument")
lines.append(" - Kategorie")
@@ -260,6 +267,10 @@ def generate_index(chapter: str, items: list[dict], source_root: Path,
lines.append(f" - {human_size(it['size_bytes'])}")
lines.append(f" - ``{it['rel_path']}``")
lines.append("")
lines.append(".. raw:: latex")
lines.append("")
lines.append(" \\end{landscape}")
lines.append("")
rst_path.write_text("\n".join(lines), encoding="utf-8")