Texterkennung bei gescannten PDFs

Aus dem professionellen Umfeld kennt es vielleicht der ein oder andere: Man scannt ein Dokument als PDF und nicht nur, daß es auf einem Laufwerk landet, nein, der Drucker führt auch eine Texterkennung auf das eingescannte Dokument aus und man hat ein durchsuchbares PDF. Im Heimbereich sieht es oft so aus, daß man zwar ein PDF erhält, die einzelnen Seiten jedoch sind Bilder, der Text nicht durchsuchbar und wehe man versucht dann etwas zu finden. Pech hat wer mehrere solcher Dokumente angesammelt hat und sie alle durchsuchen will...
Zwar gibt es Tools wie Gimagereader mit grafischer Oberfläche aber für die Konvertierung mehrerer Dokumente auf einmal ist dies nicht geeignet.
 
Zum Glück gibt es die Opensource Gemeinde und einige freie Tools. Ich habe mich für die Verwendung von Docker in Verwendung mit der Opensource Texterkennung (OCR Software) Tesseract entschieden. Zum einen habe ich mit Tesseract Erfahrung durch die Verwendung des Dokumentenmanagementsystems Seeddms und zum anderen wollte ich meine Dockerkenntnisse vertiefen.
 

Ergebnis:

 
Auf dem Desktop befindet sich nach erfolgreichem Abschluß ein Ordner Tesseract, der die Ordner input, output und tmp enthält. In den Ordner input werden ein oder mehrere PDFs kopiert, diese werden verarbeitet und eine Texterkennung ausgeführt. Das Ergebnis wird im Ordner output bereitgestellt. Den Bearbeitungsfortschritt kann man im Ordner tmp sehen.

Es sind folgende Tools nötig:

Da ich die Lösung unter Windows laufen lasse, ist Docker for Windows nötig: https://docs.docker.com/docker-for-windows/release-notes/
Virtualbox falls kein Windows 10 Professional verwendet wird: https://www.virtualbox.org/
Den Paketmanager Chocolatey für die Python Installation: https://chocolatey.org/install
Auf Grund von technischen Einschränkungen von Docker for Windows: docker-windows-volume-watcher
Verschiedene Ressourcen, die auf meiner Homepage zum Download stehen: Docker Tesseract Ressourcen

Vorbereitung:

  1. Zunächst muß die Installation von Docker for Windows erfolgen. Dies ist eine klassische Installation, also einfach weiter klicken und die Dialoge bestätigen. Auf PCs mit Windows 10 Home Edition muß vorher Virtualbox installiert werden, bei Windows 10 Professional wird die Microsoft Virtualisierungslösung Hyperv verwendet. Ich selbst nutze den letztgenannten Fall.

  2. Im Anschluß wird zunächst Python installiert, wie dies geht kann auf der chocolatey Seite nachgelesen werden (Link s.o). Dies bildet die Basis für das Programm docker-volume-watcher welches dann über den Python Paketmanager pip installiert werden kann. Dazu ruft man die Dos Box als Administrator auf (im Startmenü nach cmd suchen und mit der rechten Maustaste als Administrator ausführen). In der Dosbox gibt man folgendes ein:
    pip install docker-windows-volume-watcher

  3. Das Programm ist aus folgendem Grund nötig:

    Unter Docker for Windows werden Laufwerke, die vom Host, d.h. Windows PC freigegeben werden über eine "Netzfreigabe" dem Docker Container zur Verfügung gestellt. Leider wird für diese kein Dateisystemereignis an den Container gemeldet wenn eine Datei erstellt, geändert etc. wird. Mit anderen Worten: Der Container bekommt nichts davon mit wenn sich in den Verzeichnissen etwas ändert und weiß demnach auch nichts von neu hineinkopierten Dokumenten, die konvertiert werden sollen. Hier springt docker-volume-watcher ein. Das Programm überwacht Ordner und sendet ein Ereignis an den angegebenen Container, so daß dort Änderung im Verzeichnis bekannt werden und die Verarbeitung beginnen kann.

  4. Als nächstes sollte man die xml Datei für die Windows Aufgabenplanung importieren: docker-volume-watcher.xml Ich habe mich dafür entschieden, da die Aufgabe im Hintergrund ohne eine Dosbox läuft.

