xsane2OCRmyPDF
Dieser Artikel wurde für die folgenden Ubuntu-Versionen getestet:
Ubuntu 20.04 Focal Fossa
Du möchtest den Artikel für eine weitere Ubuntu-Version testen? Mitarbeit im Wiki ist immer willkommen! Dazu sind die Hinweise zum Testen von Artikeln zu beachten.
Zum Verständnis dieses Artikels sind folgende Seiten hilfreich:
xsane2OCRmyPDF ist ein Wrapper-Skript für XSane, mit dem einfach durchsuchbare PDF-Dateien mit einer eingebetteten Textebene erstellt werden können. Verwendet werden econvert
aus ExactImage, tiff2pdf
(aus dem Paket libtiff-tools), OCRmyPDF, indirekt also das Texterkennungsprogramm tesseract-ocr, pdftk, sowie yad. Die PDF-Erstellung von XSane selbst kann keine integrierte Texterkennung liefern, man kann darüber erstellte PDFs aber z.B. mit pdfsandwich mit einer Textlage versehen.
Funktionsweise¶
Die mit XSane eingescannten Vorlagen werden mit convert in ein bearbeitbares tiff-Format umgewandelt, mit tiff2pdf
(aus dem Paket libtiff-tools) in ein PDF überführt und via OCRmyPDF einer Texterkennung mit tesseract-ocr unterzogen.
In entsprechenden Betrachtern (Evince etc.) kann der Text durchsucht werden, und die Text-Fundstellen werden in der "Bildlage" angezeigt. Sollen mehrseitige PDF-Dateien erstellt werden, wird für die OCR-Erkennung derselbe Dateiname angegeben. Das Skript überprüft, ob bereits eine PDF-Datei mit dem Namen im angegebenen Verzeichnis vorhanden ist, und hängt, falls sie gefunden wird, eine weitere Seite an (dafür wird eine pdftk-Funktion verwendet). So lassen sich auch zu einem späteren Zeitpunkt die PDF-Dateien erweitern. Mit ExifTool kann außerdem der Titel, Bearbeiter etc. (der Name der PDF-Datei ohne Erweiterung), Bearbeiter etc. in das Dokument eingetragen, sodass bei einem Indizieren (z.B. via Tracker) der Titel korrekt ausgegeben werden kann.
Das Skript benötigt yad, um abzufragen, ob weitere Scans angehängt werden sollen; die Texterkennung erfolgt erst, wenn alle Vorlagen eingescannt sind. Um an ein bereits mit Textlayer versehenes PDF weitere Seiten anzuhängen, muss in -a
die OCRmyPDF-Optionen --force-ocr
(erzwingt Texterkennung) verwendet werden, ansonsten verweigert OCRmyPDF die Bearbeitung des PDFs. Eine Korrektur der Textlage ist für diese Version derzeit nicht möglich. Die Logdatei wird unter xsane2OCRmyPDF.log in /tmp abgelegt,
Vorbereitung¶
Folgende Pakete müssen installiert [1] werden:
xsane (universe)
exactimage (universe)
tesseract-ocr (universe, sowie die gewünschten Sprachpakete)
pdftk
ocrmypdf
libtiff-tools
yad
libimage-exiftool-perl (optional)
Befehl zum Installieren der Pakete:
sudo apt-get install xsane exactimage tesseract-ocr pdftk ocrmypdf libtiff-tools yad libimage-exiftool-perl
Oder mit apturl installieren, Link: apt://xsane,exactimage,tesseract-ocr,pdftk,ocrmypdf,libtiff-tools,yad,libimage-exiftool-perl
Das Skript selbst in einen Editor [2] kopieren, als xsane2OCRmyPDF.sh abspeichern und ausführbar[3] machen.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 | #!/bin/bash # xsane2OCRmyPDF - pdf with ocr directly from xsane # Copyright (C) 2014-2020 Heinrich Schwietering # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see <http://www.gnu.org/licenses/>. # ############################################################################## # # xsane2OCRmyPDF 0.3.2 # # *** pdf with searchable text layer *** # # ############################################################################## # # xsane2OCRmyPDF is a wrapper script to produce ocred pdf files with xsane. # It produces pdf files with a hidden, searchable text layer. tiff2pdf # (libtiff) is used to produce an initial pdf file from a tif file, multipage # pdf files are combined using pdftdk. # OCRmyPDF, utilizing tesseract-ocr, is used to produce a pdf file with a # text layer. # TEMP_DIR=/tmp/ # folder for temporary files (all files) ERRORLOG="xsane2OCRmyPDF.log" # file where STDERR goes if [[ -z "$1" ]] then echo "Usage: $0 [OPTIONS] You need to run the script as OCR-application for xsane! xsane2OCRmyPDF uses a pdf file created with econvert and tiff2pdf. The result is processed with OCRmyPDF to add a hidden text layer. Multipage pdf files are possible, using pdftdk. OPTIONS: -i <filename> - temporary XSANE file -o <filename> - name for the output -l <language> - defines the language used for recognition -a <options> - additional OCRmyPDF option e.g. to use convert or unpaper, optional Progress- & error-messages will be stored in this logfile: $TEMP_DIR$ERRORLOG xsane2OCRmyPDF depends on - XSane, http://www.xsane.org/ - econvert, part of ExactImage, https://exactcode.com/opensource/exactimage/ - tiff2pdf, part of libtiff, http://www.remotesensing.org/libtiff/ - OCRmyPDF, https://https://github.com/jbarlow83/OCRmyPDF - unpaper, https://www.flameeyes.eu/projects/unpaper - tesseract-ocr 3.0x, https://github.com/tesseract-ocr - pdftk, http://www.pdflabs.com/tools/pdftk-the-pdf-toolkit/ - yad, http://sourceforge.net/projects/yad-dialog/ Some coding was stolen from 'ocube' http://www.geocities.com/thierryguy/ocube.html This OCRmyPDF adaption is based on xsane2tess http://doc.ubuntu-fr.org/xsane2tess, Hints always welcome! heinrich (dot) schwietering (at) gmx (dot) de " exit fi # get options... while getopts ":i:o:l:a:" OPTION do case $OPTION in i) # input filename (with path) FILE_PATH="$OPTARG" ;; o) # output filename FILE_OUT_LONG="$OPTARG" ;; l) # recognition language LAN="$OPTARG" ;; a) # additional OCRmyPDF option OCROPT="$OPTARG" ;; esac done # redirects STDERR to ERRORLOG exec 2>>$TEMP_DIR$ERRORLOG # strips extension from FILE_OUT_LONG FILE_OUT="${FILE_OUT_LONG%.*}" echo "Start~~~+++~~~~+++~~~" $(date +%c) 1>&2 #produces a pdf file for OCRmyPDF econvert -i "$FILE_PATH" --resolution 300 -o "$FILE_OUT.1.tiff" 1>&2 tiff2pdf -o "$FILE_OUT.1.pdf" "$FILE_OUT.1.tiff" 1>&2 # check if output file exists { if [[ -a "$FILE_OUT.pdf" ]] #add new page to existing file using pdftk then pdftk "$FILE_OUT.pdf" "$FILE_OUT.1.pdf" cat output "$FILE_OUT.2.pdf" mv "$FILE_OUT.2.pdf" "$FILE_OUT.pdf" echo "file added to $FILE_OUT.pdf" 1>&2 #if not start new output file else cp "$FILE_OUT.1.pdf" "$FILE_OUT.pdf" echo "$FILE_OUT.pdf started" 1>&2 fi } # Asks for further scans to be added $(yad --geometry -0-0 --title="xsane2OCRmyPDF" --button=Ja:2 --button=Nein:4 --text="Sollen weitere Seiten gescannt werden?") ret=$? { if [[ $ret -eq 4 ]] ; then # produce a pdf file with OCRmyPDF ocrmypdf -l $LAN $OCROPT "$FILE_OUT.pdf" "$FILE_OUT.new.pdf" mv "$FILE_OUT.new.pdf" "$FILE_OUT.pdf" echo "$FILE_OUT.pdf ocred using OCRmyPDF" 1>&2 fi } # Remove temporary files rm "$FILE_OUT.1.pdf" rm "$FILE_OUT.1.tiff" rm "$FILE_OUT" echo "End ~~~+++~~~~+++~~~"$(date +%c) 1>&2 |
Das Skript ist eine Weiterentwicklung des xsane2tess-Skriptes, das auf ubuntu-fr.org 🇫🇷 veröffentlicht worden ist. Man kopiert es ggf. mit Root-Rechten[4] nach /usr/local/bin, so lässt sich das Skript von allen Benutzern verwenden.
Konfiguration¶
Das Temporärverzeichnis in xsane2OCRmyPDF.sh (Zeile 35) kann entsprechend der eigenen Wünsche angepasst werden (auf schließendes / achten!), dort wird auch die xsane2OCRmyPDF.log-Datei abgelegt, in der man ggf. Fehlermeldungen einsehen kann, falls das Skript nicht wie erwartet funktionieren sollte.
Benutzung¶
In "XSane → Einstellung → Konfiguration → Texterkennung" wird als OCR-Befehl "/PFAD/ZU/xsane2OCRmyPDF.sh" sowie weitere Optionen zur Steuerung angegeben. Mit -a
können zusätzliche Optionen für OCRmyPDF angegeben werden. Bei der Angabe des Dateinamens in XSane ist eine Endungsangabe nicht nötig. Im Konfiguartionsfenster werden als weitere Optionen "-i" für die Eingabe- und "-o" für die Ausgabedatei angeben, die weiteren Felder bleiben leer. Die Option "Benutze GUI Fortschritts Pipe" darf nicht angehakt sein (nicht nur wegen der orthographischen Mängel...), da sonst das Wrapper-Skript nicht geschlossen werden kann.
Den Dateizählerwert im Hauptfenster auf 0
setzen, da XSane ansonsten automatisch für jeden neuen Scan einen erhöhten Zähler an die Datei anhängt; damit kann das Skript aber keine mehrseitige Datei erstellen! Für Scanner mit automatischem Vorlageneinzug (ADF) in "Einstellungen → Konfiguration → Speichern → Dateinamenzähler Länge" auch den Eintrag "nicht aktiv" wählen, wenn es Probleme beim "Zusammentragen" der Scans gibt.
Hinweis:
Die XSane-Funktion "Mehrseitig" kann für diese Art der PDF-Erstellung nicht genutzt werden, auch nicht das Ausgabeformat "PDF"! Derartig erstellte Dokumente können nur nachträglich mit Programmen wie OCRmyPDF, pdfsandwich oder pdfocr mit einer Textlage versehen werden!
Beispiel¶
/PFAD/ZU/xsane2OCRmyPDF.sh -l deu -a "--pdf-renderer hocr -s"
verwendet Tesseract mit deutscher Sprache, als zusätzliche Angabe die Option --pdf-renderer hocr
, die dafür sorgt, dass die Textlage lesbar dargestellt werden. Die Option -s
weist OCRmyPDF an, Seiten mit Text nicht nochmal zu bearbeiten - sinnvoll, wenn bestehende PDF-Dokumente erweitert werden sollen. Die zusätzlichen Optionen, insbesondere wenn mehrere verwendet werden sollen, müssen in Anführungsstrichen stehen!
Achtung!
Die Angaben müssen sehr exakt erfolgen, es dürfen zwischen den Optionen nur einfache Leerzeichen verwendet werden, sonst kommt es zu Fehlern!
Die Vorlage wird in XSane im Betrachter-Modus erstellt. Im Betrachter dann die Texterkennung (-Taste) wählen, für die Ausgabe keine Erweiterung angeben (auch nicht PDF!), es wird intern ein PDF-Datei daraus erstellt. Alternativ kann auch das Ausgabeformat "TEXT" gewählt werden, und als Modus "Speichern", wenn keine weiteren Einstellungen nötig sind. Dann wird der Scan direkt umgewandelt, ohne den Betrachter zu öffnen. Als Auflösung werden 300 dpi empfohlen, die besten Ergebnisse erzielt man meist mit der Einstellung "Strichzeichnung" (für sehr kleine Schriften, bei Waschzettel etc. ggf. höhere Auflösungen verwenden). Bei vorhandenem Dateinamen wird automatisch eine weitere Seite an die bestehende PDF-Datei im angegebenen Verzeichnis (Schreibrechte nötig!) angehängt.
Die Qualität der Texterkennung ist natürlich von der Qualität und dem Aufbau der Vorlage abhängig; je "verschachtelter" Text und Grafikelemente sind, desto schwieriger wird die exakte Zerlegung, und damit die Texterkennung. Für einfache Texte/Briefe etc. sollte es keine Probleme geben; bei sehr großen Unterschieden in den Zeichengrößen kann es allerdings zu Fehldarstellungen kommen.
Metadaten¶
Die Metadaten können automatisiert mit ExifTool bearbeitet werden. Um z.B. den in XSane verwendeten Dateinamen, und den jeweiligen Benutzer als Autor des PDF-Dokumentes einzutragen, kann das Skript um folgenden Eintrag (vor den "Aufräumanweisungen" # Remove temporary files
am Ende) ergänzt werden:
# write metadata exiftool -Title="${FILE_OUT##*/}" -Author="$USER" -Subject="${FILE_OUT##*/}" -Producer="xsane2OCRmyPDF" -m -overwrite_original "$FILE_OUT.pdf"
Weiter Angaben sind möglich, siehe die manpage zu exiftool
.
OCRmyPDF bietet auch die Möglichkeit, die Metadaten als Optionen mit anzugeben (siehe in der Hilfe-Funktion des Programms), diese müssten dann in der XSane-Konfigurationszeile mit aufgenommen werden.
Alternativen¶
gscan2pdf liefert momentan mit dem OCR-Engine tesseract-ocr gute Ergebnisse für "Sandwich-PDFs", da damit auch eine akzeptable Layout-Erkennung für die Passung der Lagen möglich ist.
OCRmyPDF ist ein Kommandozeilenprogramm, das momentan mit tesseract-ocr die besten Ergebnisse für die Textebenenerkennung und Passung für grafische PDF-Dateien liefert.
pdfsandwich beschreitet einen ganz ähnlichen Weg; es lassen sich allerdings keine PDF-Dateien erstellen, sondern nur bestehende um die Text-Lage erweitern. Ursprünglich für cuneiform konzipiert (und damit nur bis Version 0.8.0 sinnvoll verwendbar), existiert inzwischen auch eine Version für tesseract-ocr 3.03. die die interne PDF-Erstellung von tesseract verwendet.
pdfocr funktioniert nach ganz ähnlichem Prinzip wie pdfsandwich, hat aber mit Cuneiform > 0.9.0 dieselben Probleme.
In diesem Blogeintrag 🇬🇧 von Konrad Voelkel wird eine ähnliche Vorgehensweise beschrieben.
Weiterer Beitrag von Konrad Voelkel, der die Erstellung von PDF/a-Dateien 🇬🇧 behandelt.
ocrodjvu ist ein neu entwickeltes Programm, um Texterkennung für DjVu-Dateien durchzuführen. Eine Konvertierung von PDF-Dateien kann mittels pdf2djvu erfolgen, mit xsane2djvu auch eine direkte Erstellung. Die Texterkennung arbeitet generell zuverlässiger und die Dateien sind bei gleicher Qualität wesentlich kleiner als im PDF (Portable Document Format).
Links¶
PDF - Übersichtsartikel
Texterkennung - Übersichtsartikel