blindschleiche

.pdf via tesseract nach .txt

Auf der Suche nach einem halbwegs brauchbaren OCR-Programm bin ich über tesseract gestolpert. Weil das Programm aber nur reine Grafikdateien entgegennehmen mag und ich es gerne für PDFs verwenden wollte habe ich mir dafür ein kleines Skript geschrieben.

Aber der Reihe nach:

Als erstes benötigt man natürlich tesseract. Am Mac lässt sich das am einfachsten über die MacPorts installieren. Sind diese erstmal installiert, dann genügt ein einfaches sudo port selfupdate und sudo port install tesseract um dieses auf die Platte zu befördern, was aber je nach Anzahl der noch fehlenden Pakete eine Zeit lang dauern kann.

Danach sollte man sich noch die benötigten Sprachdateien herunterladen. Die für deutsch tragen ein .deu. im Namen, die für englisch .eng.. Die darin enthaltenen .traineddata-Dateien kommen nach /usr/local/share/tessdata.

Um das PDF zur Wandlung in eine Grafikdatei zu wandeln setzt mein Skript auf das in ImageMagick enthaltene Tool convert. Was sich wieder einfach via MacPorts installieren lässt.

pdf2orc.sh:

#!/bin/bash

## testen ob Parameter 1 als Datei existiert
if [ ! -f "$1" ]
then
    echo "$1: File does not exist"; exit 1
fi

base=$(basename -s .pdf "$1")

## TMP-Verzeichnis anlegen und darin Datei definieren
tmpdir=$(mktemp -d -t pdf2ocr)
if [ $? -ne 0 ]; then
    echo "$0: Can't create temp dir, exiting..."; exit 1
fi
tmpfile="${tmpdir}/pdf2ocr.png"

## PDF in an langes PNG wandeln
/usr/local/bin/convert -depth 4 -density 300 "${1}" miff:- | convert - -append "${tmpfile}"

## deu ist Standardsprache gibt es mehr als einen Parameter bestimmt der 2. die Sprache
lang="deu"
if [ $# -gt 1 ]; then
    lang=$2
fi
echo "Using Language: $lang"

## OCR in basename + txt des aktuellen Verzeichnisses
/usr/local/bin/tesseract "${tmpfile}" "${base}" -l $lang

# aufräumen
rm "${tmpfile}"

Das Skript nimmt als ersten Parameter die PDF-Datei entgegen und wandelt diese, solange man nichts anderes mit angibt, mit der deutschen Sprachvorgabe in eine Textdatei die anschließend parallel zur Eingabedatei mit dem selben Namen aber der Endung .txt liegt. Möchte man z.B. eine englische Texterkennung muß man dies dem Skript als zweiten Parameter mitgeben.

pdf2ocr.sh Scans/Eingabedatei.pdf eng

Das Skript wandelt die Eingabedatei erstmal in eine, mitunter laaaange, PNG-Datei um, nimmt im Beispiel statt der (standardmäßigen) deutschen, die englische Sprache, und lässt tesseract auf die Grafik los. Anschließend hat man in Scans/Eingabedatei.txt das Ergebnis liegen.

So wird z.B. aus diesem, leicht schiefen, Scan, dieser Text:

den Rand hinausragt.

6. Bringen Sie das Paket zur Post (DHL). Das Frankieren der Sendung ist mit dem
vorfrankierten Rücksendeetikett nicht erforderlich. Wenn Sie das vorfrankierte
Rücksendeetikett nicht nutzen: Bei einem Wert der zurückzusendenden Sache ab 40 EUR

Damit kann man leben :-).