Vorgehen:

  1. Nachdem Docker und die nötige Infrastruktur installiert ist, muß das Herzstück, das Image und schließlich der Dockercontainer erstellt werden. Die Pfade zur Dockerdatei und den Ressourcen sind je nach Umgebung anzupassen:

    docker --debug build -t localhost:5000/tesseract_ocr2 --no-cache X:\docker\tesseract_docker --file "X:\docker\tesseract_docker\tesseract_docker.txt"
  2. Mit dem Befehlt wird, wenn das Dockerfile aus den von mir zur Verfügung gestellten Ressourcen genutzt wird, ein auf Debian Linux basierender Container erstellt, der neben tesseract auch imagemagick und ein paar PDF Tools enthält. Die Ressourcen müssen in einen Ordner entpackt werden, im Beispiel des o.a. Befehls: X:\docker\tesseract_docker

  3. Aus dem Image wird nun ein Container gestartet, wobei die Pfade für die jeweilige Umgebung angepaßt werden müssen:

    docker run --name tesseract_ocr -v /host_mnt/c/users/test/Desktop/tesseract/output:/media/output -v /host_mnt/c/users/test/Desktop/tesseract/tmp:/media/tmp -v /host_mnt/c/users/test/Desktop/tesseract/input:/media/input --net bridge --restart no -h localhost:5000/tesseract_ocr -e 'PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin' -d localhost:5000/tesseract_ocr /usr/bin/supervisord
     
  4. Der Container wird gestartet und die 3 Verzeichnisse:
    c/users/test/Desktop/tesseract/output
    c/users/test/Desktop/tesseract/input
    c/users/test/Desktop/tesseract/tmp

    in den Docker Container in das Verzeichnis /media mit den gleich lautenden Unterordnern gemappt

  5. Für den Start des Containers tesseract_ocr habe ich einfache Powershell Scripte erstellt, die die nötigen Verzeichnisse auf dem Desktop anlegen, den Container selbst starten und das Python Programm docker-volume-watcher:

    tesseract_container_start.ps1


    sowie gleiches für den Stop des Containers:

    tesseract_container_stop.ps1
  6. Die Hauptarbeit wird von dem von mir erstellten Script Tesseract.sh erledigt, welches ich auch für eine angepaßte seeddms Installation verwende. Ssie besteht im einzelnen aus folgenden Schritten:
  1. lesen des PDF Dokumentes welches in den Ordner Input gespeichert werden
  2. ermitteln ob das PDF Text enthält, wenn ja erfolgt keine Texterkennung und die Eingabedatei wird in den Ordner Output kopiert
  3. extrahieren der einzelnen Seiten eines PDF Dokuments in Bilder mit Hilfe der Software imagemagick
  4. Anwendung der Texterkennung von Tesseract auf die einzelnen Bilder und Erstellung von einzelnen PDF Dateien pro Seite, diese PDFs enthalten durch Tesseract durchsuchbaren Text als unsichtbare Ebene, die über das Bild gelegt ist
  5. verbinden aller einzelnen PDF Dokumente zu einer Datei
  6. kopieren des fertigen PDFs in den Ordner Output
  7. Löschung der temporären Dateien im Ordner Temp
Hinweis: Um die Installation an sich zu vereinfachen habe ich ein einfaches Installationsscript geschrieben, welches als Admin ausgeführt werden muß: install.bat Wie üblich muß der Inhalt an die jeweilige Umgebung angepaßt werden.
 
Bei Fragen und Problemen so wie Hilfe bei der Einrichtung, stehe ich Ihnen gern zur Verfügung!

Quellenangabe:

Docker: https://www.docker.com/
Docker Windows Volume Watcher: https://github.com/merofeev/docker-windows-volume-watcher
 
 
Cookies erleichtern die Bereitstellung unserer Dienste. Mit der Nutzung unserer Dienste erklären Sie sich damit einverstanden, dass wir Cookies verwenden.
Weitere Informationen Ok