Hallo,
nachdem ich lange mit dem Thema gekämpft habe, konnte ich mir nun drei Skripte zusammenbasteln, die mir sehr helfen. Eventuell können die hier irgendwo eingebaut werden. Die ersten beiden Skripte verbessern die übergebene PDF-Datei und führen dann eine Texterkennung aus. Mit scantailor erziele ich bessere Ergebnisse als mit unpaper (die erstellte PDF-Datei hat eine bessere Qualität). Letzteres hat aber den Vorteil, dass keine Benutzereingaben erforderlich sind.
Ausgangspunkt für meine Skripte waren zwei Postings in einem Blog: 1 und 2
scantailor-Variante
#!/bin/bash
echo "usage: ./ocrScript.sh inputFile.pdf"
FILE_NAME=$(basename $1 .pdf)
# Temp Folder
mkdir ocrTemporaryFolder
cp $1 ocrTemporaryFolder/
cd ocrTemporaryFolder
# splitting pdf
convert -density 600 $1 singlepage%03d.tif
#pdftoppm $1 seite # wäre alternative, aber unpaper bei ppm ohne Effekt
read -p "[ENTER] zum Starten von Scantailor und manueller Bearbeitung der ppm-Dateien"
scantailor
read -p "Warte auf manuelle Bearbeitung; [ENTER] wenn fertig!"
mv out/* ./
#processing each page
for i in *.tif
do
echo "processing $i"
convert -density 600 "$i" "$i.png"
tesseract -l deu -psm 1 "$i.png" "$i" hocr
convert -density 600 "$i.png" "$i.jpg"
hocr2pdf -i "$i.jpg" -s -o "$i.bk2" < "$i.html"
done
pdftk *.bk2 cat output "${FILE_NAME}_ocr.pdf"
mv "${FILE_NAME}_ocr.pdf" ../
cd ..
rm -R ocrTemporaryFolder
echo "----------------done----------------------"
unpaper-Variante
#!/bin/bash
echo "usage: ./ocrScript.sh inputFile.pdf"
FILE_NAME=$(basename $1 .pdf)
# Temp Folder
mkdir ocrTemporaryFolder
cp $1 ocrTemporaryFolder/
cd ocrTemporaryFolder
# splitting pdf
pdftk $1 burst
#processing each page
for i in pg*.pdf
do
echo "processing $i"
convert -density 600 "$i" "$i.pbm"
unpaper "$i.pbm" "${i}_unpaper.pbm"
convert -density 600 "${i}_unpaper.pbm" "$i.png"
tesseract -l deu -psm 1 "$i.png" "$i" hocr
convert -density 600 "$i.png" "$i.jpg"
hocr2pdf -i "$i.jpg" -s -o "$i.bk2" < "$i.html"
done
pdftk *.bk2 cat output "${FILE_NAME}_ocr.pdf"
mv "${FILE_NAME}_ocr.pdf" ../
cd ..
rm -R ocrTemporaryFolder
echo "----------------done----------------------"
Zu guter Letzt habe ich mir noch ein Skript geschrieben, das einen Ordner überwacht. Sobald eine Datei in den Ordner in geschoben wird, wird sie mit unpaper und tesseract bearbeitet und im Ordner out ausgegeben.
#!/bin/bash
# to run this as a service
# sudo mv enhancePdfServer.sh /etc/init.d/
# sudo chmod +x /etc/init.d/enhancePdfServer.sh
# sudo update-rc.d enhancePdfServer defaults 80
# needed directories:
# /var/www/pdfServer/
# /var/www/pdfServer/in/
# /var/www/pdfServer/out/
inotifywait -mq -e create -e moved_to --format %w%f /var/www/pdfServer/in | while read IN_FILE
do
FILE=$(basename $IN_FILE)
# Temp Folder
TMPFOLDER=`mktemp -d`
cp $IN_FILE $TMPFOLDER/
cd $TMPFOLDER
# splitting pdf
pdftk $FILE burst
#processing each page
for i in pg*.pdf
do
echo "processing $i"
convert -density 600 "$i" "$i.pbm"
unpaper "$i.pbm" "${i}_unpaper.pbm"
convert -density 600 "${i}_unpaper.pbm" "$i.png"
tesseract -l deu -psm 1 "$i.png" "$i" hocr
convert -density 600 "$i.png" "$i.jpg"
hocr2pdf -i "$i.jpg" -s -o "$i.bk2" < "$i.html"
done
pdftk *.bk2 cat output "$(basename $FILE .pdf)_ocr.pdf"
mv "$(basename $FILE .pdf)_ocr.pdf" /var/www/pdfServer/out/
rm -R $TMPFOLDER
rm "$IN_FILE"
echo "----------------done----------------------"
done
Mir fehlt leider teilweise das Wissen, um die Skripte für das Wiki aufzubereiten und zu beschreiben. (Ich konnte z. B. nicht herausfinden, warum die Dateien in .bk2 erstellt werden.)
Ich würde mich freuen, wenn jemand Lust hat, die Skripte ggf. noch ein wenig anzupassen und im Wiki einzubauen. Ich hatte bisher nur Lösungen gefunden, die bei mir nicht richtig funktioniert hatten, daher hoffe ich, dass ich hiermit weiterhelfen kann.
Viele Grüße,
Nico