Infrastruktur · Selbst hosten

Docling — PDFs so aufbereiten, dass KI sie richtig liest

Tabellen, Spalten, Scans und was das Markdown verschweigt. Docling auf dem eigenen Server, geprüft an einem Übungsdokument mit Kontrollwerten, und am Ende ein n8n-Ablauf, der Fragen zu einem PDF beantwortet.

▶ Das ganze Video

Am Stück, oder unten Stufe für Stufe mit Text daneben.

Docling — PDFs so aufbereiten, dass KI sie richtig liest

Sprecherstimme synthetisch erzeugt (Text-to-Speech).

Aufgenommen im September 2026: docling-serve 1.35.0 im Docker-Container auf einem VPS, n8n 2.40.5, die KI über das AuxData-Gateway mit GLM 5.3. Terminal mit OBS, Browser als Bildschirmmitschnitt. Untertitel lassen sich im Player zuschalten.

Worum geht's?

Wer eine KI Fragen zu eigenen Dokumenten beantworten lässt, merkt schnell: Die Antwort ist nur so gut wie der Text, den die KI zu sehen bekommt. PDFs sind für Menschen gemacht. Spalten, Tabellen und eingescannte Seiten kommen beim einfachen Auslesen kaputt oder gar nicht an.

Docling wandelt PDFs in sauberes Markdown und ein ausführliches JSON um. In dieser Schulung betreibst Du es selbst und prüfst an einem Übungsdokument mit sechs Kontrollwerten, was es kann und was nicht. Drei Befunde stehen drin, die beim Aufbau wirklich aufgefallen sind: Das Markdown lässt Fußnoten und Text in Bildern weg (Stufe 8), eine andere Texterkennung liefert eine falsche, aber glaubwürdige Telefonnummer (Stufe 7), und Bindestriche am Zeilenende gehen verloren (Stufe 6).

Den Abschluss bildet ein n8n-Ablauf: PDF hochladen, Frage stellen, Antwort mit Beleg. Er beantwortet auch die Fragen, deren Antwort in der Fußnote oder auf dem Stempel steht.

Selbstlern-Kurs zum Durchklicken. Dein Fortschritt wird lokal gespeichert.

? Für wen ist das interessant?

📄
Wer Dokumente befragt
Produktblätter, Verträge, Handbücher: überall dort, wo eine KI aus PDFs antworten soll.
🔒
Wer Daten im Haus halten will
Die Aufbereitung läuft auf dem eigenen Server, ohne Cloud, ohne Grafikkarte.
⚙️
Wer mit n8n automatisiert
Die Fortsetzung der n8n-Schulung: Dokumente in Abläufe holen.
🧪
Wer prüfen will statt glauben
Jede Aussage dieser Schulung ist am Übungs-PDF gemessen. Die Kontrollwerte nimmst Du mit.

↗ Was Du vorher brauchst

  1. Einen VPS mit Docker: Self-Hosting & VPS, Docker, SSH.
  2. Für die Stufen 9 und 10: das n8n aus der n8n-Schulung mit einem Zugang zu einem Sprachmodell.

📚 Die zwölf Stufen

ℹ Stand der Dinge

Gemessen und aufgenommen im September 2026 mit docling-serve 1.35.0 (Docling 2.130.0, Prozessor-Image) auf einem VPS mit 4 vCPU, dazu n8n 2.40.5 und GLM 5.3 (mistral/zai-glm-5-3) über das AuxData-Gateway. Alle Messwerte stehen in kontrollwerte.md.

Docling erscheint sehr häufig neu. Beschriftungen der Oberfläche und Ergebnisse im Detail können sich ändern. Genau dafür gibt es die Kontrollwerte: nach einem Update das Übungs-PDF neu umwandeln und nachsehen (Stufe 11).

Stufe 1

Warum Aufbereitung zählt

Die Antwort einer KI ist nur so gut wie der Text, den sie zu sehen bekommt.

Stufe 1 · Drei Stellen, an denen PDFs Text verstecken

Sprecherstimme synthetisch erzeugt (Text-to-Speech).

Spalten, Tabellen, Scans. Untertitel lassen sich im Player zuschalten.
Was im Video gesagt wird

Erstens Spalten. Wer ein zweispaltiges PDF einfach von oben nach unten liest, mischt Zeilen aus beiden Spalten. Dann steht die Traglast einer Werkbank plötzlich neben dem falschen Modell.

Zweitens Tabellen. Beim einfachen Auslesen zerfällt eine Tabelle in Zeilen. Welcher Preis zu welcher Spalte gehört, ist danach nicht mehr eindeutig.

Drittens Scans. Eine eingescannte Seite hat gar keinen Text, nur ein Bild. Für die KI ist sie leer, egal wie wichtig der Inhalt ist.

Unser Übungsdokument hat alle drei Stellen, und zu jeder gibt es einen Kontrollwert. So lässt sich nach jeder Umwandlung nachprüfen, was angekommen ist.

1 Was ein PDF eigentlich ist

Ein PDF beschreibt, wo Zeichen auf einer Seite stehen, nicht in welcher Reihenfolge man sie liest. Für einen Menschen ist das egal, er sieht Spalten, Tabellen und Stempel. Ein Programm, das „einfach den Text herausholt“, sieht nur Zeichen an Koordinaten. Drei Stellen gehen dabei regelmäßig schief:

📰
Spalten
Zeilen aus zwei Spalten werden gemischt, oder ein Satz reißt am Spaltenende ab.
📊
Tabellen
Die Tabelle zerfällt in Zeilen. Welcher Preis zu welcher Spalte gehört, ist danach Raten.
🖨️
Scans
Eine eingescannte Seite enthält keinen Text, nur ein Bild. Ohne Texterkennung ist sie leer.
🔎
Und die KI?
Sie antwortet trotzdem, aus dem, was ankommt. Fehlt die Stelle, sagt sie „steht nicht drin“, oder sie rät.

2 Das Übungsdokument

Durch die ganze Schulung läuft ein Dokument: das Produktblatt der fiktiven Nordwerk GmbH, drei Seiten, jede mit einer typischen Falle. Zu jeder Falle gibt es einen Kontrollwert, den Du nach jeder Umwandlung suchst. Lade Dir beides jetzt herunter: nordwerk-produktblatt.pdf und kontrollwerte.md.

SeiteSchwierigkeitKontrollwert
1zwei Spalten, Satz über den SpaltenumbruchWB-180 trägt 800 kg
1Silbentrennung am ZeilenendeBaden-Württemberg, FI-Schutzschalter
2verbundene KopfzelleWB-180 ab 5 Stück 459 €
2Fußnote unter der TabelleÖsterreich und Schweiz plus eine Woche
3eingescannte Seite, kein Text im PDF48 Stunden, Hotline 0821 99 88-501
3Stempel im BildEingang 14. Juni 2026
💡 Das ist die wichtigste Gewohnheit dieser Schulung: Nicht „sieht gut aus“, sondern „die sechs Kontrollwerte sind da“. Mit einem eigenen Dokument machst Du es später genauso: drei, vier Stellen aussuchen, die schwierig sind, und nach jeder Umwandlung nachsehen.

3 Was Docling ist

Docling ist ein freies Werkzeug (MIT-Lizenz), ursprünglich von IBM Research, heute ein Projekt der LF AI & Data Foundation. Es erkennt mit eigenen, kleinen Modellen das Layout einer Seite: Überschriften, Absätze, Spalten, Tabellen, Bilder. Daraus macht es Markdown oder ein ausführliches JSON. docling-serve ist die fertige Server-Fassung mit Schnittstelle und Weboberfläche. Die betreiben wir hier, als Container auf dem eigenen Server.

Docling ist kein Sprachmodell und beantwortet keine Fragen. Es bereitet den Text vor, den ein Sprachmodell später liest. In Stufe 9 schließt ein n8n-Ablauf beides zusammen.

✓ Kurz geprüft

Stufe 2

Voraussetzungen

Was vor dem ersten Befehl stehen muss.

Stufe 2 · Was Du brauchst

Sprecherstimme synthetisch erzeugt (Text-to-Speech).

Die Voraussetzungen in einer Minute. Untertitel lassen sich im Player zuschalten.
Was im Video gesagt wird

Einen VPS mit Docker, wie in der Docker- und der Self-Hosting-Schulung. Docling braucht mehr Platz als die meisten Dienste: Das Image belegt auf der Platte fast acht Gigabyte, im Betrieb kommen bis zu zweieinhalb Gigabyte Arbeitsspeicher dazu.

Keine Grafikkarte. Es gibt eine eigene Variante nur für den Prozessor. Unser Dokument mit drei Seiten braucht damit um die zehn Sekunden.

Für die Schritte am Ende das n8n aus der n8n-Schulung und einen Zugang zu einem Sprachmodell. Wer nur umwandeln will, kommt ohne beides aus.

1 Deine Ausgangslage

  1. Ein VPS mit Docker und Compose, auf den Du Dich per SSH anmeldest: Self-Hosting & VPS, Docker, SSH.
  2. Platz für Docling. Das Image lädt gut 2 GB herunter und belegt entpackt knapp 8 GB auf der Platte. Im Leerlauf haben wir 0,8 bis 1,9 GB Arbeitsspeicher gemessen, während einer Umwandlung bis zu 2,4 GB. Plane rund 2,5 GB frei ein. Eine Grafikkarte ist nicht nötig, es gibt eine eigene Fassung nur für den Prozessor.
  3. Für die Stufen 9 und 10: das n8n aus der n8n-Schulung auf demselben Server, mit dem Zugang zum Sprachmodell aus deren Stufe 7. Wer nur umwandeln will, lässt diese beiden Stufen weg.
  4. Die Übungsdateien: nordwerk-produktblatt.pdf, kontrollwerte.md, compose.yml und frag-das-dokument.json.

2 Drei Regeln, bevor Du anfängst

🔒 Port nicht öffnen. Docling lauscht nur auf 127.0.0.1. In unserer Einrichtung fragt die Oberfläche nach keinem Passwort. Jeder, der den Port erreicht, könnte Dokumente hochladen und Rechenzeit verbrauchen. Du kommst über einen SSH-Tunnel hinein, wie bei n8n.
⚠️ Echte Dokumente erst nach der Übung. Docling selbst verarbeitet alles auf Deinem Server. Der n8n-Ablauf aus Stufe 9 schickt den Text aber an ein Sprachmodell. Wohin, entscheidet Dein Zugang. Mit Kundendaten erst arbeiten, wenn das geklärt ist.
↩️ Zurück geht immer. docker compose down im Ordner /opt/docling entfernt den Container. docker image rm quay.io/docling-project/docling-serve-cpu:v1.35.0 gibt die knapp 8 GB wieder frei. Docling speichert keine Dokumente dauerhaft, es gibt kein Datenvolume.

✓ Kurz geprüft

Stufe 3

Installieren

Eine Compose-Datei, feste Version, Port nur lokal.

Stufe 3 · Im Terminal: Docling aufsetzen

Sprecherstimme synthetisch erzeugt (Text-to-Speech).

Auf dem VPS, mit OBS aufgenommen. Untertitel lassen sich im Player zuschalten.
Was im Video gesagt wird

Docling bekommt einen eigenen Ordner. In der Compose-Datei steht das Prozessor-Image mit fester Versionsnummer, die Weboberfläche ist eingeschaltet, und der Port hängt nur an localhost. Dazu zwei Grenzen: höchstens fünfzig Seiten und zwanzig Megabyte pro Dokument.

Die letzten Zeilen hängen Docling zusätzlich an das Netz von n8n. Dann erreicht n8n den Dienst später einfach unter dem Namen docling. Wer kein n8n hat, lässt diese Zeilen weg.

Der erste Start lädt das Image, gut zwei Gigabyte. Das dauert eine gute Minute.

Der Gesundheitscheck antwortet mit ok. Im Leerlauf braucht Docling schon gut ein Gigabyte Arbeitsspeicher, weil die Modelle für Layout, Tabellen und Texterkennung geladen sind.

Für die Weboberfläche öffnest Du auf Deinem Rechner einen SSH-Tunnel, genau wie bei n8n. Dann öffnest Du im Browser localhost, Port fünftausendeins, und hängst U-I an.

1 Ordner und Compose-Datei

📍
Ausgangslage
Du bist per SSH auf dem Server angemeldet.
👉
Deine Handlung
Ordner /opt/docling anlegen, hineinwechseln, compose.yml mit dem Inhalt unten anlegen (z. B. mit nano compose.yml).
✅
Das siehst Du danach
docker compose config --quiet meldet nichts, also keinen Fehler.
🛟
Wenn es anders aussieht
Meldung network n8n_default declared as external, but could not be found: Es gibt kein n8n aus der n8n-Schulung. Dann die Zeilen networks: unter dem Dienst und den ganzen Block networks: am Ende löschen.
1/opt/docling/compose.yml
services:
  docling:
    image: quay.io/docling-project/docling-serve-cpu:v1.35.0
    container_name: docling
    restart: unless-stopped
    ports:
      - "127.0.0.1:5001:5001"
    environment:
      DOCLING_SERVE_ENABLE_UI: "1"
      DOCLING_SERVE_MAX_NUM_PAGES: "50"
      DOCLING_SERVE_MAX_FILE_SIZE: "20971520"
    mem_limit: 5g
    networks:
      - default
      - n8n

networks:
  n8n:
    name: n8n_default
    external: true
Die Versionsnummer ist fest, nicht latest. Die Umgebungsvariablen schalten die Weboberfläche ein und begrenzen jedes Dokument auf 50 Seiten und 20 MB (20971520 Bytes). mem_limit deckelt den Speicher bei 5 GB, damit eine große Umwandlung nicht den ganzen Server lahmlegt.
🔗 Die Netz-Zeilen. n8n aus der n8n-Schulung läuft im Docker-Netz n8n_default. Docling hängt sich zusätzlich hinein. Dann erreicht n8n es unter dem Namen docling, also http://docling:5001, ohne dass ein Port nach außen offen ist.

2 Starten und prüfen

2Im Ordner /opt/docling
docker compose up -d
curl -s http://127.0.0.1:5001/health; echo
docker stats --no-stream docling
📍
Ausgangslage
compose.yml liegt in /opt/docling.
👉
Deine Handlung
Die drei Befehle nacheinander. Der erste Start lädt gut 2 GB, das dauert je nach Server ein bis mehrere Minuten.
✅
Das siehst Du danach
{"status":"ok"}, und docker stats zeigt den Container mit gut einem Gigabyte Speicher.
🛟
Wenn es anders aussieht
curl antwortet nicht: Docling lädt beim Start seine Modelle, einige Sekunden warten. Bleibt es still: docker compose logs docling.

3 Der Tunnel von Deinem Rechner

3Auf Deinem eigenen Rechner (PowerShell, Terminal)
ssh -N -L 5001:127.0.0.1:5001 root@DEIN-SERVER
Solange dieses Fenster offen ist, liegt die Oberfläche unter http://localhost:5001/ui/. DEIN-SERVER ist ein Platzhalter für Adresse oder SSH-Alias. Läuft schon ein Tunnel für n8n, darf er offen bleiben, die Ports stören sich nicht.

✓ Kurz geprüft

Stufe 4

Die erste Umwandlung

Hochladen, umwandeln, ansehen.

Stufe 4 · Die Weboberfläche

Sprecherstimme synthetisch erzeugt (Text-to-Speech).

Das Übungs-PDF mit den Voreinstellungen. Untertitel lassen sich im Player zuschalten.
Was im Video gesagt wird

Das ist die Oberfläche von Docling. Unter Convert File lade ich das Übungsdokument hoch: das Produktblatt der Nordwerk GmbH, drei Seiten.

Unter Options stehen alle Stellschrauben. Für den ersten Durchgang bleibt alles auf den Voreinstellungen: Texterkennung an, Tabellen im genauen Modus.

Process File. Auf dem Prozessor unseres Servers dauert das gut fünfzehn Sekunden.

Das Ergebnis gibt es in mehreren Formaten. Am besten lesbar ist Markdown-Rendered: Überschriften, Absätze und Listen, so wie ein Sprachmodell sie später bekommt. Kopf- und Fußzeilen hat Docling als Beiwerk erkannt und weggelassen.

1 Selbst umwandeln

📍
Ausgangslage
Der Tunnel läuft, im Browser ist http://localhost:5001/ui/ offen.
👉
Deine Handlung
Reiter Convert File. Das Übungs-PDF auf das Upload-Feld ziehen. Unter Options nachsehen, aber nichts ändern. Process File.
✅
Das siehst Du danach
Nach gut 15 Sekunden erscheinen unten mehrere Reiter mit dem Ergebnis. Markdown-Rendered zeigt das Dokument mit Überschriften, Absätzen und Listen.
🛟
Wenn es anders aussieht
Nach einer Minute noch nichts? Im Terminal docker compose logs --tail 20 docling. Ein Hinweis auf zu wenig Speicher heißt: mem_limit oder Server zu klein.

2 Die Stellschrauben unter Options

EinstellungVoreinstellungWofür
Enable OCRanTexterkennung für Seiten und Bilder ohne Text. Stufe 7.
OCR EngineAutoWelches Erkennungsprogramm. Auto hat bei uns RapidOCR gewählt.
Force OCRausLaut Dokumentation: auch vorhandenen Text durch Erkennung ersetzen. Für normale PDFs nicht nötig.
Table ModeAccurateGenauer Tabellenmodus. Fast ist schneller, bei verschachtelten Köpfen aber ungenauer.

Die Reiter im Ergebnis: Markdown-Rendered zum Lesen, Markdown als Rohtext, dazu weitere Formate. Kopf- und Fußzeilen des Originals hat Docling als Beiwerk erkannt und weggelassen.

💡 Die Oberfläche ist zum Ausprobieren da. Im Betrieb ruft ein Programm die Schnittstelle auf, das zeigt Stufe 8.

✓ Kurz geprüft

Stufe 5

Tabellen

Wo Docling glänzt, und was dabei fehlt.

Stufe 5 · Die Preistabelle

Sprecherstimme synthetisch erzeugt (Text-to-Speech).

Seite 2 des Übungs-PDFs. Untertitel lassen sich im Player zuschalten.
Was im Video gesagt wird

Seite zwei ist eine Preistabelle. Ihre Kopfzeile ist verschachtelt: Preis netto steht über zwei Spalten, ab einem Stück und ab fünf Stück.

