Есть всего несколько инструментов позволяющих генерировать pdf с OCR слоем в linux. И не все эти инструменты работают так, как надо. hocr2pdf, например, из exactimage совершенно не понимает русских букв (как минимум у меня, версия exactimage = 0.8.5), плюс он генерирует pdf только из jpeg, что тоже не радует (обычно использую tiff). Как заставить нормально создать hocr слой в pdfbeads, я так и не разобрался.
На выручку приходят скрипты на python-е из hocr-tools. При определённой модификации они позволяют не только генерировать pdf из jpeg, но и создавать OCR-слой для уже сгенерированного каким-либо образом pdf-а. Собственно, об этом речь и пойдёт.
Скрипты hocr-tools имеет следующие зависимости: python, python-imaging | python-pil | python-pillow, python-lxml, python-reportlab.
После того, как зависимости решены, скрипт hocr-pdf работает следующим образом. В некую директорию складываются изображения страниц (jpeg) и распознанный текст (hocr):
$ ls -1
hocr-pdf
page-001.hocr
page-001.jpg
page-002.hocr
page-002.jpg
...
page-NNN.hocr
page-NNN.jpg
После того, как всё приготовлено, запускаем генерацию pdf:
$ ./hocr-pdf . > jpeghocr.pdf
С русскими буквами проблем нет. Изображения страниц не меняются, при этом скрытый текст на месте.
Всё хорошо. Но, что делать, если pdf уже сгенерирован из чёрно-белых tiff-ов и использовать велосипед с jpeg совсем не хочется. Хочется добавить OCR-слой к существующему pdf-у. Нет проблем, «напильник» в руки и погнали:
1) Распознаем текст из исходных tiff-ов:
$ for ttif in *.tif; do echo "$ttif"; tesseract "$ttif" "${tiff%.tif}" -l rus+eng hocr; done
2) Если распознанный текст имеет расширение .html, меняем его на .hocr:
$ rename 's/html$/hocr/' *.html
3) Конвертим tiff в вспомогательные jpeg (нужны для определения размеров страниц):
$ for ttif in *.tif; do echo "$ttif"; anytopnm "$ttif" | pnmtojpeg > "${ttif%.tif}.jpg"; done
либо
$ for ttif in *.tif; do convert -verbose "$ttif" "${ttif%.tif}.jpg"; done
4) Изменяем hocr-pdf, а точнее коментируем 67 строку:
67: pdf.drawImage(image, 0, 0, width=width, height=height)
меняем на
67:# pdf.drawImage(image, 0, 0, width=width, height=height)
5) Смотрим, всё ли на месте:
$ ls -1
hocr-pdf
page-001.hocr
page-001.jpg
page-001.tif
page-002.hocr
page-002.jpg
page-002.tif
...
page-NNN.hocr
page-NNN.jpg
page-NNN.tif
6) Генерируем pdf с OCR-слоем:
$ ./hocr-pdf . > hocr.pdf
7) Складываем рядом сгенерированный ранее pdf из tiff-ов и pdf с OCR-слоем:
$ ls -1
book.pdf
hocr.pdf
8) Объединяем их:
$ pdftk book.pdf multibackground hocr.pdf output book+hocr.pdf
Вот и всё.
PS: версия hocr-tools = 1.2.0, версия pdftk = 1.44, версия python = 2.7.3.
ЗЫ: Если существует только pdf, а исходные tiff-ы пропали, можно восстановить их из pdf с помощью poppler-utils:
$ dpkg -l poppler-utils
...
ii poppler-utils 0.26.5-2~bpo70+1 i386 PDF utilities (based on Poppler)
$ mkdir tif
$ pdfimages -tiff book.pdf tif/page
либо
$ mkdir tif
$ pdfimages book.pdf tif/page
$ cd tif
$ for tpbm in *.pbm; do echo "$tpbm"; pnmtotiff -g4 "$tpbm" > "${tpbm%.pbm}.tif"; done
$ mkdir tif
$ pdfimages book.pdf tif/page
$ cd tif
$ for tpbm in *.pbm; do convert -verbose -compress Group4 "$tpbm" "${tpbm%.pbm}.tif"; done