Benutzer-Werkzeuge

Webseiten-Werkzeuge


linux:pdf_oracle_linux_9_documenten_scanner

Oracle Linux 9 - PDF Dokumente intelligent auslesen - Docling

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:

  1. Freigebenes Verzeichnis /data/dokumente/IN ⇐ hier wird eine zu verarbeitendes Dokument eingestellt
  2. Job der das IN Verzeichnis überwacht
  3. Job erkennt neue Datei und startet Verarbeitung
    1. Auslesen des Textes mit docling inkl. Fehlerbehandlung bei „ungewöhnlichen“ PDF Formaten
    2. Definieren eines Qualitätsfaktors wie gut die Erkennung war
    3. Hochladen json Text und der PDF Datei in den Doc Store in der Oracle Cloud mit einem Rest Service
    4. Nach der Verarbeitung verschieben nach /data/dokumente/DONE
Fazit

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.


Installation

Ablauf:

  • Oracle Linux 9 Basis System installiert
  • Voraussetzung prüfen
    • /tmp » 10GB frei!
    • /opt » 30GB frei (für docling inkl. easyocr ca. 7.5GB und für alle Modelle min 17GB benötigt! )
    • /var » 10GB frei
  • User OCR angelegt
  • Docling installieren mit Python PIP Installer unter dem User OCR
    • Installation erfolgt unter /opt, falls /home « 10GB muss cache und temp auf größeren Platten liegen mit je 10GB freien Platz!
  • IN Verzeichnis zur Verfügung stellen
  • Job für die Überwachung neuer Dateien in IN
    • Script für das Umwandeln in Text und verschieben nach OUT
  • Job für die Überwachung neuer Dateien in OUT
    • Script für den Upload in die Cloud

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.


Basis System

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

User für den Dokumenten Prozess anlegen:

groupadd -g 1200 dokumente
 
useradd -u 1300 -g dokumente  ocr
passwd ocr

Dokumente Ablage

root

mkdir -p /srv/docStore
 
cd /srv/docStore
 
 
mkdir IN
mkdir OUT
mkdir history
mkdir log
mkdir bin
 
chown -R ocr:dokumente /srv/docStore

Docling Home für die Binaries

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

tesseract für den user ocr konfigurieren

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

Docling Installation

Zugriff auf die folgenden Urls sicherstellen (falls Maschine hinter einer APP Firewall)

  • pypi.org/simple/ (Index für Paketlisten)
  • pypi.org/pypi (Metadaten-API)
  • files.pythonhosted.org (Download der Paketdateien)
  • bootstrap.pypa.io (Für get-pip.py und pip-Upgrade)
  • github.com
  • *.github.io
  • raw.githubusercontent.com/ (für Pakete direkt aus GitHub-Repos)
  • unpkg.com

Für die Modelle im Default:

  • modelscope.cn
  • huggingface.co
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

Python Suchpfade hinterlegen

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

Upgrade

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

Docling OCR Verwendung

OCR

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

Docling VLM Verwendung

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.

Modelle herunterladen

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

VLM

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.


Kleine Probleme lösen

GLPH Problem mit PDFs mit Text und Bilder aber fehlenden Fonts Mapping

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

PDF Drucken

Lösung Poppler Lib installieren als root:

dnf install poppler poppler-utils 
Problem Dokument erkennen
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.

Seitenanzahl ermitteln
pdfinfo bundesanzeiger_problem_datei.pdf
..
Pages: 4
..
Images erzeugen

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
Images in md wandlen
/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

Gescannte Dokumente werden nicht per OCR ausgelesen

siehe dazu auch https://github.com/docling-project/docling/discussions/2182

Parameter

 --pdf-backend=pypdfium2 

verwenden!


ModuleNotFoundError: No module named 'easyocr'

ModuleNotFoundError: No module named 'easyocr'
 
pip install easyocr

SSL Firewall Probleme lösen

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

Problem ModuleNotFoundError

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!


Problem - IOError: [Errno 28] No space left on device while installing

tmp hat auf der Umgebung nur 5GB, das ist zu klein!

Größere Location setzen!

export TEMPDIR=/var/tmp

Problem importError: libGL.so.1

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

Quellen

Diese Website verwendet Cookies. Durch die Nutzung der Website stimmen Sie dem Speichern von Cookies auf Ihrem Computer zu. Außerdem bestätigen Sie, dass Sie unsere Datenschutzbestimmungen gelesen und verstanden haben. Wenn Sie nicht einverstanden sind, verlassen Sie die Website.Weitere Information
"Autor: Gunther Pipperr"
linux/pdf_oracle_linux_9_documenten_scanner.txt · Zuletzt geändert: von gpipperr