Docling hat daraus eine saubere Tabelle gemacht. Im Markdown sieht man, wie: Die obere Zeile wurde in die Spaltennamen übernommen. Preis netto, ab fünf Stück. Damit ist jeder Wert eindeutig.

Und jetzt der Blick unter die Tabelle. Im Original steht dort eine Fußnote: Lieferung nach Österreich und in die Schweiz eine Woche länger, Mengenrabatt nur je Artikel. Im Markdown fehlt sie. Wohin sie verschwunden ist, klären wir in Stufe acht.

1 Die verschachtelte Kopfzeile

📍
Ausgangslage
Das Ergebnis aus Stufe 4 ist noch offen.
👉
Deine Handlung
Reiter Markdown. Bis zur Preistabelle scrollen und die Zeile der WB-180 suchen.
✅
Das siehst Du danach
Die Spalten heißen Preis netto - ab 1 Stück und Preis netto - ab 5 Stück. Bei der WB-180 steht 459 € in der zweiten. Kontrollwert erfüllt.
🛟
Wenn es anders aussieht
Die Kopfzeile ist zerfallen? Prüfen, ob unter Options Table Mode auf Accurate steht.

Docling hat die obere Zeile („Preis netto“ über zwei Spalten) in die Spaltennamen übernommen. Beim einfachen Auslesen mit einer PDF-Bibliothek zerfällt dieselbe Tabelle in lose Zeilen, die Zuordnung ist dann unklar.

2 Die Fußnote fehlt

Unter der Tabelle steht im Original eine Fußnote: Lieferung nach Österreich und in die Schweiz eine Woche länger, Mengenrabatt nur je Artikelnummer. Im Markdown fehlt sie. Suche im Reiter Markdown mit Strg+F nach „Österreich“: kein Treffer.

⚠️ Genau so entstehen falsche Antworten. Die Frage „Wie lange dauert die Lieferung nach Österreich?“ beantwortete GLM mit diesem Markdown als Kontext beim Aufbau mit „steht nicht im Dokument“. Wohin die Fußnote verschwunden ist, klärt Stufe 8.

✓ Kurz geprüft

Stufe 6

Lesereihenfolge

Spalten, Absätze und Silbentrennung.

Stufe 6 · Seite 1, zweispaltig

Sprecherstimme synthetisch erzeugt (Text-to-Speech).

Ein Satz über den Spaltenumbruch und zwei getrennte Wörter. Untertitel lassen sich im Player zuschalten.
Was im Video gesagt wird

Seite eins hat zwei Spalten. Der Satz zur Traglast beginnt unten in der linken Spalte und endet oben in der rechten. Docling setzt ihn richtig zusammen: Die WB-180 trägt bis zu achthundert Kilogramm.

Allerdings mit einem Absatzwechsel mitten im Satz, weil das Original an dieser Stelle einen hat. Für eine Suche, die Texte in kleine Stücke schneidet, ist das eine Sollbruchstelle.

Und hier ein kleiner, aber echter Fehler: Wo im Original am Zeilenende getrennt wurde, fehlt jetzt der Bindestrich. Baden-Württemberg und der FI-Schutzschalter stehen jetzt ohne Bindestrich da, als ein zusammengeklebtes Wort. Wer nach dem richtigen Wort sucht, findet es nicht.

1 Der Satz über den Spaltenumbruch

📍
Ausgangslage
Ergebnis offen, Reiter Markdown-Rendered.
👉
Deine Handlung
Den Abschnitt Belastbarkeit suchen.
✅
Das siehst Du danach
„Die WB-180 … trägt … bis zu“ und darunter, als neuer Absatz, „800 kg.“ Der Satz ist vollständig und in der richtigen Reihenfolge, aber zweigeteilt.
🛟
Wenn es anders aussieht
Die Wörter stehen durcheinander? Dann hast Du das Dokument nicht mit Docling, sondern mit einem einfachen Auslesewerkzeug umgewandelt.

Der Absatzwechsel steht so im Original, dort beginnt die rechte Spalte mit einem neuen Absatz. Für einen Menschen harmlos. Für eine Dokumentensuche, die Texte in kleine Stücke schneidet (wie in Open WebUI und LibreChat), ist es eine Sollbruchstelle: „trägt bis zu“ und „800 kg“ können in verschiedenen Stücken landen.

2 Verlorene Bindestriche

Im Original werden Baden-Württemberg und FI-Schutzschalter genau am Bindestrich getrennt. Docling hat den Bindestrich für eine Silbentrennung gehalten und entfernt. Im Ergebnis steht BadenWürttemberg und FISchutzschalter. Das JSON hat denselben Fehler.

🔎 Eine Suche nach „Baden-Württemberg“ findet diese Stelle nicht mehr. Bei Artikelnummern mit Bindestrich (WB-180) kann dasselbe passieren, wenn sie am Zeilenende stehen. Kontrollwert für eigene Dokumente: ein Wort mit Bindestrich am Zeilenende.

✓ Kurz geprüft

Stufe 7

Texterkennung

Die eingescannte Seite, und eine glaubwürdige falsche Zahl.

Stufe 7 · Zwei Engines im Vergleich

Sprecherstimme synthetisch erzeugt (Text-to-Speech).

Auto (RapidOCR) gegen EasyOCR. Untertitel lassen sich im Player zuschalten.
Was im Video gesagt wird

Seite drei ist ein Scan, leicht schief, mit Rauschen. Ohne Texterkennung wäre sie leer. Docling hat sie gelesen: Reaktionszeit achtundvierzig Stunden, die Hotline mit der Durchwahl fünfhunderteins.

Aber nicht fehlerfrei. Wörter kleben zusammen, und die Nummerierung der Liste stimmt nicht mehr. Versuchen wir eine andere Engine: EasyOCR. Deutsch steht in ihrer Sprachliste schon drin.

EasyOCR braucht deutlich länger, gut dreißig Sekunden statt acht.

Die Wörter sind besser getrennt. Aber schau auf die Telefonnummer: Aus achtundachtzig ist null acht geworden. Eine falsche Nummer, die genauso glaubwürdig aussieht wie die richtige. Zahlen aus Scans also immer gegen das Original prüfen. Für den Rest der Schulung bleibt die Voreinstellung Auto.

