ubuntuusers.de

Hinweis: Dies ist ein statischer Snapshot unseres Wikis vom 25. März 2013 und kann daher nicht bearbeitet werden. Der aktuelle Artikel ist unter wiki.ubuntuusers.de zu finden.

xsane2sandwich

Dieser Artikel wurde für die folgenden Ubuntu-Versionen getestet:

Zum Verständnis dieses Artikels sind folgende Seiten hilfreich:

XSane/xsane-logo.png 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.

Vorbereitung

Folgende Pakete müssen installiert [1] werden:

  • xsane (universe)

  • imagemagick

  • tesseract-ocr (universe, sowie die gewünschten Sprachpakete)

  • pdftk

  • exactimage

Wiki/Vorlagen/Installbutton/button.png 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 {dl} 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 {fr} 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.

Konfiguration

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.

Funktionsweise

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.

Benutzung

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.

Beispiel

/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!

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. 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 (xsane/xsane-ocr.jpg-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.

Korrekturen

Für eine - optionale - Korrektur an der Textausgabe kann das Firefox-Plugin moz-hOCR-Edit {en} 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

Alternativen

  • 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 {en} 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.

ubuntuusers.local › Wikixsane2sandwich