Ubuntu 16.04 Xenial Xerus
Ubuntu 14.04 Trusty Tahr
Ubuntu 12.04 Precise Pangolin
xsane2sandwich ist ein Wrapper-Skript für XSane, mit dem einfach durchsuchbare PDF-Dateien mit einer eingebetteten Textebene erstellt werden können. Verwendet werden das Texterkennungsprogramm tesseract-ocr (ab Version 3.0x), um die Textebene in einem hOCR/html-Format zu erstellen, convert
aus ImageMagick, um die Bildausgabe von XSane in ein verarbeitbares Format umzuformen, hocr2pdf
aus der ExactImage-Suite zur Zusammenführung der Ebenen, sowie pdftk, um mehrseitige PDF-Dateien zu erstellen. 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.
Folgende Pakete müssen installiert [1] werden:
xsane (universe)
imagemagick
tesseract-ocr (universe, sowie die gewünschten Sprachpakete)
pdftk
exactimage
mit apturl
Paketliste zum Kopieren:
sudo apt-get install xsane imagemagick tesseract-ocr pdftk exactimage
sudo aptitude install xsane imagemagick tesseract-ocr pdftk exactimage
Das Skript selbst in einen Editor [2] kopieren, als xsane2sandwich.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 135 136 137 138 139 140 141 142 | #!/bin/bash # xsane2sandwich - pdf with ocr directly from xsane # Copyright (C) 2012, 2013 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/>. # ############################################################################## # # xsane2sandwich 0.2 # # *** pdf with searchable text layer *** # # ############################################################################## # # xsane2sandwich is a wrapper script to produce ocred pdf files with xsane. # It produces pdf files with a hidden, searchable text layer. tesseract-ocr is # used to produce a hOCR/html-file. convert is needed to produce a readable # for hocr2pdf. # The scan is converted into a pdf file using hocr2pdf, a part of exact image. # Multipage pdf files are produced using pdftdk, a title value is added, too. # TEMP_DIR=/tmp/ # folder for temporary files (all files) ERRORLOG="xsane2sandwich.log" # file where STDERR goes if [[ -z "$1" ]] then echo "Usage: $0 [OPTIONS] You need to run the script as OCR-application for xsane! xsane2sandwich uses a .tif file created with convert, and produces a 'split' pdf file. The scan result is ocred using tesseract and processed with hocr2pdf 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 <-hocr2pdf-option> - additional hocr2pdf options, optional Progress- & error-messages will be stored in this logfile: $TEMP_DIR$ERRORLOG xsane2sandwich depends on - XSane, http://www.xsane.org/ - convert, part of ImageMagick, http://www.imagemagick.org/script/index.php - tesseract-ocr 3.0x, https://github.com/tesseract-ocr - hocr2pfd, part of ExactImage, http://www.exactcode.de/site/open_source/exactimage/ - pdftk, http://www.pdflabs.com/tools/pdftk-the-pdf-toolkit/ Some coding was stolen from 'ocube' http://www.geocities.com/thierryguy/ocube.html This pdfsandwich 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 LANG="$OPTARG" ;; a) # additional hocr2pdf option HOCROPT="$OPTARG" ;; esac done # redirects STDERR to ERRORLOG exec 2>>$TEMP_DIR$ERRORLOG # strips extension from FILE_OUT_LONG FILE_OUT="${FILE_OUT_LONG%.*}" echo "~~~+++~~~~+++~~~" 1>&2 #produces a tif file for hocr2pdf TIF_FILE="$TEMP_DIR""xsane2tessResult".tif convert "$FILE_PATH" -compress none "$TIF_FILE" 1>&2 #create pdfmark echo "InfoKey: Title" > $FILE_OUT.pdfmark echo "InfoValue:`basename $FILE_OUT`" >> $FILE_OUT.pdfmark echo "InfoKey: Producer" >> $FILE_OUT.pdfmark echo "InfoValue: xsane2sandwich" >> $FILE_OUT.pdfmark # produce hocr-file file with tesseract tesseract "$FILE_PATH" "$FILE_OUT" -l "$LANG" "hocr" 1>&2 echo "tesseract -l $LANG $ENCOPT hocr used" 1>&2 # combine hocr-result with image and produce a pdf file hocr2pdf $HOCROPT -i "$TIF_FILE" -o "$FILE_OUT.new.pdf" < "$FILE_OUT.html" # check if outputfile exists if [[ -a "$FILE_OUT.pdf" ]] #add new page to existing file using pdftk then pdftk "$FILE_OUT.pdf" "$FILE_OUT.new.pdf" cat output "$FILE_OUT.2.pdf" mv "$FILE_OUT.2.pdf" "$FILE_OUT.pdf" echo "file added to $FILE_OUT.pdf" 1>&2 rm "$FILE_OUT.new.pdf" #if not start new output file else mv "$FILE_OUT.new.pdf" "$FILE_OUT.pdf" echo "$FILE_OUT.pdf started" 1>&2 fi # set pdf title pdftk $FILE_OUT.pdf update_info $FILE_OUT.pdfmark output $FILE_OUT-neu.pdf 1>&2 mv "$FILE_OUT-neu.pdf" "$FILE_OUT.pdf" # Remove temporary files rm "$FILE_OUT.txt" rm "$FILE_OUT.html" rm "$TIF_FILE" rm "$FILE_OUT.pdfmark" echo "~~~+++~~~~+++~~~"$(date +%c) 1>&2 |
Das Skript ist eine Weiterentwicklung des xsane2tess-Skriptes, das auf ubuntu-fr.org veröffentlicht worden ist. Man kopiert es am besten mit Root-Rechten[4] nach /usr/local/bin, so lässt sich das Skript von allen Benutzern verwenden.
Die von der unter Trusty Ubuntu 14.04 eingesetzte Tesseract-Version 3.03 speichert die hocr-Dateien mit den Textlageinformationen nicht mehr mit der .html-Endung sondern mit einer .hocr-Endung ab. Daher muss im Skript in einem Editor nach Zeile 112
1 | echo "tesseract -l $LANG $ENCOPT hocr used" 1>&2 |
etwas wie
1 | cp "$FILE_OUT.hocr" "$FILE_OUT.html" |
eingefügt werden, damit hocr2pdf die Daten wieder richtig zusammensetzen kann. Leider kommt es allerdings vermehrt zu Problemen mit überdimensionierten Schriften und damit verbunden schlechter Passung der Textlage, schlimmstenfalls können sogar ganze Textlagenteile so groß sein, dass sie nicht mehr komplett eingebunden werden können. Daher unter xsane2OCRmyPDF eine Version, die OCRmyPDF für die Texterstellung verwendet.
Das Temporärverzeichnis in xsane2sandwich.sh (Zeile 35) kann entsprechend der eigenen Wünsche angepasst werden (auf schließendes / achten!), dort wird auch die xsane2sandwich.log-Datei abgelegt. In der Log-Datei kann man ggf. Fehlermeldungen einsehen, falls das Skript nicht wie erwartet funktionieren sollte.
Die mit XSane eingescannten Vorlagen werden einer Texterkennung mit tesseract-ocr unterzogen. Mit Verwendung des Konfigurationsskriptes hocr entsteht eine html-Datei, in der neben dem Text auch die Position der Wörter recht exakt gespeichert wird. Mit hocr2pdf wird eine Bildversion mit der hocr/html-Lage in einer PDF-Datei zusammengefasst, 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 pdftk wird außerdem ein Titel (der Name der PDF-Datei ohne Erweiterung) in das Dokument eingetragen, sodass bei einem Indizieren (z.B. via Tracker) der Titel korrekt ausgegeben werden kann (Dank für die Anregung dazu an matzeSG).
In "XSane -> Einstellung -> Konfiguration -> Texterkennung" wird als OCR-Befehl "/PFAD/ZU/xsane2sandwich.sh" sowie weitere Optionen zur Steuerung angegeben. Als weitere Optionen werden "-i", für die Ausgabedatei "-o" 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. Mit -a
können zusätzliche Optionen für hocr2pdf angegeben werden.
Die XSane-Funktion "Mehrseitig" kann für diese Art der PDF-Erstellung nicht genutzt werden, auch nicht das Ausgabeformat "PDF"! Deartig erstellte Dokumente können nur nachträglich mit Programmen wie OCRmyPDF, pdfsandwich oder pdfocr mit einer Textlage versehen werden! Ein Anhängen weiterer Scans an bestehende PDF-Dateien ist mit xsane2sandwich hingegen möglich.
Für Scanner mit automatischem Vorlageneinzug (ADF) in "Einstellungen -> Konfiguration -> Speichern -> Dateinamenzähler Länge" den Eintrag "nicht aktiv" wählen, und den Dateizählerwert, wenn die Einstellungsmöglichkeit vorhanden ist, 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!
/PFAD/ZU/xsane2sandwich.sh -l deu -a "-s"
verwendet Tesseract mit deutscher Sprache, als zusätzliche Angabe die hocr2pdf-Option -s
("sloppy text"), die für Texte mit unterschiedlichen Laufweiten bessere Ergebnisse liefern kann. Die zusätzlichen Optionen, insbesondere wenn mehrere verwendet werden sollen, müssen in Anführungsstrichen stehen!
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, die Ausgabe mit der Erweiterung .txt wählen (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.
Da die Passung der Textlagen mit von Tesseract 3.03 ausgegebenen hOCR-Dateien und daraus mit hocr2pdf
erstellten PDF-Dateien stark zu wünschen übriglässt, hier eine Skript-Version, die für die Texterkennung OCRmyPDF verwendet. Die Funkionsweise ist nahezu identisch mit der oben beschriebenen Version; die Option -a
bezieht sich auf zusätzlich verwendbare OCRmyPDF-Optionen.
Um möglichst kleine PDF-Dateigrößen zu erzielen, verwendet die Version 0.3 tiff2pdf
(aus dem Paket libtiff-tools) um mit convert
erstellte tif-Dateien in ein PDF umzuwandeln.
libtiff-tools
mit apturl
Paketliste zum Kopieren:
sudo apt-get install libtiff-tools
sudo aptitude install libtiff-tools
Gegenüber der bisherigen Erstellung der PDF-Rohdateien mit convert
ergeben sich erhebliche Reduzierungen auf bis zu 1/8 der PDF-Größe (Dank für den Hinweis an TausB).
Das Skript benötigt zudem 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 für die OCRmyPDF-Optionen in -a -f
(erzwingt Texterkennung) verwendet werden, ansonsten verweigert OCRmyPDF die Bearbeitung des PDFs. Eine Korrektur der Textlage ist für diese Version allerdings derzeit nicht möglich. Die Logdatei wird unter xsane2OCRmyPDF.log in /tmp abgelegt, bei der Angabe des Dateinnamens in XSane ist eine Endungsangabe nicht nötig.
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 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.1 # # *** 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 convert 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/ - convert, part of ImageMagick, http://www.imagemagick.org/script/index.php - 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 "~~~+++~~~~+++~~~" 1>&2 #produces a pdf file for OCRmyPDF convert "$FILE_PATH" "$FILE_OUT.1.tif" 1>&2 tiff2pdf -o "$FILE_OUT.1.pdf" "$FILE_OUT.1.tif" 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.tif" rm "$FILE_OUT" echo "~~~+++~~~~+++~~~"$(date +%c) 1>&2 |
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" 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 natürlich möglich, siehe die manpage zu exiftool
.
OCRmyPDF bietet - zumindest ab Version 4.2 - 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.
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).
Diese Revision wurde am 7. Oktober 2016 18:45 von verdooft erstellt.