1 Seite 3 mit der Voreinstellung

Seite 3 ist ein Scan: leicht schief, mit Rauschen, ohne eine einzige Textzeile im PDF. Ein einfaches Auslesewerkzeug liefert hier 0 Zeichen. Docling hat mit der Voreinstellung (Auto, bei uns RapidOCR) gelesen: Reaktionszeit 48 Stunden, Hotline 0821 99 88-501. Beide Kontrollwerte stimmen. Aber Wörter kleben zusammen („16Uhr“, „gekündigtwird“), und die Nummern der Liste stimmen nicht mehr.

2 Eine andere Engine

📍
Ausgangslage
Ergebnis offen.
👉
Deine Handlung
Options → OCR Engine auf EasyOCR. Das Feld OCR Language daneben bleibt, wie es ist (en,fr,de,es). Noch einmal Process File. Dann auf Seite 3 die Hotline suchen.
✅
Das siehst Du danach
Die Umwandlung dauert deutlich länger (bei uns 30 bis 35 statt 8 Sekunden). Die Wörter sind besser getrennt, aber die Hotline heißt jetzt 0821 99 08-501.
🛟
Wenn es anders aussieht
Tesseract statt EasyOCR bricht im Prozessor-Image mit einem Fehler ab: Dort ist nur Englisch installiert, die Voreinstellung verlangt weitere Sprachen. Das ist kein Bedienfehler.
EngineDauerHotline 0821 99 88-501Wortgrenzen
Auto (RapidOCR)8 s✓ richtigteils zusammengeklebt
EasyOCR30–35 s✗ „99 08-501“besser, dafür Buchstabenfehler („Hontag“)
Tesseract–Abbruch, im Prozessor-Image nur Englisch

Gemessen am 23. September 2026, docling-serve 1.35.0, ganzes Dokument.

⚠️ Die gefährlichste Art Fehler: Eine falsche Telefonnummer sieht genauso glaubwürdig aus wie die richtige. Die „bessere“ Engine hat hier eine Ziffer vertauscht. Regel: Zahlen aus gescannten Seiten (Telefonnummern, Beträge, Fristen) immer gegen das Original prüfen. Für den Rest der Schulung bleibt die Engine auf Auto.

✓ Kurz geprüft

Stufe 8

API und JSON

Was das Markdown verschweigt.

Stufe 8 · Im Terminal: die Schnittstelle

Sprecherstimme synthetisch erzeugt (Text-to-Speech).

curl, jq und zwei Suchen, die den Unterschied zeigen. Untertitel lassen sich im Player zuschalten.
Was im Video gesagt wird

Dieselbe Umwandlung geht ohne Oberfläche, mit einem einzigen Aufruf an die Schnittstelle. Ich lasse mir Markdown und JSON zugleich geben.

Im Markdown kommt Österreich nicht vor. Null Treffer. Die Fußnote ist dort wirklich weg.

Im JSON dagegen hat Docling die Fußnote erkannt, mit dem Etikett footnote, als Teil der Tabelle. Das Markdown hat sie nur beim Schreiben weggelassen.

Genauso der Eingangsstempel auf dem Scan. Im Markdown stand dort nur ein Platzhalter für ein Bild. Im JSON steht der Text: eingegangen am vierzehnten Juni. Die Lehre: Docling liest mehr, als das Markdown zeigt.

1 Umwandeln ohne Oberfläche

📍
Ausgangslage
Per SSH auf dem Server, im Ordner /opt/docling. Das Übungs-PDF liegt dort (von Deinem Rechner mit scp nordwerk-produktblatt.pdf root@DEIN-SERVER:/opt/docling/).
👉
Deine Handlung
Den Aufruf unten ausführen.
✅
Das siehst Du danach
Eine Datei ergebnis.json von rund 50 KB. Sie enthält Markdown und JSON zugleich.
🛟
Wenn es anders aussieht
Antwort {"detail": …} mit Field required: Das Feld heißt files, mit s. Keine Antwort und echo $? zeigt 26: curl findet die Datei nicht, falscher Ordner oder Tippfehler im Namen.
1Markdown und JSON in einem Aufruf
curl -s -X POST http://127.0.0.1:5001/v1/convert/file \
  -F files=@nordwerk-produktblatt.pdf -F to_formats=md -F to_formats=json \
  -o ergebnis.json
to_formats darf mehrfach stehen. Die Antwort ist JSON, das Markdown steckt in document.md_content, das ausführliche Dokumentmodell in document.json_content.

2 Wo die Fußnote wirklich ist

2jq installieren (einmalig) und suchen
apt install -y jq
jq -r .document.md_content ergebnis.json | grep -c Österreich
Ergebnis: 0. Im Markdown steht Österreich wirklich nicht.
3Im JSON nach Fußnoten suchen
jq '.document.json_content.texts[] | select(.label=="footnote") | {label, text, parent}' ergebnis.json
Hier ist sie, mit "label": "footnote" und dem Verweis #/tables/0: Docling hat die Fußnote erkannt und der Tabelle zugeordnet. Nur beim Schreiben des Markdowns bleibt sie weg.
4Text in Bildern
jq -r .document.md_content ergebnis.json | grep -n image
jq -r '.document.json_content.texts[] | select(.parent["$ref"] | startswith("#/pictures")) | .text' ergebnis.json
Im Markdown steht an der Stelle des Stempels nur <!-- image -->. Im JSON hängt am Bild der erkannte Text: „EINGEGANGEN 14. JUNI 2026“.
💡 Die Lehre: Docling liest mehr, als das Markdown zeigt. Wer einem Sprachmodell nur das Markdown gibt, verliert Fußnoten und Text in Bildern. Der n8n-Ablauf in Stufe 9 hängt beides deshalb aus dem JSON an.

✓ Kurz geprüft

Stufe 9

Der n8n-Ablauf

PDF rein, Antwort raus: ein Formular, Docling, ein Code-Schritt, GLM.

Stufe 9 · Einfügen und durchgehen

Sprecherstimme synthetisch erzeugt (Text-to-Speech).

Der fertige Ablauf, eingefügt in das n8n aus der n8n-Schulung. Untertitel lassen sich im Player zuschalten.
Was im Video gesagt wird

