LINUX.ORG.RU

hocr-tools или добавление OCR слоя в pdf

 ,


0

1

Есть всего несколько инструментов позволяющих генерировать 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)
Комментирование 67 строки приведёт к тому, что в генерируем pdf-е будет только OCR-слой, изображения jpeg нужны только для определения размеров страниц.

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

Deleted

Последнее исправление: Deleted (всего исправлений: 7)

Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.