Files
claude-plugins/doc-converter/skills/doc-converter-expert/SKILL.md
T
root d4cbf9b6ce Initial marketplace: n8n-skills + doc-converter plugins
Marketplace with 2 plugins:
- n8n-skills v1.0.0 (7 skills for n8n workflow automation)
- doc-converter v1.0.0 (DOCX/PDF to HTML via Gemini Vision)
2026-02-10 19:47:49 +00:00

30 KiB

name, description
name description
doc-converter-expert Expert guidance for DOCX/PDF to HTML conversion using the doc-converter service. Use when converting documents, diagnosing conversion issues, understanding layout templates (Vorlagen), or working with the Gemini Vision API for document analysis.

Document Converter Expert

Expert guidance for converting DOCX/PDF documents to Jodit-compatible HTML using the doc-converter service.


Overview

The doc-converter service uses Gemini Vision to analyze document images and generate HTML that matches the visual layout. Documents are classified into three types:

Type Detection Approach
Standard Blue headers (#B8CCE4), table-based sections Follow Standard template rules - NUR Vorlagen-Farben!
Verfahrensanweisung (VA) Rosa headers (#E6B8B7/#F2DCDB), h2-based with procedure table Follow VA template rules - NUR Vorlagen-Farben!
Other No template match 1:1 EXAKT wie im Dokument - alle Farben/Strukturen übernehmen

KRITISCHE REGELN für VA und Standard

Erlaubte Farben - NUR DIESE!

Standard (Blau):

Element Farbe Hex
Header-Zeile Blau #B8CCE4
Nummerierungsspalte Blau (gleich wie Header!) #B8CCE4
Datenzellen Weiß/transparent -

Verfahrensanweisung (Rosa):

Element Farbe Hex
Header-Zeile Rosa #E6B8B7
Nummerierungsspalte Rosa (IDENTISCH wie Header!) #E6B8B7
Datenzellen Weiß/transparent -

KRITISCH: Header und Nummerierungsspalte MÜSSEN denselben Hex-Code haben!

VERBOTEN bei VA/Standard Verfahrenstabellen:

  • Unterschiedliche Farben zwischen Header und Nummerierungsspalte
  • Hintergrundfarbe auf normalen Datenzellen (außer Nummerierungsspalte)

ERLAUBT bei anderen Tabellen im Dokument (z.B. Legende):

  • Alle Farben 1:1 wie im Original: gelb, grün, rot, grau etc.

Dokument-Header und Titel Behandlung

Der Dokumenttitel MUSS im Content erscheinen!

  • Die Hauptüberschrift (Dokumenttitel) → wird als <h1> GANZ OBEN im content_html eingefügt
  • Format: <h1 style="font-size: 14pt; font-weight: bold; margin: 0 0 10px 0; font-family: Arial, sans-serif; text-align: center;">Dokumenttitel</h1>
  • Danach folgt der restliche Content ab Sektion 1

KEINE Logos oder Bilder aus dem Header-Bereich!

  • Logos (Firmenlogos, Wappen) die im Kopfbereich erscheinen: IGNORIEREN!
  • Diese werden automatisch vom System herausgefiltert (Hash-basierte Duplikat-Erkennung)
  • Referenziere NUR inhaltliche Bilder (Diagramme, Fotos) — KEINE Header-Logos!
RICHTIG:  "Verfahrensanweisung Dienstplan" → als <h1> im content_html
RICHTIG:  Diagramm aus Dokument → <img src="content_1.png">
FALSCH:   Logo-Bild extrahieren und referenzieren
FALSCH:   Logo mehrfach im HTML anzeigen

TOC (Inhaltsverzeichnis) — NIEMALS im Content!

ABSOLUTE REGEL: Das TOC gehört NICHT in content_html!

  • Das Inhaltsverzeichnis wird SEPARAT in toc_html ausgegeben
  • Wenn das Originaldokument ein TOC hat: ÜBERSPRINGEN im Content!
  • Der Content beginnt DIREKT mit dem Dokumenttitel (<h1>) und dann Sektion 1
  • VERBOTEN: Klickbare Links wie "1. Zweck", "2. Geltungsbereich" im Content!

TOC-Sektion-1-Fix

Wenn "1. Inhaltsverzeichnis" die erste Sektion im TOC ist:

  • Die Funktion fix_toc_section_one() korrigiert automatisch
  • Fall 1: "1. Inhaltsverzeichnis" → wird ersetzt mit "1. "
  • Fall 2: TOC beginnt bei "2." → "1. " wird hinzugefügt
  • Die h1-Überschrift bekommt id="sec-1" und das "1." Präfix

TOC Format mit HÄNGENDEM EINZUG (h2, h3, h4):

⚠️ KRITISCH: Hängender Einzug bei Zeilenumbruch! Bei langen Titeln die umbrechen, MUSS der Text unter dem ERSTEN WORT weitergehen, NICHT am linken Rand!

FALSCH:                              RICHTIG:
4.1.1 Externe Signatur Servicehaus   4.1.1 Externe Signatur Servicehaus
Sonnenhalde  ← am Rand!                    Sonnenhalde  ← unter "Externe"!

Technik: padding-left + negativer text-indent:

<!-- Level 1: h2 (1., 2., 3.) -->
<div class="toc-entry toc-level-1" style="line-height: 1.5; padding-left: 20px; text-indent: -20px;"><a href="#sec-1">1. Zweck der Verfahrensanweisung</a></div>

<!-- Level 2: h3 (3.1., 4.2.) - zusätzlich margin-left: 15px -->
<div class="toc-entry toc-level-2" style="line-height: 1.5; margin-left: 15px; padding-left: 32px; text-indent: -32px;"><a href="#sec-3-1">3.1. Grundlagen</a></div>

<!-- Level 3: h4 (4.1.1., 4.3.2.) - zusätzlich margin-left: 30px -->
<div class="toc-entry toc-level-3" style="line-height: 1.5; margin-left: 30px; padding-left: 44px; text-indent: -44px;"><a href="#sec-4-1-1">4.1.1. Externe Signatur Servicehaus Sonnenhalde</a></div>

WICHTIG: h3 UND h4 Überschriften MÜSSEN im TOC erscheinen!

Hierarchische Einrückung — GENERELLE REGEL!

Alles was einem übergeordneten Element untersteht, wird eingerückt!

  • Einrückung erfolgt über margin-left in 20px-Schritten
  • Ebene 1 (h2): margin-left: 0
  • Ebene 2 (h3, Listen unter h2): margin-left: 20px
  • Ebene 3 (Listen unter h3, verschachtelte Listen): margin-left: 40px
  • usw.

Tabellen und Bilder — MIT Einrückung und Abstand:

  • Tabellen: margin-left entsprechend der Hierarchie-Ebene + Abstand oben/unten!
    • Tabelle unter h2: margin: 15px 0 15px 20px;
    • Tabelle unter h3: margin: 15px 0 15px 40px;
    • Ausnahme: Verfahrenstabelle (Sektion 4) mit width: 100% hat margin-left: 0
  • Bilder: Eingerückt + Abstand! ALLE Bilder aus dem Original müssen erscheinen!

Tabellen — Einrückung statt Zentrierung

Tabellen werden eingerückt (nicht zentriert):

<table border="1" style="border-collapse: collapse; margin: 15px 0 15px 20px; font-family: Arial, sans-serif; font-size: 11pt;">

Ausnahme: Verfahrenstabellen (Sektion 4) mit 4 Spalten: width: 100%; margin-left: 0;

h2 für Hauptsektionen (1., 2., 3.):

<h2 id="sec-1" style="font-size: 12pt; font-weight: bold; margin: 10px 0 5px 0; font-family: Arial, sans-serif;">1. Zweck</h2>

h3 für Untersektionen (3.1., 3.2.):

<h3 id="sec-3.1" style="font-size: 11pt; font-weight: bold; margin: 10px 0 5px 20px; font-family: Arial, sans-serif;">3.1. Grundlagen</h3>

Absätze unter h3:

<p style="margin: 0 0 5px 20px; line-height: 1.5; font-family: Arial, sans-serif; font-size: 11pt;">Text</p>

Listen — Einrückung je nach Hierarchie-Ebene — KRITISCH!

⚠️ VERBOTEN: Listen die am linken Rand beginnen wenn sie unter h3 stehen! ⚠️

Listen unter h2 (Ebene 2): margin-left: 25px Listen unter h3 (Ebene 3): margin-left: 45px — PFLICHT!

VISUELLES ZIEL: Die Bullet-Points MÜSSEN weiter rechts beginnen als der erste Buchstabe der h3-Überschrift!

FALSCH (VERBOTEN!):

3.1. Grundlagen
• Bullet am linken Rand     ← FALSCH! Keine Einrückung!

RICHTIG:

3.1. Grundlagen
    • Bullet eingerückt     ← RICHTIG! Bullet beginnt weiter rechts

HTML-CODE für VA — Liste unter h3:

<h3 id="sec-3.1" style="font-size: 11pt; font-weight: bold; margin: 10px 0 5px 20px; font-family: Arial, sans-serif;">3.1. Grundlagen</h3>
<ul style="list-style-type: disc; margin: 5px 0 5px 45px; padding-left: 0;">
  <li style="line-height: 1.5; font-family: Arial, sans-serif; font-size: 11pt;">Betriebsmedizinliste ist eine vorgegebene...</li>
</ul>

KRITISCH: margin-left: 45px auf der <ul> — NICHT 25px, NICHT 0!

Verschachtelte Listen (Listen in Listen): zusätzliche 20px

<ul style="...margin-left: 25px...">
  <li>Hauptpunkt
    <ul style="...margin-left: 20px...">
      <li>Unterpunkt (nochmal eingerückt)</li>
    </ul>
  </li>
</ul>

Hängender Einzug: Bei Zeilenumbruch Text bündig mit erstem Wort, NICHT mit Bullet!

Farbige Hinweisfelder INNERHALB von Listenpunkten

Wenn ein gelbes/farbiges Hinweisfeld zum Text eines Listenpunkts gehört:

  • Das Feld ist TEIL des <li>, NICHT ein separates Element!
  • Verwende display: inline-block; damit es NICHT volle Breite hat
  • Die Originalfarbe übernehmen (gelb = #FFFF00 oder #FFF2CC, NICHT rosa!)
<li style="...">
  Text des Listenpunkts der vor dem Hinweis steht
  <div style="background-color: #FFFF00; padding: 5px; margin-top: 5px; display: inline-block;">
    Passwort für jeden Standort: SHS-MalBm
  </div>
</li>

FALSCH: Hinweisfeld als separates <div> mit voller Breite außerhalb der Liste!

Die Footer-Tabelle hat 4 Spalten, NUR die Header-Zeile mit Hintergrundfarbe, und verwendet 8pt (kleiner als Content-Text):

<table style="width: 100%; border-collapse: collapse; border: none; font-family: Arial, sans-serif; font-size: 8pt;">
  <tr>
    <td style="width: 25%; background-color: #E6B8B7; padding: 4px; vertical-align: top; border: none;">
      <p style="margin: 0; line-height: 1.5; font-size: 8pt;">Freigabe</p>
    </td>
    <td style="width: 25%; background-color: #E6B8B7; padding: 4px; vertical-align: top; border: none;">
      <p style="margin: 0; line-height: 1.5; font-size: 8pt;">Bearbeiter</p>
    </td>
    <td style="width: 25%; background-color: #E6B8B7; padding: 4px; vertical-align: top; border: none;">
      <p style="margin: 0; line-height: 1.5; font-size: 8pt;">Änderungsstand</p>
    </td>
    <td style="width: 25%; background-color: #E6B8B7; padding: 4px; vertical-align: top; border: none;">
      <p style="margin: 0; line-height: 1.5; font-size: 8pt;">Datum</p>
    </td>
  </tr>
  <tr>
    <td style="width: 25%; padding: 4px; vertical-align: top; border: none;">
      <p style="margin: 0; line-height: 1.5; font-size: 8pt;">QM</p>
    </td>
    <td style="width: 25%; padding: 4px; vertical-align: top; border: none;">
      <p style="margin: 0; line-height: 1.5; font-size: 8pt;">Name</p>
    </td>
    <td style="width: 25%; padding: 4px; vertical-align: top; border: none;">
      <p style="margin: 0; line-height: 1.5; font-size: 8pt;">1.0</p>
    </td>
    <td style="width: 25%; padding: 4px; vertical-align: top; border: none;">
      <p style="margin: 0; line-height: 1.5; font-size: 8pt;">01.01.2025</p>
    </td>
  </tr>
</table>

WICHTIG: 4 Spalten: Freigabe, Bearbeiter, Änderungsstand, Datum. KEINE "Seite"-Spalte! Beachte: Datenzellen haben KEINE Hintergrundfarbe, nur die Header-Zeile!

Tabellen durch Bilder unterbrochen — Header wiederholen!

Wenn eine Tabelle durch ein Bild unterbrochen wird, MUSS die Header-Zeile nach dem Bild wiederholt werden!

<table border="1" style="...">
  <tr>
    <th colspan="2" style="...background-color: #E6B8B7;">Aufgabe</th>
    <th style="...background-color: #E6B8B7;">Verantwortung</th>
    <th style="...background-color: #E6B8B7;">Mittel</th>
  </tr>
  <tr>
    <td style="...background-color: #F2DCDB;">1</td>
    <td>Schritt 1a</td>
    <td>MA</td>
    <td>Telefon</td>
  </tr>
  <tr>
    <td style="...background-color: #F2DCDB;">1b</td>
    <td>Schritt 1b</td>
    <td>BL</td>
    <td>-</td>
  </tr>
</table>

<!-- BILD unterbricht die Tabelle - MIT Einrückung und Abstand! -->
<div style="text-align: center; margin: 15px 0 15px 20px;"><img src="content_1.png" alt="Vorsorgekartei" style="max-width: 100%;"></div>

<!-- NEUE Tabelle mit WIEDERHOLTER Header-Zeile! -->
<table border="1" style="...">
  <tr>
    <th colspan="2" style="...background-color: #E6B8B7;">Aufgabe</th>
    <th style="...background-color: #E6B8B7;">Verantwortung</th>
    <th style="...background-color: #E6B8B7;">Mittel</th>
  </tr>
  <tr>
    <td style="...background-color: #F2DCDB;">2</td>
    <td>Schritt 2a</td>
    <td>MA</td>
    <td>Formular</td>
  </tr>
</table>

WICHTIG: Nach jedem unterbrechenden Bild beginnt eine NEUE Tabelle mit vollständiger Header-Zeile!

Nummerierungsspalte = Header-Farbe

PFLICHT: Die Nummerierungsspalte (1, 2, 3...) MUSS EXAKT die gleiche Hintergrundfarbe haben wie die Header-Zeile der Tabelle!

<!-- VA: Rosa Header → Rosa Nummerierung -->
<tr>
  <th style="...background-color: #E6B8B7;">Aufgabe</th>
  ...
</tr>
<tr>
  <td style="...background-color: #F2DCDB; text-align: center;">1</td>
  <td style="...">Beschreibung (KEIN Hintergrund!)</td>
  ...
</tr>

<!-- Standard: Blau Header → Blau Nummerierung -->
<tr>
  <th style="...background-color: #B8CCE4;">3. Durchführung</th>
  ...
</tr>
<tr>
  <td style="...background-color: #B8CCE4; text-align: center;">1</td>
  <td style="...">Beschreibung (KEIN Hintergrund!)</td>
  ...
</tr>

Layout-Vorgaben für Dokumente MIT TOC (Abweichungen von 1:1)

Dokumente die ein Inhaltsverzeichnis haben (Standard/VA) bekommen folgende Anpassungen, die von einer 1:1-Darstellung des Originals abweichen:

1. TOC wird NEU generiert (nicht aus dem Original)

  • Original-TOC (Punktreihen, Seitenzahlen) wird komplett verworfen
  • Phase 2a extrahiert TOC-Einträge als JSON, generate_toc_from_entries() erzeugt festes Template
  • Format: <div class="toc-entry toc-level-N"> mit <a href="#sec-N">
  • Seitenzahlen und Punktreihen werden entfernt

2. TOC-Seiten und Titelseite werden im Content übersprungen

  • Alle Pre-Content-Seiten (Titel, TOC) werden NICHT an Gemini zur Content-Konvertierung gesendet
  • Content beginnt bei first_content_page (aus Phase 1)

3. "1. Inhaltsverzeichnis" → Dokumenttitel

  • fix_toc_section_one() ersetzt "1. Inhaltsverzeichnis" mit "1. "
  • Oder fügt "1. " 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 <p> 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
  • 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 <p> 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 <table> 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 <h2> 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 <table>:

<table border="1" style="border-collapse: collapse; width: 100%; font-family: Arial, sans-serif; font-size: 11pt;">
  <tr>
    <th style="border: 1px solid #000; padding: 4px; vertical-align: top; background-color: #B8CCE4; font-size: 12pt; font-weight: bold; text-align: left;">
      <p style="margin: 0; line-height: 1.5;">1. Ziel</p>
    </th>
  </tr>
  <tr>
    <td style="border: 1px solid #000; padding: 4px; vertical-align: top;">
      <p style="margin: 0; line-height: 1.5;">Dieser Standard regelt...</p>
    </td>
  </tr>
</table>

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%)

<table border="1" style="border-collapse: collapse; width: 100%; font-family: Arial, sans-serif; font-size: 11pt; margin-top: 10px;">
  <tr>
    <th colspan="2" style="border: 1px solid #000; padding: 4px; vertical-align: top; background-color: #B8CCE4; font-size: 12pt; font-weight: bold; text-align: left; width: 50%;">
      <p style="margin: 0; line-height: 1.5;">3. Durchführung/Ablauf</p>
    </th>
    <th style="border: 1px solid #000; padding: 4px; vertical-align: top; background-color: #B8CCE4; font-size: 11pt; font-weight: bold; text-align: left; width: 25%;">
      <p style="margin: 0; line-height: 1.5;">Verantwortung</p>
    </th>
    <th style="border: 1px solid #000; padding: 4px; vertical-align: top; background-color: #B8CCE4; font-size: 11pt; font-weight: bold; text-align: left; width: 25%;">
      <p style="margin: 0; line-height: 1.5;">Mittel</p>
    </th>
  </tr>
  <tr>
    <td style="border: 1px solid #000; padding: 4px; vertical-align: top; background-color: #B8CCE4; text-align: center; width: 5%;">
      <p style="margin: 0; line-height: 1.5;">1</p>
    </td>
    <td style="border: 1px solid #000; padding: 4px; vertical-align: top; width: 45%;">
      <p style="margin: 0; line-height: 1.5;">Schritt 1</p>
    </td>
    <td style="border: 1px solid #000; padding: 4px; vertical-align: top;">
      <p style="margin: 0; line-height: 1.5;">MA</p>
    </td>
    <td style="border: 1px solid #000; padding: 4px; vertical-align: top;">
      <p style="margin: 0; line-height: 1.5;">Arbeitsmittel, Kommunikation</p>
    </td>
  </tr>
</table>

Template Rules: Verfahrensanweisung (Rosa)

Section Structure

Sections use free-flowing <h2> headings (KEINE Tabellen!):

<h2 id="sec-1" style="font-size: 12pt; font-weight: bold; margin: 10px 0 5px 0; font-family: Arial, sans-serif;">1. Zweck der Verfahrensanweisung</h2>
<p style="margin: 0 0 5px 0; line-height: 1.5; font-family: Arial, sans-serif; font-size: 11pt;">Mit dieser Verfahrensanweisung werden die Zuständigkeiten...</p>

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%)

<h2 id="sec-4" style="font-size: 12pt; font-weight: bold; margin: 10px 0 5px 0; font-family: Arial, sans-serif;">4. Beschreibung des Verfahrensablaufs</h2>
<table border="1" style="border-collapse: collapse; width: 100%; font-family: Arial, sans-serif; font-size: 11pt; margin-top: 10px;">
  <tr>
    <th colspan="2" style="border: 1px solid #000; padding: 4px; vertical-align: top; background-color: #E6B8B7; width: 50%;">
      <p style="margin: 0; line-height: 1.5;">Aufgabe</p>
    </th>
    <th style="border: 1px solid #000; padding: 4px; vertical-align: top; background-color: #E6B8B7; width: 25%;">
      <p style="margin: 0; line-height: 1.5;">Verantwortung</p>
    </th>
    <th style="border: 1px solid #000; padding: 4px; vertical-align: top; background-color: #E6B8B7; width: 25%;">
      <p style="margin: 0; line-height: 1.5;">Mittel</p>
    </th>
  </tr>
  <tr>
    <td style="border: 1px solid #000; padding: 4px; vertical-align: top; background-color: #E6B8B7; text-align: center; width: 5%;">
      <p style="margin: 0; line-height: 1.5;">1</p>
    </td>
    <td style="border: 1px solid #000; padding: 4px; vertical-align: top; width: 45%;">
      <p style="margin: 0; line-height: 1.5;">Task description</p>
    </td>
    <td style="border: 1px solid #000; padding: 4px; vertical-align: top;">
      <p style="margin: 0; line-height: 1.5;">MA</p>
    </td>
    <td style="border: 1px solid #000; padding: 4px; vertical-align: top;">
      <p style="margin: 0; line-height: 1.5;">Telefon</p>
    </td>
  </tr>
</table>

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;!

<h3 id="sec-3.3" style="font-size: 11pt; font-weight: bold; margin: 10px 0 5px 20px; font-family: Arial, sans-serif;">3.3. Abkürzungen:</h3>
<table border="0" style="border-collapse: collapse; margin: 10px auto; font-family: Arial, sans-serif; font-size: 11pt;">
  <tr>
    <td style="border: none; padding: 4px; vertical-align: top;">
      <p style="margin: 0; line-height: 1.5;">MA</p>
    </td>
    <td style="border: none; padding: 4px 30px 4px 4px; vertical-align: top;">
      <p style="margin: 0; line-height: 1.5;">Mitarbeiter</p>
    </td>
    <td style="border: none; padding: 4px; vertical-align: top;">
      <p style="margin: 0; line-height: 1.5;">DP</p>
    </td>
    <td style="border: none; padding: 4px; vertical-align: top;">
      <p style="margin: 0; line-height: 1.5;">Dienstplan</p>
    </td>
  </tr>
</table>

Tabellen MIT vs. OHNE Rahmenlinien

Tabelle MIT sichtbaren Rahmenlinien:

<table border="1" style="border-collapse: collapse; ...">
  <td style="border: 1px solid #000; padding: 4px; vertical-align: top;">

Tabelle OHNE sichtbare Rahmenlinien:

<table border="0" style="border-collapse: collapse; ...">
  <td style="border: none; padding: 4px; vertical-align: top;">

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 (<td>, <th>) — behalten ihre eigene Größe
  • Headings (<h1>-<h6>) — behalten ihre eigene Größe
  • Bold-Tags (<strong>) — 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)
# 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 <img> Tag im HTML
<!-- Seite 1: Ganzseitiges Bild (gescanntes Dokument) -->
<div style="margin: 20px 0; page-break-inside: avoid;">
  <img src="content_1_1.png" alt="Seite 1" style="max-width: 100%; height: auto;" width="596" height="842">
</div>

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)
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.

{
  "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:

{
  "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;

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:

<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA..." alt="...">

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 <style> tags
  • No <colgroup> or <col> tags
  • No <thead> or <tbody> tags
  • Text in table cells wrapped in <p> tags
  • Every <td> and <th> needs vertical-align: top;

FORBIDDEN:

  • CSS classes (no class="...")
  • External stylesheets
  • Empty separator rows
  • Columns with width: 0%