In n8n füge ich den fertigen Ablauf von der Schulungsseite ein. Er hat fünf Schritte.

Ein Formular nimmt ein PDF und eine Frage an.

Ein HTTP-Aufruf schickt das PDF an Docling, unter dem Namen docling im gemeinsamen Netz, und verlangt Markdown und JSON.

Ein kleiner Code-Schritt baut den Text für die KI: das Markdown, und darunter alles, was im JSON an Tabellen und Bildern hängt. Also genau die Fußnote und den Stempel.

Dahinter beantwortet GLM die Frage, nur aus dem Dokument, und eine Abschlussseite zeigt die Antwort. Veröffentlichen, fertig.

1 Einfügen und veröffentlichen

📍
Ausgangslage
Das n8n aus der n8n-Schulung läuft, der Tunnel auf Port 5678 ist offen, Docling hängt im Netz n8n_default (Stufe 3).
👉
Deine Handlung
Neuer Workflow, Name Frag das Dokument. frag-das-dokument.json öffnen, alles markieren, kopieren, in n8n auf die leere Fläche Strg+V. Den Knoten GLM öffnen und bei Credential Deinen Zugang wählen (bei uns AuxData-Gateway). Oben rechts Publish.
✅
Das siehst Du danach
Sechs Knoten, oben rechts Published. Eine Liste mit Vorschlägen (Production Checklist) darf man schließen.
🛟
Wenn es anders aussieht
Beim ersten Test Fehler im Knoten Docling mit getaddrinfo ENOTFOUND docling: Docling ist nicht im Netz von n8n. Die Netz-Zeilen aus Stufe 3 prüfen, dann docker compose up -d im Ordner /opt/docling.

2 Was die Knoten tun

  1. Dokument und Frage — ein n8n-Formular mit Datei- und Textfeld. Es ist mit n8n User Auth geschützt: Nur wer in Deinem n8n angemeldet ist, kann es benutzen.
  2. Docling — ein HTTP-Aufruf an http://docling:5001/v1/convert/file, das PDF als files, dazu zweimal to_formats: md und json. Wie der curl-Aufruf aus Stufe 8.
  3. Kontext bauen — ein Code-Schritt: das Markdown, und darunter alle Texte, die im JSON an einer Tabelle oder einem Bild hängen. Das sind genau Fußnote und Stempel.
  4. Antwort mit dem Modell GLM — eine Basic LLM Chain mit Systemanweisung, Temperatur 0.
  5. Antwort zeigen — die Abschlussseite des Formulars.
