Aufgabe : Verträge liegen in PDF Formaten vor und müssen über eine AI Service ausgewertet werden
Da die Verträge teilweise eingescannt sind muss eine „echte OCR“ das auswerten.
Alternative direkt über die Datenbank Filter Oracle Text für die Indizierung binärer Daten verwenden
Daher wird nun das OpenSource Projekt docling getestet ob hier sich mit den vorhandenen Dokumenten gute Daten erzielen lasssen ⇒ Siehe dazu auch https://github.com/docling-project/docling und https://www.docling.ai/
Folgender Ablauf soll dann in der produktiven Umgebung damit umgesetzt werden:
Die Verarbeitung qualitativ hochwertiger PDF‑Dateien liefert gute Ergebnisse.
Sobald jedoch problematische Schriftarten verwendet werden oder das Dokument ausschließlich gescannte Inhalte enthält, gestaltet sich die Extraktion deutlich schwieriger und umständlicher.
Docling bietet im Ansatz eine umfassende Bibliothek, die alle wesentlichen Komponenten für die Aufbereitung von PDF‑Dateien in einer RAG‑Pipeline bereitstellt.
Dennoch erreicht die Lösung nicht ganz die Qualität spezialisierter End‑to‑End‑Produkte wie Docstrange von Nanonets (https://docstrange.nanonets.com/).
Auch der Einsatz des Mistral‑OCR‑Dienstes in Azure zeigte bei komplexen Dokumenten – insbesondere jenen aus dem Bundesanzeiger mit proprietären Fonts und Encodings – deutliche Schwächen.
Das OCR‑Modell von Nanonets (https://huggingface.co/nanonets/Nanonets-OCR2-3B) ließe sich vermutlich ebenfalls in die Docling‑Pipeline integrieren.
Das grundlegende Problem liegt jedoch weniger in der finalen Texterkennung als vielmehr darin, aus bestimmten PDF‑Formaten überhaupt zuverlässig Inhalte extrahieren zu können.
Wie bei vielen KI‑Projekten wird der Aufwand für die Aufbereitung und Bereinigung der Ausgangsdaten häufig unterschätzt. Der Schritt, die Datenbasis zunächst in eine verarbeitbare und lesbare Form zu bringen, erweist sich meist als deutlich zeitintensiver als erwartet. Eine angemessene Zeitplanung für diese Phase ist daher essenziell.
Ablauf:
In dieser Umgebung besteht die wesentliche Herausforderung darin, dass eine SSL‑Firewall ihr eigenes Zertifikat in die Zertifikatskette einschleust.
Deshalb ist es zwingend erforderlich, die entsprechenden Intermediate‑Zertifikate der firmeninternen Lösung in der lokalen CA zu hinterlegen.
In einer „normalen“ Umgebung ohne solche Eingriffe gestaltet sich die Installation deutlich unkomplizierter.
Oracle Linux 9 - Grundinstallation, ohne X ähnlich wie Ein Oracle Linux 8 Basis System als Grundlagen für eine Oracle Clusterware und Datenbank Installation vorbereiten
Weiteres installieren:
dnf install python pip
User für den Dokumenten Prozess anlegen:
groupadd -g 1200 dokumente useradd -u 1300 -g dokumente ocr passwd ocr
root
mkdir -p /srv/docStore cd /srv/docStore mkdir IN mkdir OUT mkdir history mkdir log mkdir bin chown -R ocr:dokumente /srv/docStore
Die Installation soll unter dem User ocr erfolgen, die Binaries sollen aber unter /opt/docling liegen.
mkdir -p /opt/docling # pip Cache für den Download unter dem user ocr
Pip Cache konfigurieren, falls das User Home Laufwerk zu klein (<10GB) ist:
mkdir -p /var/pip_cache chmod 777 /var/pip_cache vi /etc/pip.conf [global] cache-dir=/var/pip_cache
Problem: „make sure the TESSDATA_PREFIX environment variable is set to your „tessdata“ directory“
als Root installieren:
#ocr dnf install tesseract dnf install tesseract-langpack-deu tesseract-osd
Sprachpackete testen:
tesseract --list-langs List of available languages (2): deu eng
Zugriff auf die folgenden Urls sicherstellen (falls Maschine hinter einer APP Firewall)
Für die Modelle im Default:
su - ocr #Cache location prüfen # find the config file location under variant "global" pip config list -v # test if it worked pip config list pip cache dir #temp umleiten falls orginal /tmp < 5G export TEMPDIR=/var/tmp #easyocr installieren python -m pip install easyocr --target /opt/docling --trusted-host pypi.org --trusted-host files.pythonhosted.org #rapidocr zusätzlich installieren bei bedarf python -m pip install rapidocr onnxruntime --target /opt/docling --trusted-host pypi.org --trusted-host files.pythonhosted.org --upgrade # Mit Zertifikatsprüfung installieren pip install docling --target /opt/docling #alternativ wenn hinter ssl firewall ohne Zertifikatsprüfung installieren python -m pip install docling --target /opt/docling --trusted-host pypi.org --trusted-host files.pythonhosted.org
User ocr:
vi ~/.bashrc export TEMPDIR=/var/tmp export PYTHONPATH=/opt/docling:$PYTHONPATH export PATH=/opt/docling/bin:$PATH # falls pip dort CLI-Skripte abgelegt hat #CA explizit hinterlegen export REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-bundle.crt #falls temp zu klein export TMPDIR=/var/tmp . ~/.bashrc
Einen ersten Aufruf für eine URL Quelle testen:
docling https://baden-wuerttemberg.igmetall.de/dam/jcr:6e9b30ad-fd75-4005-b498-1be430baf604/ME_Industrie_NWNB_Montageabkommen.pdf
Mit „pip –upgrade“ wird die letzte Version von docling eingespielt
python -m pip install docling --upgrade --target /opt/docling --trusted-host pypi.org --trusted-host files.pythonhosted.org
OCR mit tesseract mit gescannten Dokumenten
export TESSDATA_PREFIX=/usr/share/tesseract/tessdata docling --from pdf --to md --pdf-backend=pypdfium2 --artifacts-path /daten/ki_modelle --ocr --ocr-engine tesseract --ocr-lang deu --image-export-mode placeholder --output ../OUT gpi_test.pdf
Mit der obigen OCR gehen wir ehr den klassischen Weg und extrahieren mit „normalen“ Tools den Text aus dem PDF.
Ein VLM - Vision-Language Model - versucht aus dem Bild den Text zu extrahieren.
Pfad anlegen als root:
mkdir /opt/ki_modelle chown -R ocr:dokumente /opt/ki_modelle/
user OCR
docling-tools models download --all -o /opt/ki_modelle
Aufruf:
export DOCLING_SERVE_ARTIFACTS_PATH=/opt/ki_modelle docling --to json --no-show-layout https://baden-wuerttemberg.igmetall.de/dam/jcr:6e9b30ad-fd75-4005-b498-1be430baf604/ME_Industrie_NWNB_Montageabkommen.pdf #alternativ docling --artifacts-path "/opt/ki_modelle/" FILE.pdf
Aufruf:
/opt/docling/bin/docling --to md --artifacts-path /daten/ki_modelle --vlm-model smoldocling --pipeline vlm --image-export-mode placeholder --output /daten/tarifbot/OUT gpi_test.pdf .. 2026-01-07 14:47:29,722 - INFO - All documents were converted in 347.33 seconds. ...
Interessanterweise konnte so ein Text aus einem PDF gelesen werden, das sich zuvor mit OCR nicht hat auslesen lassen!(siehe GLYP Problem weiter unten). Allerdings hat es in einer VM ohne GPU Unterstützung auch recht lang gedauert mit 347.33 s für 4 PDF Seiten.
Bei bestimmten PDF Dokumenten kann leider Docling keine Text vernünftig erkennen. Auch ein Update auf die aktuellste Version (01.2026) hat keine Verbesserung gebraucht. Auch der „pdf-backend“ Parameter bringt keine Verbesserung.
In dem PDF ist der Text als Text enthalten aber der Font Type ist „Type 3“ und „Custom“ Encoding, das kann dann vom PDF Backend nicht richtig ausgelesen werden.
Die Lösung ist es das PDF als Bild zu „drucken“ und seitenweise per OCR einzulesen
Lösung Poppler Lib installieren als root:
dnf install poppler poppler-utils
pdffonts bundesanzeiger_problem_datei.pdf name type encoding emb sub uni object ID ------------------------------------ ----------------- ---------------- --- --- --- --------- [none] Type 3 Custom yes no no 18 0 [none] Type 3 Custom yes no no 212 0 [none] Type 3 Custom yes no no 223 0
Wenn also mit pdffonts erkannt wird das hier die Type 3 Fonts und ein encoding „Custom“ vorliegt, wird das PDF als Bild gedruckt und dann mit docling das Bild verarbeitet.
pdfinfo bundesanzeiger_problem_datei.pdf
..
Pages: 4
..
Mit pdftoppm in Bilder drucken:
pdftoppm -h pdftoppm -f 1 -l 4 -forcenum -jpeg -jpegopt quality=95 bundesbundesanzeiger_problem_datei.pdf bundesbundesanzeiger_problem_datei_images
/opt/docling/bin/docling --to md --artifacts-path /daten/ki_modelle --ocr --ocr-engine tesseract --ocr-lang deu --image-export-mode placeholder --output /daten/tarifbot/OUT bundesbundesanzeiger_problem_datei*.jpg
Allerdings erzeugt das nun pro Bild eine MD datei.
cat bundesbundesanzeiger_problem_datei-*.md > bundesbundesanzeiger_problem_datei.md
siehe dazu auch https://github.com/docling-project/docling/discussions/2182
Parameter
--pdf-backend=pypdfium2
verwenden!
ModuleNotFoundError: No module named 'easyocr' pip install easyocr
ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self-signed certificate in certificate chain (_ssl.c:1147)
Interception Zertifikat mit aufnehmen: als Root:
cd /etc/ssl/certs/ #anzeigen openssl s_client -showcerts -servername www.modelscope.cn -connect www.modelscope.cn:443 </dev/null # interception zertifkate mit aufnehemen vi ca-bundle.trust.cert bzw. vi /etc/pki/ca-trust/extracted/openssl/ca-bundle.trust.crt #prüfen ob die schreibgeschützte Datei auch mit wq! geschrieben wurde! #auch in ca-bundle.crt aufnehmen! #testen wget --ca-certificate=/etc/ssl/certs/ca-bundle.crt https://huggingface.co #CA in bashrc expliziet hinterlegen vi /home/ocr/.bashrc export REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-bundle.crt
Falls beim Aufruf von Dogling über /opt/docling/bin ein „ModuleNotFoundError “ auftritt, weiß Python noch nicht wo es nach dem Libs suchen soll!
Die einfachste Lösung ist das Anpassen des PYTHONPATH, alternativ mit der Python venv Logik von beginn an arbeiten!
tmp hat auf der Umgebung nur 5GB, das ist zu klein!
Größere Location setzen!
export TEMPDIR=/var/tmp
Erster Aufruf wirft Fehler:
docling https://baden-wuerttemberg.igmetall.de/dam/jcr:6e9b30ad-fd75-4005-b498-1be430baf604/ME_Industrie_NWNB_Montageabkommen.pdf .. ImportError: libGL.so.1: cannot open shared object file: No such file or directory ..
Lösung:
pip uninstall -y opencv-python opencv-python-headless && pip install opencv-python-headless
Installation:
Doku:
Web: