[[Vorlage(Getestet, bionic, focal)]] {{{#!vorlage Wissen [:Pakete installieren: Installation von Programmen] [:Editor: Einen Editor verwenden] [:Rechte: Rechte für Dateien und Ordner ändern] [:sudo:Root-Rechte] }}} [[Inhaltsverzeichnis()]] [[Bild(XSane/xsane-logo.png, 64, left)]] 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: {{{#!vorlage Paketinstallation xsane, universe exactimage, universe tesseract-ocr, universe, sowie die gewünschten Sprachpakete pdftk ocrmypdf libtiff-tools yad libimage-exiftool-perl, optional }}} Das Skript selbst in einen Editor [2] kopieren, als '''xsane2OCRmyPDF.sh''' abspeichern und ausführbar[3] machen. {{{#!code bash #!/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 . # ############################################################################## # # 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 - temporary XSANE file -o - name for the output -l - defines the language used for recognition -a - 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 [:tesseract-ocr#xsane2tess:xsane2tess]-Skriptes, das auf [ubuntu_fr:xsane2tess:ubuntu-fr.org] {fr} 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. {{{#!vorlage 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 [:OCRmyPDF: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! {{{#!vorlage Warnung 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 [:XSane#Betrachter:Betrachter-Modus] erstellt. Im Betrachter dann die Texterkennung ([[Bild(xsane/xsane-ocr.jpg, 18)]]-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 [:man: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-Linux: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 [https://www.konradvoelkel.com/2010/01/linux-ocr-and-pdf-problem-solved/ Blogeintrag] {en} von Konrad Voelkel wird eine ähnliche Vorgehensweise beschrieben. * Weiterer Beitrag von Konrad Voelkel, der die Erstellung von [https://www.konradvoelkel.com/2013/03/scan-to-pdfa/ PDF/a-Dateien] {en} 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:] {Übersicht} - Übersichtsartikel * [:Texterkennung:] {Übersicht} - Übersichtsartikel #tag: Grafik, Multimedia, Bildung, Büro, Kommunikation, OCR, PDF