DecaTec

Programmieren, Fotografie, Home-Server und einiges mehr

Linux: OCR-Texterkennung für PDF-Dateien und Bilder

Logo OCR

Die Texterkennung (sog. OCROptical Character Recognition) sorgt bei Dokumenten verschiedenster Art dafür, dass Datei-Inhalte maschinell lesbar sind. Dadurch lassen sich Datei-Inhalte zum einen leicht markieren/kopieren (z.B. bei PDF-Dateien). Zum anderen werden die Inhalte der Dateien leicht durchsuchbar.

Der folgende Artikel zeigt daher, wie PDF-Dateien mit einer Texterkennung verarbeitet werden können. Ebenso wird gezeigt, wie Bilder einfach in PDF-Dokumente umgewandelt werden können, so dass diese danach ebenfalls maschinenlesbar sind.

OCR kurz erklärt

Bei OCR handelt sich es um die sog. Optical Character Recognition, also die Texterkennung bei Dokumenten, die an sich erst einmal nicht maschinenlesbar sind. Als Beispiel soll hier ein PDF-Dokument genannt sein. Der PDF-Standard wurde mit dem Gedanken entwickelt, dass PDF-Dateien unabhängig vom Anwendungsprogramm, vom Betriebssystem oder von der Hardware-Plattform jederzeit originalgetreu wiedergegeben werden können.

Nun wird euch sicherlich schon aufgefallen sein, dass es bei manchen PDF-Dateien vorkommt, dass hier keine Inhalte markiert/kopiert werden können. Hier fehlt dann ein sog. Text-Layer, der die Inhalte der Datei nochmals in maschinenlesbarer Form enthält. Wenn ein solcher Text-Layer vorhanden ist, lassen sich Inhalte in der PDF-Datei markieren und somit auch kopieren.

PDF mit Text-Layer: Hier können Inhalte markiert und kopiert werden

PDF mit Text-Layer: Hier können Inhalte markiert und kopiert werden

Genau dieser Text-Layer kann nun mittels OCR „nachgerüstet“ werden. Anschließend können Datei-Inhalte markiert/kopiert werden und sind – da maschinenlesbar – auch durchsuchbar. Beispielsweise kann im Windows-Explorer nach Inhalten gesucht werden, indem dem Suchbegriff noch „inhalt: “ vorangestellt wird.

Suche nach Datei-Inhalten im Windows-Explorer

Suche nach Datei-Inhalten im Windows-Explorer

Einziger Nachteil: Durch den zusätzlichen Text-Layer werden die Dateien etwas größer. Angesichts der Vorteile, die ein Text-Layer bietet, ist dieser Nachteil allerdings zu vernachlässigen.

Auf der Suche nach Programmen, die PDF-Dateien mit einem OCR-Text-Layer versehen können, gibt es unter Windows leider nicht viele Programme: Diese sind zudem meist kostenpflichtig oder zwingen den Benutzer zu einem bestimmten Workflow bei der Bearbeitung von PDF-Dateien.

Unter Linux sieht die Sache allerdings anders aus…

OCR für PDF-Dateien: OCRmyPDF

OCRmyPDF ist ein Kommandozeilen-Programm für Linux, mit dem PDF-Dateien einfach mit einem Text-Layer versehen werden können. Tesseract kommt dabei als OCR-Engine zum Einsatz.

Installation OCRmyPDF

Bei Debian und Ubuntu ist es bereits in den Paketquellen enthalten, so dass es einfach mit einem Befehl installiert werden kann:

Auch wenn das Programm bei manchen Distributionen nicht in den Paketquellen enthalten ist, kann es mit der Installationsanleitung auch hier installiert werden.

Bei der Installation werden alle automatisch alle Abhängigkeiten installiert, die für die Erkennung von englischen Texten benötigt werden. Damit auch Texte in anderen Sprachen erkannt werden können, müssen noch zusätzliche Sprach-Dateien für Tesseract installiert werden. Um beispielsweise auch deutsche Texte erkennen zu können, wird das deutsche Sprachpaket installiert:

Eine Liste mit allen verfügbaren Sprach-Dateien findet man hier.

OCR mit OCRmyPDF

Um nun eine PDF-Datei mit einem Text-Layer zu versehen, reicht folgender Befehl:

Die originale PDF-Datei (/mnt/temp/Dokument.pdf) wird dabei nach der Verarbeitung als neue Datei (/mnt/temp/Dokument-OCR.pdf) gespeichert.

Der Aufruf kann noch mit Parametern versehen werden, um die Umwandlung besser kontrollieren zu können. Um beispielsweise einen Hinweis auf die enthaltenen Sprachen zu geben, erweitern wir den Befehl um den Parameter -l deu+eng. Damit wird der OCR-Engine mitgeteilt, dass im umzuwandelnden PDF vermutlich die Sprachen Deutsch und Englisch enthalten sind.

Eine Übersicht über alle möglichen Parameter findet man in der Dokumentation zu OCRmyPDF.

An dieser Stelle sei erwähnt, dass OCRmyPDF teilweise Warnungen ausgibt. Dies kann verschiedenste Ursachen haben, meistens ist dabei allerdings die Qualität des Ausgangs-Dokuments ausschlaggebend. Wenn dieses ein schlechter Scan ist, dann tut sich die Texterkennung hier schwer. Die Warnungen von OCRmyPDF können dabei allerdings ignoriert werden, es kann lediglich sein, dass die Texterkennung nicht sehr gut war und im Text-Layer des PDFs nicht alle Worte korrekt erkennt worden sind.

OCRmyPDF erzeugt standardmäßig PDF/A-Dateien. PDF/A ist dabei ein Dateiformat zur Langzeitarchivierung von PDF-Dateien. Alle Elemente, die zur Anzeige von PDF/A-Dokumenten benötigt werden, müssen dabei in der Datei selbst enthalten sein. Das sorgt dafür, dass PDF/A-Dateien immer etwas größer sind als normale PDF-Dateien. Es kann auch passieren, dass PDF/A-Dateien nicht alle Funktionen normaler PDF-Dateien bieten (da z.B. kein Javascript enthalten sein darf). Für den Privatgebrauch ist es daher eine Überlegung wert, für maximale Kompatibilität statt PDF/A-Dateien normale PDFs erzeugen zu lassen. Dies kann einfach mit dem Parameter –output-type pdf bewerkstelligt werden.

Ein vollständiger Aufruf von OCRmyPDF kann daher meist so aussehen:

OCR für Bilder: Umwandlung in (OCR-)PDF mittels Tesseract

Als ich vor etlichen Jahren angefangen habe, Dokumente (wie z.B. Rechnungen) zu Scannen, um diese auf dem Rechner archivieren zu können, habe ich diese noch nicht als PDF-Dateien, sondern als einfache Bild-Dateien (JPG) gespeichert. Dieses Dateiformat ist für diesen Zweck nicht gerade optimal, daher sollten diese Bild-Scans in PDF-Dateien konvertiert werden.

Hier kann OCRmyPDF auch zum Einsatz kommen, um diese Bilder in PDF-Dateien umzuwandeln. Allerdings habe ich hier mit Tesseract bessere Erfahrungen gemacht, so dass ich diese Dokument-Bilder eigentlich immer direkt über Tesseract in PDFs konvertieren lasse.

Die OCR-Engine Tesseract wurde ja bereits mit OCRmyPDF installiert. Falls dies noch nicht geschehen ist, reichen folgende Befehle, um Tesseract und die entsprechenden Sprach-Dateien zu installieren:

Hier werden die Sprach-Dateien für Englisch und Deutsch mit installiert. Eine Übersicht über alle vorhandenen Sprach-Dateien findet man hier.

Die Umwandlung in PDFs mit Text-Layer erfolgt dann über folgenden Befehl:

Der erste Parameter ist dabei das Input-Bild. Mit dem zweiten Parameter wird die Output-Datei angegeben (ohne Datei-Endung „.pdf“). Mit -l deu+eng wird der OCR-Engine wieder ein Hinweis auf die enthaltenen Sprachen gegeben. Der letzte Parameter (pdf) sorgt letzten Endes für die Umwandlung in eine PDF-Datei (und setzt die richtige Datei-Endung für die Output-Datei).

Automatisiert mit Skript

Jede PDF-/Bild-Datei nun einzeln mit einem Text-Layer zu versehen oder in eine (OCR-)PDF-Datei umzuwandeln, erfordert jedoch einiges an Aufwand. Das dachte ich mir auch, als ich die Vorgabe hatte, hunderte Dateien durch die Texterkennung zu jagen.

Aus diesem Grund habe ich ein Bash-Skript erstellt, welches die oben genannten Aufrufe automatisiert.

OCRmyFiles @ GitHub

Nach dem Download des Skripts sollten noch folgende Punkte im selbst Skript angepasst werden:

  • inputDirDefault/outputDirDefault: Standard-Verzeichnisse für Eingabe/Ausgabe.
  • ocrmypdfCmdArgs: Parameter für den Aufruf von OCRmyPDF.
  • imageConvertCmdArgs: Parameter für den Aufruf von Tesseract zur Umwandlung von Bildern in PDF-Dateien.

Bevor das Skript nun ausgeführt werden kann, muss dieses noch als auführbar markiert werden:

