Tag Archive: ocr

Создаем Searchable PDF с помощью Tesseract OCR

Недавно на работе столкнулись с задачей разпознавания сканированных документов и поиска по ним.

Мною был рассмотрен движок распознавания текста с открытым исходным кодом Tesseract.

В данной статье будут рассмотрены основные моменты возможной реализации.

Предположим, что у нас есть многостраничный отсканированные документ в формате PDF, но нераспознанный.

И наша задача распознать текст с помощью OCR (Optical character recognition - Оптическое распознавание символов) и создать так называемый Searchable PDF.

Searchable PDF - это PDF, в котором поверх изображения размещается дополнительный слой, содержащий распознанный текст, причем на тех же позициях что и на изображении.

Для начала нужно установить необходимые программы.

  • imagemagick - набор программ (консольных утилит) для работы с множеством графических форматов;
  • tesseract-ocr - приложение оптического распознавания символов;
  • tesseract-ocr-all - все языковые пакеты (но можно установить только конкретные языковые пакеты)

У tesseract есть языковые пакеты для русского и казахских языков, что очень круто.

Также можно не устанавливать локально у себя tesseract, а запустить через docker.

Официального образа на hub.docker.com я не нашел, поэтому сделал свой.

Запустить контейнер с tesseract из образа naik85/tesseract можно так (пример для linux/unix):

docker run --rm -v "$(PWD)":/files -w /files -it naik85/tesseract bash
После старта контейнера откроется консоль bash, где можно будет выполнять команды. Также будут доступны ваши файлы из директории, где вы запустили команду docker run.

Первый этап

На первом этапе нужно извлечь изображения из PDF. Здесь есть два варианта либо преобразовать PDF в один файл TIFF, либо преобразовать в набор изображений.

TIFF - это многостраничный формат хранения растровых графических изображений.

Для конвертации в TIFF использовалась следующая команда:

convert -density 300 YOUR_FILE.pdf -depth 1 -strip -background white -alpha off YOUR_FILE.tiff

Для конвертации в PNG использовалась следующая команда:

convert -density 300 YOUR_FILE.pdf -depth 1 -strip -background white -alpha off YOUR_FILE.png

Параметры конвертации приведены для примера, их можно настроить под ваши требования.

После выполнения конвертации в PNG для каждой страницы будет создан отдельный файл изображения.

Например:

YOUR_FILE-0.png
YOUR_FILE-1.png
...
YOUR_FILE-N.png

Второй этап

К сожалению, у меня не получилось преобразовать документ TIFF в Searchable PDF через tesseract.

Была использована следующая команда:

tesseract YOUR_FILE.tiff searchable -l rus PDF

Выходила следующая ошибка:

Tesseract Open Source OCR Engine v4.1.1 with Leptonica
Error in pixReadFromTiffStream: failed to read tiffdata

Кто знает как решить проблему, пишите в комментариях.

Для нашей задачи постраничное деление на отдельные файлы (изображения) было даже предпочтительней (об этом ниже).

Конвертируем каждую страницу (файл png) в Searchable PDF:

tesseract YOUR_FILE-0.png searchable-0 -l rus+kaz+eng pdf
tesseract YOUR_FILE-1.png searchable-1 -l rus+kaz+eng pdf
...
tesseract YOUR_FILE-N.png searchable-2 -l rus+kaz+eng pdf

На выходе получаем файлы:

searchable-0.pdf
searchable-1.pdf
...
searchable-N.pdf

Очень крутая фишка, что можно разпозначать несколько языков, перечислив их через символ '+': rus+kaz+eng.

Команда распознавания и извлечения текста

tesseract YOUR_FILE-0.png -l rus+kaz+eng YOUR_FILE-0
tesseract YOUR_FILE-1.png -l rus+kaz+eng YOUR_FILE-1
...
tesseract YOUR_FILE-N.png -l rus+kaz+eng YOUR_FILE-N

В результате будут созданы текстовые файлы:

YOUR_FILE-0.txt
YOUR_FILE-1.txt
...
YOUR_FILE-N.txt

Распознавая отдельно каждую страницу, мы можем организовать постраничный поиск и при необходимости показывать пользователю только нужные страницы.

Склеив тексты страниц и положив их в поисковый движок, получим подокументый поиск.

Если нужен целый Searchable PDF, то можно его склеивать из отдельных страниц.

p.s. Деление на отдельные страницы затратно получается, но, думаю, зато это более гибко.