ubuntuusers.de

xsane2OCRmyPDF

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

Zum Verständnis dieses Artikels sind folgende Seiten hilfreich:

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

Paketliste zum Kopieren:

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

Diese Revision wurde am 17. Februar 2020 12:15 von Heinrich_Schwietering erstellt.
Die folgenden Schlagworte wurden dem Artikel zugewiesen: PDF, OCR, Bildung, Kommunikation, Grafik, Büro, Multimedia