Nun erwartet das Skript beim Aufruf zwei Parameter:

  • Ein Eingangs-Verzeichnis, in dem sämtliche PDFs/Bilder enthalten sind, die mittels Texterkennung behandelt werden sollen.
  • Ein Ausgangs-Verzeichnis, in dem die Ergebnisse gespeichert sind

Ein typsicher Aufruf des Skripts sieht dann folgendermaßen aus:

Wenn diese Parameter weggelassen werden, werden die Standard-Verzeichnisse für Eingang/Ausgang genutzt (definiert in den Variablen inputDirDefault/outputDirDefault, siehe oben).

Das Skript führt nun folgendes aus:

  • Es scannt das Eingangs-Verzeichnis (rekursiv) auf PDF-Dateien und Bilder.
  • PDF-Dateien werden mittels OCRmyPDF mit einem Text-Layer versehen.
  • Bild-Dateien werden in (OCR-)PDFs umgewandelt.
  • Alle anderen Dateien werden ohne Änderung in das Ausgabe-Verzeichnis kopiert.

Nach dem Aufrufen des Skripts sollten sich im Ausgangs-Verzeichnis die gleiche Anzahl Dateien und dieselbe Verzeichnisstruktur befinden wie im Eingangs-Verzeichnis. Die (PDF-)Dateien werden jedoch etwas größer sein, da sie nun einen zusätzlichen Text-Layer beinhalten.

Das Skript ist unter MIT-Lizenz frei auf GitHub verfügbar, so dass jeder es an die eigenen Bedürfnisse anpassen und erweitern kann.

Aus der Praxis

Mit diesem Skript wurde die Texterkennung von PDFs und Dateien nun weitgehendst automatisiert. Dies kann nun beispielsweise genutzt werden, um Dokumente durchsuchbar in der Cloud abzuspeichern. Im vorherigen Artikel Volltextsuche in Nextcloud (mit OCR) wurde beschrieben, wie man eine Volltextsuche in Nextcloud installieren kann. Hat man nun seine PDF-Dateien mittels OCR mit einem Text-Layer versehen, können diese in der Cloud einfach durchsucht werden.

Wenn man nun z.B. Dokumente mittels Scanner als PDF scannt, landen diese zunächst einmal in einem speziellen Eingangs-Verzeichnis (z.B. /mnt/LinuxShare/OCR/Input – in meinem Fall ist dies eine Netzwerk-Freigabe unter Windows). Anschließend lässt man das Skript für die Texterkennung laufen. Dieses erzeugt in einem Ausgangs-Verzeichnis (z.B. /mnt/LinuxShare/OCR/Output) die mit einem Text-Layer versehenen PDF-Dateien. Nun können diese Dateien in die Cloud hochgeladen werden. Nach dem nächsten Durchlaufen des Cronjobs für Nextcloud werden die neuen Dateien von der Volltextsuche erfasst und können anschließend über die Suche in der Dateien-App gefunden werden (sowohl über den Datei-Namen, als auch über Datei-Inhalte).

Volltextsuche in Nextcloud: PDFs mit Text-Layer können hier einfach durchsucht werden

Volltextsuche in Nextcloud: PDFs mit Text-Layer können hier einfach durchsucht werden

Fazit

Nach dem OCR-Scan für PDFs und Bilder können Inhalte dieser Dateien leicht kopiert werden. Darüber hinaus sind die Datei-Inhalte durchsuchbar. Gerade zu Zwecken der Archivierung ist dies unabhängig vom verwendeten Speicherort (Cloud, lokales Dateisystem, etc.) eine äußerst sinnvolle Angelegenheit. Damit kommt man dem „papierlosen Büro“ schon einen großen Schritt näher.

Weiterführende Artikel

Links

, , , , ,

Kommentare: 2

  • Michael sagt:

    Hallo Jan,

    wie gut ist die Qualität der Texterkennung? Mit der kommerzieller Anbieter vergleichbar?

    Herzliche Grüße
    Michael

    • Jan sagt:

      Hi Michael,

      erfahrungsgemäß funktioniert die Texterkennung ziemlich gut. Leider habe ich keinen Vergleich zu kommerziellen Anbietern.
      Allerdings ist das denke ich auch alles eine Frage des Ausgangs-Materials: Wenn der Scan schon schlechte Qualität hat, dann wird die Texterkennung auch nicht sonderlich viel leisten können. Aus der Erfahrung heraus würde ich jedoch sagen, dass es selbst mit Zeitschriften-Artikeln, die mit dem Spartphone abfotografiert worden sind und dementsprechend nur mittelmäßige Qualität haben, sehr gut funktioniert.

      Gruß,
      Jan

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.