1Code-Schritt „Kontext bauen“ (JavaScript)
const d = $json.document;
// Fußnoten und Text in Bildern stehen nur im JSON, nicht im Markdown
const ergaenzungen = d.json_content.texts
  .filter(t => /^#\/(tables|pictures)\//.test(t.parent?.$ref ?? ''))
  .map(t => '- ' + t.text);
return { kontext: d.md_content + '\n\n## Ergänzungen (Fußnoten, Text in Bildern)\n' + ergaenzungen.join('\n') };
parent.$ref sagt, woran ein Textstück hängt. #/tables/… und #/pictures/… sind genau die Stellen, die das Markdown weglässt.
2Systemanweisung im Knoten „Antwort“
Beantworte die Frage nur mit Angaben aus dem Dokument. Wenn die Antwort nicht im Dokument steht, sag das. Nenne kurz die Stelle, auf die du dich stützt. Antworte in höchstens drei Sätzen, als einfacher Text ohne Markdown.
Die Regel „wenn es nicht drinsteht, sag das“ ist der Schutz gegen erfundene Antworten. Stufe 10 prüft sie mit einer Frage, deren Antwort nicht im Dokument steht.
🔒 Was den Server verlässt: Docling rechnet auf Deinem Server. Der Text des Dokuments geht danach an das Sprachmodell Deines Zugangs, bei uns GLM 5.3 über das AuxData-Gateway. Mit einem lokalen Modell (Lokale KI) bleibt alles im Haus. Dann statt GLM einen Ollama Chat Model-Knoten anhängen.

✓ Kurz geprüft

Stufe 10

Fragen an das Dokument

Drei Fragen, die ohne das JSON nicht zu beantworten wären.

Stufe 10 · Die Messung

Sprecherstimme synthetisch erzeugt (Text-to-Speech).

Drei echte Durchläufe über das Formular. Untertitel lassen sich im Player zuschalten.
Was im Video gesagt wird

Erste Frage: Wie lange dauert die Lieferung einer WB-180 nach Österreich? Das steht nur in der Fußnote.

Vier Wochen: drei laut Tabelle und eine für Österreich, mit Beleg. Zweite Frage: Wann ist die Servicevereinbarung eingegangen? Das steht nur auf dem Stempel.

Am vierzehnten Juni. Und zum Schluss eine Frage, deren Antwort nicht im Dokument steht: Gibt es die WB-180 auch mit Eichenplatte?

Das Dokument nennt nur Buche und Multiplex, und genau das sagt die Antwort. Kein erfundenes Ja.

Stufe 10b · Der Vergleich

Sprecherstimme synthetisch erzeugt (Text-to-Speech).

Fünf Fragen an drei Fassungen des Textes. Untertitel lassen sich im Player zuschalten.
Was im Video gesagt wird

Beim Aufbau haben wir fünf Fragen an drei Fassungen gestellt. Der einfach ausgelesene Text beantwortet die Fußnoten-Frage, scheitert aber an der gescannten Seite.

Das Markdown von Docling löst die gescannte Seite, verliert aber Fußnote und Stempel.

Erst Markdown plus die Ergänzungen aus dem JSON beantwortet alle fünf Fragen richtig.

1 Selbst fragen

📍
Ausgangslage
Der Workflow Frag das Dokument ist veröffentlicht.
👉
Deine Handlung
Im Formular-Knoten die Production URL kopieren und im Browser öffnen, einmal Allow access. Das Übungs-PDF wählen, Frage eintippen, Fragen. Das für jede der drei Fragen unten.
✅
Das siehst Du danach
Nach gut 10 bis 20 Sekunden die Seite Antwort mit zwei, drei Sätzen und der Stelle im Dokument.
🛟
Wenn es anders aussieht
Die Antwort sagt bei der Österreich-Frage „steht nicht drin“? Dann fehlen die Ergänzungen. Unter Executions den Lauf öffnen und im Knoten Kontext bauen nachsehen, ob unten die Fußnote steht.
FrageWo die Antwort stehtAntwort beim Aufbau
Wie lange dauert die Lieferung einer WB-180 nach Österreich?Tabelle + Fußnote✓ 3 Wochen laut Tabelle, plus eine Woche laut Fußnote: 4 Wochen
Wann ist die Servicevereinbarung eingegangen?Stempel im Scan✓ 14. Juni 2026
Gibt es die WB-180 auch mit Eichenplatte?nirgends✓ Nein: nur Buche (40 mm) oder Multiplex mit Linoleum (30 mm)

Gemessen am 23. September 2026 mit GLM 5.3, Temperatur 0. Ein Sprachmodell kann bei derselben Frage anders formulieren. Entscheidend ist, dass die Werte stimmen.

2 Der Vergleich: drei Fassungen, fünf Fragen

Frageeinfach ausgelesenDocling-MarkdownMarkdown + JSON-Ergänzungen
WB-180 ab 5 Stück?✓ 459 €✓ 459 €✓
Lieferung nach Österreich?✓ 4 Wochen✗ „steht nicht drin“✓
Reaktionszeit und Hotline?✗ „steht nicht drin“✓ 48 h, -501✓
Traglast WB-180?✓ 800 kg✓ 800 kg✓
Eingang der Vereinbarung?✗✗✓ 14. Juni 2026

Jede Fassung für sich hat Lücken: Das einfache Auslesen sieht die Fußnote, aber nicht den Scan. Das Docling-Markdown liest den Scan, verliert aber Fußnote und Stempel. Erst die Kombination beantwortet alle fünf. Die Fragen gingen jeweils mit dem ganzen Text an GLM 5.3, Temperatur 0.

✓ Kurz geprüft

Stufe 11

Betrieb und Updates

Rechenzeit, Speicher, und nach jedem Update die Kontrollwerte.

Stufe 11 · Im Terminal: Zeit, Speicher, Update

Sprecherstimme synthetisch erzeugt (Text-to-Speech).

Gemessen auf einem VPS mit vier Prozessorkernen. Untertitel lassen sich im Player zuschalten.
Was im Video gesagt wird

Wie lange braucht Docling? Unser Dokument mit drei Seiten: sechs bis fünfzehn Sekunden auf vier Prozessorkernen, je nachdem, was der Server sonst zu tun hat. Große Handbücher brauchen entsprechend Minuten.

Während der Umwandlung steigt der Speicher auf rund zwei Gigabyte. Die Grenze von fünf Gigabyte in der Compose-Datei schützt den Rest des Servers.

Updates laufen wie bei n8n: neue Versionsnummer eintragen, Image holen, neu starten. Docling erscheint fast jede Woche neu. Danach das Übungsdokument noch einmal umwandeln und mit dem gespeicherten Ergebnis vergleichen.

1 Rechenzeit und Speicher

1Im Ordner /opt/docling
time curl -s -X POST http://127.0.0.1:5001/v1/convert/file -F files=@nordwerk-produktblatt.pdf -o /dev/null
docker stats --no-stream docling
Für die drei Seiten des Übungs-PDFs sechs bis 15 Sekunden auf vier Prozessorkernen, je nach Last auf dem Server. Die Zeit wächst mit Seitenzahl, Tabellen und Scans. Ein Handbuch mit hundert Seiten braucht Minuten. Das Limit von 50 Seiten in der Compose-Datei schützt vor Aufträgen, die den Server lange blockieren.
MessungWert
Übungs-PDF, 3 Seiten, Voreinstellungen6 bis 15 s, je nach Last
Speicher im Leerlauf0,8 GB nach dem Start, 1,9 GB nach der ersten Umwandlung
Speicher während einer Umwandlung2,1 bis 2,4 GB

docling-serve 1.35.0 (Docling 2.130.0), Prozessor-Image, VPS mit 4 vCPU, 23. September 2026.

2 Updates

docling-serve erscheint sehr häufig neu. Das Muster ist dasselbe wie bei n8n: feste Nummer, bewusst erhöhen, prüfen. Die Versionen stehen unter docling-serve/releases.

2Update
nano compose.yml               # Nummer hinter docling-serve-cpu: erhöhen
docker compose pull
docker compose up -d
curl -s http://127.0.0.1:5001/health; echo
3Danach: Kontrollwerte prüfen
curl -s -X POST http://127.0.0.1:5001/v1/convert/file -F files=@nordwerk-produktblatt.pdf -F to_formats=md -F to_formats=json -o neu.json
diff <(jq -r .document.md_content ergebnis.json) <(jq -r .document.md_content neu.json) && echo 'Markdown unverändert'
Kein Unterschied: gut. Gibt es einen, die Stellen aus kontrollwerte.md ansehen. Eine neue Version kann eine Fußnote plötzlich mitnehmen oder eine Tabelle anders schneiden. Beides ändert die Antworten in Stufe 10.
↩️ Rückweg: Docling hat keine Datenbank, die beim Update umgebaut wird. Die alte Nummer eintragen und docker compose up -d reicht.

✓ Kurz geprüft

Stufe 12

Grenzen

Vier Regeln, und was diese Übung nicht zeigt.

Stufe 12 · Worauf es ankommt

Sprecherstimme synthetisch erzeugt (Text-to-Speech).

Vier Regeln zum Schluss. Untertitel lassen sich im Player zuschalten.
Was im Video gesagt wird

Erstens: Nach jeder Umwandlung die Kontrollwerte prüfen. Eine Tabelle, ein Scan, eine Fußnote. Das dauert eine Minute.

Zweitens: Zahlen aus Scans nie ungeprüft übernehmen. Eine falsche Ziffer sieht aus wie eine richtige.

Drittens: Das Markdown ist nicht alles. Fußnoten und Text in Bildern stehen im JSON.

Viertens: Handschrift, Formeln und sehr freie Layouts bleiben schwierig. Dort hilft nur ein Mensch, der gegenliest.

1 Vier Regeln

  1. Nach jeder Umwandlung die Kontrollwerte prüfen. Eine Tabelle, ein Scan, eine Fußnote. Das dauert eine Minute.
  2. Zahlen aus Scans nie ungeprüft übernehmen. Eine falsche Ziffer sieht aus wie eine richtige (Stufe 7).
  3. Das Markdown ist nicht alles. Fußnoten und Text in Bildern stehen im JSON (Stufe 8).
  4. Handschrift, Formeln und sehr freie Layouts bleiben schwierig. Dort hilft nur ein Mensch, der gegenliest.

2 Was diese Übung nicht gezeigt hat

  1. Handschrift und Formeln kommen im Übungs-PDF nicht vor, dazu gibt es hier keine Messung. Docling hat für Formeln und Bilder eigene Anreicherungen, die mehr Rechenzeit kosten.
  2. Andere Formate. Docling liest auch Word, PowerPoint, HTML und Bilder. Die Fallen sind andere, das Vorgehen bleibt: Kontrollwerte festlegen, umwandeln, nachsehen.
  3. Große Mengen. Für viele Dokumente gibt es die asynchrone Schnittstelle (/v1/convert/file/async) und eine Fassung mit Grafikkarte. Beides ist nicht Teil dieser Schulung.
  4. Dokumentensuche. Das Ergebnis lässt sich in Open WebUI oder LibreChat als Wissensquelle laden. Dort entscheidet dann zusätzlich die Schnipselbildung, was ankommt.
💡 Wer Dokumente aus dem eigenen Betrieb so aufbereiten und in Abläufe einbauen will: Das ist Stoff der Live-Schulung Automatisierung, siehe Karte links unten.

✓ Kurz geprüft

Bonus

Befehle zum Kopieren

Alles aus den zwölf Stufen an einer Stelle, in der Reihenfolge, in der man es braucht.

1 Übungsdateien

  1. nordwerk-produktblatt.pdf: das Produktblatt mit drei Fallen
  2. kontrollwerte.md: die Kontrollwerte und alle Messungen dieser Schulung
  3. compose.yml: die Compose-Datei aus Stufe 3
  4. frag-das-dokument.json: der n8n-Ablauf zum Einfügen (Datei öffnen, alles kopieren, in n8n Strg+V). Er enthält keine Zugangsdaten, den Zugang wählst Du im Knoten GLM.

2 Installation

1/opt/docling/compose.yml
services:
  docling:
    image: quay.io/docling-project/docling-serve-cpu:v1.35.0
    container_name: docling
    restart: unless-stopped
    ports:
      - "127.0.0.1:5001:5001"
    environment:
      DOCLING_SERVE_ENABLE_UI: "1"
      DOCLING_SERVE_MAX_NUM_PAGES: "50"
      DOCLING_SERVE_MAX_FILE_SIZE: "20971520"
    mem_limit: 5g
    networks:
      - default
      - n8n

networks:
  n8n:
    name: n8n_default
    external: true
2Starten und prüfen
docker compose up -d
curl -s http://127.0.0.1:5001/health; echo
docker stats --no-stream docling
3Tunnel (auf Deinem Rechner)
ssh -N -L 5001:127.0.0.1:5001 root@DEIN-SERVER
# dann: http://localhost:5001/ui/

3 Schnittstelle und JSON

4Übungs-PDF auf den Server (auf Deinem Rechner)
scp nordwerk-produktblatt.pdf root@DEIN-SERVER:/opt/docling/
5Umwandeln per Schnittstelle
curl -s -X POST http://127.0.0.1:5001/v1/convert/file \
  -F files=@nordwerk-produktblatt.pdf -F to_formats=md -F to_formats=json \
  -o ergebnis.json
6Suchen mit jq
apt install -y jq
jq -r .document.md_content ergebnis.json | grep -c Österreich
jq '.document.json_content.texts[] | select(.label=="footnote") | {label, text, parent}' ergebnis.json
jq -r '.document.json_content.texts[] | select(.parent["$ref"] | startswith("#/pictures")) | .text' ergebnis.json

4 Im n8n-Ablauf

7Code-Schritt „Kontext bauen“
const d = $json.document;
// Fußnoten und Text in Bildern stehen nur im JSON, nicht im Markdown
const ergaenzungen = d.json_content.texts
  .filter(t => /^#\/(tables|pictures)\//.test(t.parent?.$ref ?? ''))
  .map(t => '- ' + t.text);
return { kontext: d.md_content + '\n\n## Ergänzungen (Fußnoten, Text in Bildern)\n' + ergaenzungen.join('\n') };
8Systemanweisung
Beantworte die Frage nur mit Angaben aus dem Dokument. Wenn die Antwort nicht im Dokument steht, sag das. Nenne kurz die Stelle, auf die du dich stützt. Antworte in höchstens drei Sätzen, als einfacher Text ohne Markdown.

5 Aufräumen und weiterlesen

9Übungsinstanz entfernen
cd /opt/docling && docker compose down
docker image rm quay.io/docling-project/docling-serve-cpu:v1.35.0
  1. Docling-Dokumentation
  2. docling-serve: Schnittstelle, Umgebungsvariablen, Releases
  3. n8n · Docker · Open WebUI · LibreChat
Lernkontrolle

Quiz

7 Fragen quer durch die Stufen. Ab 6 richtigen Antworten schaltest du dein Zertifikat frei.

Frage 1 von 7
…
Abschluss

Dein Zertifikat

Glückwunsch! Trage deinen Namen ein und drucke das Zertifikat (oder speichere als PDF).

Das ist eine Vorschau. Das Zertifikat wird freigeschaltet, sobald Du im Quiz mindestens 6 von 7 Fragen richtig beantwortet hast. Bis dahin trägt es das Wasserzeichen „Muster“ und lässt sich nicht drucken.
FL
Florian Ludwig
AI Consultant · Kutzschbach INNOVATIONS
Zertifikat
Docling — PDFs so aufbereiten, dass KI sie richtig liest
Hiermit wird bestätigt, dass
Dein Name hier
den Workshop „Docling — PDFs so aufbereiten, dass KI sie richtig liest" erfolgreich abgeschlossen hat.
—Datum
★GEPRÜFT
Florian LudwigAI Consultant · Kutzschbach INNOVATIONS