OCR en archivos PDF en OS X con herramientas gratuitas de código abierto

Después de leer estas publicaciones de blog:

y revisando el fragmento a continuación (de esta esencia) para Linux, creo que encontré un método para OCR de un PDF de varias páginas y obtener un PDF en la salida que también podría funcionar en OS X. La mayoría de las dependencias están disponibles en homebrew ( brew install tesseracty brew install imagemagick), excepto uno, hocr2pdf.

No he podido encontrar un puerto para OS X. ¿Hay alguno disponible? Si no es así, ¿cómo puede OCR un PDF de varias páginas y obtener los resultados nuevamente en un PDF de varias páginas en OS X, utilizando herramientas gratuitas de código abierto?

#!/bin/bash

# This is a script to transform a PDF containing a scanned book into a searchable PDF.
# Based on previous script and many good tips by Konrad Voelkel:
# http://blog.konradvoelkel.de/2010/01/linux-ocr-and-pdf-problem-solved/
# http://blog.konradvoelkel.de/2013/03/scan-to-pdfa/
# Depends on convert (ImageMagick), pdftk and hocr2pdf (ExactImage).
# $ sudo apt-get install imagemagick pdftk exactimage
# You also need at least one OCR software which can be either tesseract or cuneiform.
# $ sudo apt-get install tesseract-ocr
# $ sudo apt-get install cuneiform
# To install languages into tesseract do (e.g. for Portuguese):
# $ sudo apt-get install tesseract-ocr-por

echo "usage: ./pdfocr.sh document.pdf ocr-sfw split lang author title"
# where ocr-sfw is either tesseract or cuneiform
# split is either 0 (already single-paged) or 1 (2 book-pages per pdf-page)
# lang is a language as in "tesseract --list-langs" or "cuneiform -l".
# and author, title are used for the PDF metadata.
#
# usage example:
# ./pdfocr.sh SomeFile.pdf tesseract 1 por "Some Author" "Some Title"
pdftk "$1" burst dont_ask
for f in pg_*.pdf
do
if [ "1" == "$3" ]; then
convert -normalize -density 300 -depth 8 -crop 50%x100% +repage $f "$f.png"
else
convert -normalize -density 300 -depth 8 $f "$f.png"
fi
done
rm pg_*.pdf

for f in pg_*.png
do
if [ "tesseract" == "$2" ]; then
tesseract -l $4 -psm 1 $f $f hocr
elif [ "cuneiform" == "$2" ]; then
cuneiform -l $4 -f hocr -o "$f.html" $f
else
echo "$2 is not a valid OCR software."
fi
hocr2pdf -i $f -r 300 -s -o "$f.pdf" < "$f.html"
done

pdftk pg_*.pdf cat output merged.pdf

pdftk merged.pdf update_info_utf8 doc_data.txt output merged+data.pdf
echo "InfoBegin" > in.info
echo "InfoKey: Author" >> in.info
echo "InfoValue: $5" >> in.info
echo "InfoBegin" >> in.info
echo "InfoKey: Title" >> in.info
echo "InfoValue: $6" >> in.info
echo "InfoBegin" >> in.info
echo "InfoKey: Creator" >> in.info
echo "InfoValue: PDF OCR scan script" >> in.info
in_filename="${1%.*}"
pdftk merged+data.pdf update_info_utf8 in.info output "$in_filename-ocr.pdf"

rm -r doc_data.txt in.info merged* pg_*

Respuestas (2)

Tesseract 3.03+ tiene soporte integrado para la salida de PDF. Lo cual requiere que se instale leptonica. Puede usar: brew install tesseract --HEADpara obtener la última versión de tesseract. También necesitarás tener instalado ghostscript pero no necesitas hocr2pdf.

El siguiente script usa ghostscript para dividir el PDF en archivos JPEG, tesseract para OCR de los JPEG y generar páginas PDF individuales, y finalmente ghostscript nuevamente para combinar las páginas en un solo PDF.

#!/bin/sh

y="`pwd`/$1"
echo Will create a searchable PDF for $y

x=`basename "$y"`
name=${x%.*}

mkdir "$name"
cd "$name"

# splitting to individual pages
gs -dSAFER -dBATCH -dNOPAUSE -sDEVICE=jpeg -r300 -dTextAlphaBits=4 -o out_%04d.jpg -f "$y"

# process each page
for f in $( ls *.jpg ); do
  # extract text
  tesseract -l eng -psm 3 $f ${f%.*} pdf
  rm $f
done

# combine all pages back to a single file
gs -dCompatibilityLevel=1.4 -dNOPAUSE -dQUIET -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOutputFile="../${name}_searchable.pdf" *.pdf

cd ..
rm -rf "${name}"

# Adapted from: http://www.morethantechnical.com/2013/11/21/creating-a-searchable-pdf-with-opensource-tools-ghostscript-hocr2pdf-and-tesseract-ocr/
# from http://www.ehow.com/how_6874571_merge-pdf-files-ghostscript.html
# bash tut: http://linuxconfig.org/bash-scripting-tutorial
# Linux PDF,OCR: http://blog.konradvoelkel.de/2013/03/scan-to-pdfa/
En Tesseract 4, esto debe ser tesseract $f ${f%.*} -l eng --psm 3 pdf.
Si el PDF original se compone de una sola imagen por página (por ejemplo, la salida de un software de escaneo no compatible con OCR), el uso pdfimagesde Ghostscript en lugar de Ghostscript para extraer imágenes evita la recompresión. P.ej:pdfimages -all file.pdf out

Lo uso tesseracten os x también. Escribí sobre automatizarlo brevemente aquí .

Si bien este enlace puede responder la pregunta, es mejor incluir las partes esenciales de la respuesta aquí y proporcionar el enlace como referencia. Las respuestas de solo enlace pueden dejar de ser válidas si la página enlazada cambia. Eche un vistazo aquí también: apple.stackexchange.com/help/deleted-answers