Ubuntu 12.10 „Quantal Quetzal“
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 kann als xsane2sandwich.sh heruntergeladen oder in einen Editor [2] kopiert, abgespeichert und ausführbar[3] gemacht werden.
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 # xsane2sandwich - pdf with ocr directly from xsane # Copyright (C) 2012 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.1 # # *** 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. # 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, http://code.google.com/p/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="$OPTARG" ;; l) # recognition language LANG="$OPTARG" ;; a) # additional hocr2pdf option HOCROPT="$OPTARG" ;; esac done # redirects STDOUT to FILE_OUT exec 1>>$FILE_OUT # redirects STDERR to ERRORLOG exec 2>>$TEMP_DIR$ERRORLOG # strips path from FILE_PATH, use filename only IN_FILE="${FILE_PATH##*/.*}" echo "~~~+++~~~~+++~~~" 1>&2 #produces a tif file fpr hocr2pdf TIF_FILE="$TEMP_DIR""xsane2tessResult".tif convert "$FILE_PATH" -compress none "$TIF_FILE" 1>&2 # produce hocr-file file with tesseract tesseract "$IN_FILE" "$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 # check is outfutfile exists if [[ -a "$FILE_OUT.pdf" ]] then hocr2pdf $HOCROPT -i "$TIF_FILE" -o "$FILE_OUT.new.pdf" < "$FILE_OUT.html" #add new page to existing file using pdftk 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 hocr2pdf $HOCROPT -i "$TIF_FILE" -o "$FILE_OUT.pdf" < "$FILE_OUT.html" echo "$FILE_OUT.pdf started" 1>&2 fi # Remove temporary files rm "$FILE_OUT" rm "$FILE_OUT.html" rm "$TIF_FILE" 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.
Das Temporärverzeichnis in xsane2sandwich.sh (Zeile 35) kann entsprechend der eigenen Wünsche angepasst werden, 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 Fundstellen werden in der "Bildlage" angezeigt. Sollen mehrseitige PDF-Dateien erstellt werden, wird für die OCR-Erkennung der selbe Dateiname ohne Endung 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.
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.
/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. 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). Im Betrachter die Texterkennung (-Taste) wählen. Die Angabe des Ausgabenamens erfolgt ohne eine Dateiendung! 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. 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 Aufbau des 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.
Für eine - optionale - Korrektur an der Textausgabe kann das Firefox-Plugin moz-hOCR-Edit verwendet werden. Benötigt werden dazu außerdem yad und ruby in Version 1.9.1. Nach der Erstellung der temporären hOCR/html-Datei durch Tesseract wird diese in Firefox geöffnet, und kann dort korrigiert und wieder abgespeichert werden. Danach wird das Dokument einer automatischen "Rekonversion" unterzogen, da das Plugin momentan Umlaute und Sonderzeichen beim Abspeichern nicht in regulärer utf-8-Codierung zurückliefert. Der Skriptprozess selbst wird solange unterbrochen, bis das Yad-Fenster mit dem Hinweis wieder geschlossen wird. Benötigt werden dazu yad und ruby in Version 1.9.1.
In einem Editor folgenden Zeilen nach Zeile 109 in das Skript einfügen:
#corrections are possible in hocr-edit-plugin for firefox `firefox $FILE_OUT.html` $(yad --text="Korrektur-Erstellung \nist abgeschlossen?") 1>&2 #unfortunately there are problems with umlauts, correction via ruby ruby1.9.1 -i -pe '$_.gsub!(/&#(\d+);/){ eval("\"\\u%04x\"" % $1.to_i) }' $FILE_OUT.html
gscan2pdf liefert momentan mit dem OCR-Engine tesseract-ocr die besten Ergebnisse für "Sandwich-PDFs", da damit auch eine akzeptable Layout-Erkennung für die Passung der Lagen möglich ist.
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.0x.
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.
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.