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
```
**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 | - |
---
## Seitenbild-Cropping (Header/Footer-Entfernung)
### Gemini-basierte Crop-Erkennung (Phase 1)
Phase 1 sendet Pre-Content + **3 Content-Seiten** an Gemini. Der RECOGNITION_PROMPT instruiert:
- "Vergleiche die Seiten. Alles was sich auf mind. 2 Seiten am oberen/unteren Rand wiederholt = Header/Footer"
- Seitenzahlen zählen auch dazu (Position gleich, nur Zahl ändert sich)
- `header_bottom_percent` und `footer_top_percent` sind **physische Crop-Grenzen**
- Beispiel: Footer-Trennlinie bei 88%, Text 89-91%, Balken 91-92% → `footer_top_percent = 87.5`
### crop_page_images() — Physisches Cropping
Nach Phase 1 werden ALLE Seitenbilder physisch gecroppt:
```python
crop_page_images(page_images, header_bottom_pct, footer_top_pct, margin_px=5)
```
- Header/Footer werden abgeschnitten bevor Gemini die Bilder in Phase 2b sieht
- Gemini kann NICHT durch Header/Footer verwirrt werden
- Prompts enthalten KEINE "IGNORIEREN!"-Sektionen mehr
- Stattdessen: "Die Seitenbilder zeigen NUR den Content-Bereich. Konvertiere ALLES."
- Original-Bilder bleiben für visuelle Verifikation erhalten
### Vorteile des Croppings
1. **Keine Header/Footer-Artefakte möglich** (Gemini sieht sie nie)
2. **Kürzere Prompts** (keine "KOPFZEILE IGNORIEREN" Sektionen)
3. **Keine Header/Footer-Referenzbilder** → weniger Tokens → günstiger
4. **Tabellenfortsetzung einfacher** (Content reicht bis unterer Rand = Tabelle geht weiter)
5. **Weniger Post-Processing** nötig
---
## 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 ` | |