Недавно на работе столкнулись с задачей разпознавания сканированных документов и поиска по ним.
Мною был рассмотрен движок распознавания текста с открытым исходным кодом 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 |
Первый этап
На первом этапе нужно извлечь изображения из 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. Деление на отдельные страницы затратно получается, но, думаю, зато это более гибко.