" hinzu wenn TOC bei "2." beginnt
### 4. Dokumenttitel wird als h1 nachträglich eingefügt
- h1 mit 16pt (normal) oder h2 mit 12pt (wenn Sektion 1 = Inhaltsverzeichnis)
- Untertitel von Seite 1 als `` darunter
- **Kein Logo, keine Farben, keine Rahmen** — nur einfacher Text
### 5. Schriftgrößen auf 11pt normalisiert
- `normalize_font_sizes()` erzwingt bei TOC-Dokumenten 11pt für Fließtext (p, li, span, div)
- Tabellen-Elemente (td, th) und Überschriften (h1-h6) bleiben unverändert
- h1=16pt, h2=12pt, h3/h4=11pt, p/li=11pt, footer=8pt
### 6. Footer als festes 4-Spalten-Template
- **Immer 4 Spalten:** Freigabe | Bearbeiter | Änderungsstand | Datum
- Seitenzahlen-Spalte wird **immer entfernt** (auch wenn Original 5 Spalten hat)
- Font-Size: 8pt, border: none
- Header-Zeile: Hintergrundfarbe je nach Typ (#E6B8B7 für VA, #B8CCE4 für Standard)
### 7. Dokumenttyp-Farben erzwungen
- **Standard:** Tabellen-Header #B8CCE4 (blau), **VA:** #E6B8B7 (rosa)
- Datenzellen **kein** Hintergrund
- Auch bei leicht abweichenden Original-Farben wird die Vorlagenfarbe erzwungen
### 8. Hierarchische Einrückung (hängende Einzüge)
```
h2: margin-left:0, padding-left:10pt, text-indent:-10pt
h3: margin-left:10pt, padding-left:12pt, text-indent:-12pt
h4: margin-left:22pt, padding-left:14pt, text-indent:-14pt
Content nach h2: margin-left:10pt
Content nach h3: margin-left:22pt
Content nach h4: margin-left:36pt
```
### 9. Content-Normalisierung (immer aktiv)
- Excessive Margins (>30pt, ≥5%) entfernt
- `text-align: justify` → entfernt
- Bold `
` mit Sektionsnummern → h2/h3/h4
- Serif-Fonts → Arial, Font-Family auf alle Elemente
- Gebrochene Absätze zusammengeführt
- Em-Dash-Listen → disc bullets
- Seitenübergreifende Tabellen zusammengeführt
- `text-align: left` auf alle Elemente
---
## Andere Dokumente: 1:1 Konvertierung
Bei Dokumenten die NICHT VA oder Standard sind:
**ALLES muss 1:1 wie im Original aussehen:**
- Alle Hintergrundfarben exakt übernehmen (auch wenn nicht rosa/blau)
- Alle Rahmenlinien wie im Original
- Tabellenstrukturen exakt nachbilden
- Bilder und Grafiken einbinden
- Keine Vorlagen-Regeln anwenden!
```
Dokument hat grüne Header? → Grüne Header im HTML
Dokument hat graue Zellen? → Graue Zellen im HTML
Dokument hat keine Linien? → border: none im HTML
```
---
## Document Type Detection
### Standard Document
**Detection criteria:**
- Blue header backgrounds (#B8CCE4 or similar cool blue tones)
- Each section is a separate `
` with header row
- Content is in table cells, not free-flowing
### Verfahrensanweisung (VA)
**Detection criteria:**
- Rosa/salmon header backgrounds (#F2DCDB, #E6B8B7 or similar warm tones)
- Free-flowing `` headings (not in tables)
- Only one procedure table (Section 4: Verfahrensablauf)
### Other Documents
**Detection criteria:**
- No blue or rosa template colors
- No numbered section structure (1. 2. 3.)
- Any other document format
---
## Template Rules: Standard (Blue)
### Section Structure
Each section is a **separate `
`**:
```html
|
1. Ziel
|
|
Dieser Standard regelt...
|
```
### Steps Table (Durchführung) — MIT SPALTENBREITEN!
4-column table with colspan on header.
**Standard-Spaltenbreiten:** Nr=5%, Beschreibung=45%, Verantwortung=25%, Mittel=25% (Header colspan=50%)
```html
|
3. Durchführung/Ablauf
|
Verantwortung
|
Mittel
|
|
1
|
Schritt 1
|
MA
|
Arbeitsmittel, Kommunikation
|
```
---
## Template Rules: Verfahrensanweisung (Rosa)
### Section Structure
Sections use free-flowing `` headings (KEINE Tabellen!):
```html
1. Zweck der Verfahrensanweisung
Mit dieser Verfahrensanweisung werden die Zuständigkeiten...
```
### Procedure Table (Verfahrensablauf) — MIT SPALTENBREITEN!
Only the procedure table (Section 4) uses table format.
**VA-Spaltenbreiten:** Nr=5%, Aufgabe=45%, Verantwortung=25%, Mittel=25% (Header colspan=50%)
```html
4. Beschreibung des Verfahrensablaufs
|
Aufgabe
|
Verantwortung
|
Mittel
|
|
1
|
Task description
|
MA
|
Telefon
|
```
**KRITISCH:** Nr-Spalte hat GLEICHE Farbe wie Header (#E6B8B7), NICHT #F2DCDB!
### Abbreviations Table (OHNE Rahmenlinien, ZENTRIERT!)
VA/Standard Abkürzungstabellen haben KEINE sichtbaren Rahmenlinien und sind ZENTRIERT:
**KRITISCH: KEINE `width: 100%`! Zentrieren mit `margin: 10px auto;`!**
```html
3.3. Abkürzungen:
|
MA
|
Mitarbeiter
|
DP
|
Dienstplan
|
```
---
## Tabellen MIT vs. OHNE Rahmenlinien
**Tabelle MIT sichtbaren Rahmenlinien:**
```html
```
**Tabelle OHNE sichtbare Rahmenlinien:**
```html
|
```
---
## Font-Größen und Normalisierung
### Einheiten: Immer pt (nicht px!)
Alle Größenangaben in **pt** (Points), nicht px:
| Element | Größe |
|---------|-------|
| h1 (Dokumenttitel) | 14pt bold |
| h2 (Hauptsektionen) | 12pt bold |
| h3 (Untersektionen) | 11pt bold |
| **Fließtext (p, li)** | **11pt** |
| Tabellenzellen (td) | 11pt |
| **Footer-Tabelle** | **8pt** |
### Post-Processing: `normalize_font_sizes()`
Automatische Normalisierung nach der Gemini-Konvertierung:
- **Dokumente mit TOC** → Fließtext wird auf `11pt` normalisiert (Vorlagen-Standard)
- **Dokumente ohne TOC** → Erste verwendete Font-Größe wird als Baseline genommen
**Unberührt bleiben:**
- Tabellen (` | `, ` | `) — behalten ihre eigene Größe
- Headings (``-``) — behalten ihre eigene Größe
- Bold-Tags (``) — oft Überschriften, behalten ihre Größe
---
## Color Reference
### VA/Standard - NUR diese Farben!
| Dokument-Typ | Header | Nummerierungsspalte | Datenzellen |
|--------------|--------|---------------------|-------------|
| Standard | #B8CCE4 (blau) | #B8CCE4 (blau) | transparent |
| VA | #E6B8B7 (rosa dunkel) | #F2DCDB (rosa hell) | transparent |
### Farbunterscheidung
| Warm (Rosa/Lachs) | Cool (Blue) |
|-------------------|-------------|
| #F2DCDB | #B8CCE4 |
| #E6B8B7 | #D9E2F3 |
| #D99594 | - |
---
## Bild-Verarbeitung
### Waifu2x Upscaling
Alle extrahierten Bilder werden automatisch mit waifu2x-converter-cpp hochskaliert:
- **Skalierung:** 2x (doppelte Auflösung)
- **Noise Level:** 2 (mittlere Rauschunterdrückung)
- **Anzeige:** Bilder werden im HTML mit Originalgrößen-Attributen angezeigt (`width`/`height`)
```python
# Upscaling läuft automatisch nach Bildextraktion
image_orig_dimensions = upscale_images_in_dir(full_output, scale=2, noise=2)
```
### Bild-Benennungsschema
Format: `content_X_Y.png` wobei:
- **X** = Seitennummer (1-basiert)
- **Y** = Fortlaufende Position im Dokument
**Beispiele:**
- `content_1_1.png` = Seite 1, Position 1 (oft Logo - Vorsicht!)
- `content_2_2.png` = Seite 2, Position 2
- `content_6_5.png` = Seite 6, Position 5
**Duplikate (Bilder auf mehreren Seiten):**
- Wenn ein Bild auf mehreren Seiten vorkommt → `content_Y.png` (ohne Seite)
### Ganzseitige Bilder (Gescannte Dokumente)
Wenn eine Seite >90% von einem Bild bedeckt ist:
- **Erkennung:** `coverage_w > 0.90 AND coverage_h > 0.90`
- **Verhalten:** Seite wird NICHT an Gemini gesendet
- **Ausgabe:** Direktes ` ` Tag im HTML
```html
```
**Vorteile:**
- Keine API-Kosten für gescannte Seiten
- Schnellere Verarbeitung
- Originalqualität erhalten
- Kein OCR-Fehlerrisiko
### Logo-Filterung
Automatische Erkennung und Ausfilterung von Logos:
| Kriterium | Beschreibung |
|-----------|--------------|
| Header-Bereich | Top 12% der Seite (kleine Bilder) |
| Logo-artig | Top 20%, Höhe <60px, Ratio >2.0 |
| Logo-Dimensionen | Höhe <50px, Ratio >2.5 |
| Zu flach | Ratio >5.0 |
| Hash-Duplikate | Gleiches Bild auf mehreren Seiten |
**Ausnahme:** Große Bilder (>200x150) werden NIE als Logo gefiltert!
### Vektorgrafik-Extraktion
PyMuPDF `get_images()` extrahiert nur Rasterbilder. Für Vektorgrafiken:
**Erkennung:**
- Seite hat >10 drawings
- Keine Rasterbilder auf der Seite extrahiert
**Verarbeitung:**
1. Gruppiere drawings nach Y-Position (±50px = gleiche Gruppe)
2. Rendere jede Gruppe als separates Bild mit `zoom=1.0`
3. Validiere mit Gemini ob es echte Grafik ist (nicht nur Text/Linien)
```python
drawings = page.get_drawings()
if len(drawings) >= 10 and page_num not in pages_with_images:
# Rendere Vektorgrafik-Gruppen
```
---
## API Endpoints
### POST /convert
Main conversion endpoint.
```json
{
"input": "tmp/upload_xxx/document.docx",
"output_dir": "tmp/upload_xxx",
"template_mode": "auto"
}
```
**template_mode Options:**
| Mode | Beschreibung |
|------|-------------|
| `"auto"` | **(Default)** Automatische Erkennung. Wendet Standard/VA Vorlagen-Regeln an wenn erkannt. |
| `"standard"` | Erzwingt Standard-Vorlage (blaue Header #B8CCE4). |
| `"va"` | Erzwingt Verfahrensanweisung-Vorlage (rosa Header #E6B8B7). |
| `"exact"` | **1:1 Konvertierung** — KEINE Vorlagen-Anpassung! Alle Farben/Strukturen exakt wie im Original. |
**Wann welcher Modus?**
- `auto`: Standard für normale Dokumente die einer Vorlage folgen
- `standard`/`va`: Erzwingen wenn das Dokument einer Vorlage folgen SOLL aber nicht erkannt wird
- `exact`: Für **Import/Re-Check** wenn das Dokument EXAKT wie das Original aussehen soll
**Response:**
```json
{
"success": true,
"template_mode": "exact",
"files": { "content": "content.html", "toc": "toc.html", ... }
}
```
### POST /analyze-html
Quality analysis of generated HTML.
### GET /health
Service health check.
---
## Troubleshooting
### Issue: Falsche Farben verwendet
**Ursache:** VA/Standard Template nicht erkannt oder falsche Farben generiert.
**Lösung:** Prüfen ob Dokument rosa (VA) oder blau (Standard) Header hat. Nur Vorlagen-Farben verwenden!
### Issue: Alle Datenzellen haben Hintergrundfarbe
**Ursache:** Farbregeln nicht befolgt.
**Lösung:** NUR Header-Zeile und Nummerierungsspalte bekommen Hintergrundfarbe!
### Issue: Logo/Bilder aus Header extrahiert
**Ursache:** Header-Behandlung falsch.
**Lösung:** Aus Header NUR Dokumenttitel extrahieren, KEINE Bilder!
### Issue: Abkürzungstabelle hat Rahmenlinien
**Ursache:** Tabellentyp nicht erkannt.
**Lösung:** Abkürzungstabellen: `border="0"` und `border: none;`
### Issue: Footer-Datenzellen haben Hintergrundfarbe
**Ursache:** Footer-Styling falsch.
**Lösung:** Footer-Tabelle: NUR Header-Zeile mit Hintergrundfarbe!
### Issue: Bilder werden nicht angezeigt (broken image icon)
**Ursache:** HTML referenziert `content_N.png` mit relativem Pfad.
**Lösung:** Der doc-converter bettet Bilder automatisch als base64 Data-URI ein:
```html
```
Wenn Bilder trotzdem fehlen: Prüfen ob `extract_pdf_images()` die Bilder korrekt extrahiert.
### Issue: h3-Überschriften fehlen im TOC
**Ursache:** TOC enthält nur h2-Level.
**Lösung:** Alle h3 (3.1, 3.2, 3.3 etc.) müssen im TOC erscheinen mit `margin-left: 20px;`
### Issue: Gescannte Seiten werden konvertiert
**Ursache:** Fullpage-Image-Erkennung nicht aktiv.
**Lösung:** Prüfen ob `fullpage_image_pages` korrekt zurückgegeben wird. Bilder >90% coverage sollten als ganzseitig erkannt werden.
### Issue: Bilder haben unterschiedliche Qualität
**Ursache:** Verschiedene Extraktionsmethoden.
**Lösung:** Alle Bilder werden jetzt einheitlich mit `zoom=1.0` gerendert und dann mit waifu2x 2x hochskaliert.
### Issue: Kleine Icons/Elemente auf gescannten Seiten
**Ursache:** Zusätzliche kleine Bilder auf einer fullpage-Seite werden auch angezeigt.
**Lösung:** Das ist erwartetes Verhalten. Das große ganzseitige Bild und eventuelle kleine Elemente werden beide angezeigt.
---
## Jodit Editor Compatibility
**REQUIRED for Jodit:**
- All styles as inline `style="..."` attributes
- No ` | |