Оптическое распознавание PDF-файлов

Оптическое распознавание символов, или OCR, в основном применяется для преобразования текста из отсканированных изображений в выбираемый, копируемый, кодируемый, встроенный текст. В современных приложениях и программных стеках для сканеров есть встроенные функции OCR, а в большинстве PDF-файлов есть встроенный текст. Но еще встречаются документы и изображения, в которых нет встроенного текста и его нельзя извлечь автоматически.

В таком случае для автоматического распознавания текста можно использовать набор инструментов с открытым исходным кодом. Это будет полезно, когда вы загружаете документы или изображения в веб-приложение, которому нужно извлечь текст или если работаете с большим объемом документов, которые необходимо проиндексировать.

В этом мануале мы рассмотрим настройку конвейера OCR с помощью Ghostscript, Tesseract и PDFtk. Также будут рассмотрены другие инструменты, которые можно использовать вместо или в дополнение к ним.

Требования

Эти утилиты доступны на большинстве платформ. Также понадобится настроенный сервер (мы используем Ubuntu).

1: Установка Ghostscript, Tesseract и PDFtk

OCR можно проводить в PDF-файлах (которые содержат и иногда отображаются как изображения) и изображениях. Работа с PDF подразумевает несколько дополнительных шагов, которые можно пропустить, если вы работаете только с изображениями.

Вам понадобятся три инструмента для сквозного конвейера: Ghostscript — выполняет все виды преобразования PDF, в изображение и наоборот (изначально он был создан как интерпретатор Postscript, технологии-предшественницы PDF); Tesseract — движок OCR с открытым исходным кодом, как и Ghostscript, постоянно развивается с 1980-х годов;  PDFtk — небольшая утилита для нарезки или восстановления PDF-файлов из отдельных страниц.

Все три приложения доступны в стандартных репозиториях Ubuntu и могут быть установлены с помощью менеджера пакетов apt. Нужно обновить источники пакетов с помощью apt update, а затем с помощью apt install установить их:

sudo apt update

sudo apt install pdftk ghostscript tesseract-ocr x11-utils

Теперь есть три новые команды, по одной для каждого приложения. Их можно проверить с помощью which:

which pdftk

/usr/bin/pdftk

which gs

/usr/bin/gs

which tesseract

/usr/bin/tesseract

Эти команды будут применяться для выполнения OCR на следующем шаге.

2: Преобразование PDF в изображение и запуск Tesseract

Если у вас нет PDF-файла, на котором можно провести распознавание текста, можете ознакомиться с этим туториалом и загрузить пример PDF-файла (без встроенного текста). Загрузить PDF-файл на свой сервер можно с помощью curl с флагом -O, чтобы сохранить его в текущем каталоге с тем же именем:

curl -O https://deved-images.nyc3.digitaloceanspaces.com/server-ocr/OCR-sample-paper.pdf

Если вы работаете с одним или несколькими PDF-файлами, прежде чем их использовать в качестве источников OCR, нужно преобразовать их в отдельные изображения. Это можно сделать с помощью команды Ghostscript. Необходимо включить дополнительные параметры, чтобы обеспечить согласованность DPI, цветового пространства и размеров. Сначала создадим рабочий каталог output для файлов, созданных этим процессом, а затем запустим gs:

mkdir output

gs -o output/%05d.png -sDEVICE=png16m -r300 -dPDFFitPage=true OCR-sample-paper.pdf

Команда gs с флагом -o указывает путь вывода перед остальной частью команды. %05d — это синтаксис оболочки, который Ghostscript понимает как нативный — в данном случае это значит, что выходным файлам PNG из входного PDF присваиваются автоматически увеличивающиеся 5-значные числа. Это видно в старых приложениях командной строки. После добавления синтаксиса форматирования PNG и DPI -r300 укажите путь к OCR-sample-paper.pdf или выбранному входному файлу.

Ghostscript выведет каждую страницу в PDF по отдельности:

Processing pages 1 through 14.
Page 1
Page 2
Page 3
Page 4
Page 5

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

ls output

00001.png  00003.png  00005.png  00007.png  00009.png  00011.png  00013.png
00002.png  00004.png  00006.png  00008.png  00010.png  00012.png  00014.png

Далее с помощью цикла for вначале команды tesseract, преобразуем созданные изображения обратно в отдельные страницы PDF (уже со встроенным текстом). Циклы ведут себя также, как и в других языках программирования. Их можно форматировать в одну команду, отделяя каждую часть точкой с запятой и завершая командой done:

for png in $(ls output); do tesseract -l eng output/$png output/$(echo $png | sed -e "s/\.png//g") pdf; done

Текст будет выводиться в оболочку во время выполнения команды:

Tesseract Open Source OCR Engine v4.1.1 with Leptonica
Tesseract Open Source OCR Engine v4.1.1 with Leptonica
Tesseract Open Source OCR Engine v4.1.1 with Leptonica
Tesseract Open Source OCR Engine v4.1.1 with Leptonica

Синтаксис Tesseract выглядит так: 

tesseract -l language input_filename output_base_filename [pdf]

Если компонент -l language пропущен — Tesseract по умолчанию задействует английскую языковую модель, а если пропущен параметр pdf — Tesseract выводит обнаруженный текст отдельно от входного изображения, а не в формате PDF. Добавленный к этой команде дополнительный синтаксис sed обеспечивает предоставление правильных путей к Tesseract, а расширения файлов .png будут удалены при переименовании выходных файлов в .pdf.

Примечание. В Ubuntu Tesseract по умолчанию не устанавливает все языковые модели. Если вам нужно выполнить OCR не на английском языке, следует установить пакет tesseract-ocr-all с помощью команды sudo apt install tesseract-ocr-all.

Больше примеров командной строки Tesseract можно найти здесь.

После запуска Tesseract снова проверьте выходной каталог:

ls output

Видим все недавно созданные страницы PDF.

00001.pdf  00003.pdf  00005.pdf  00007.pdf  00009.pdf  00011.pdf  00013.pdf
00001.png  00003.png  00005.png  00007.png  00009.png  00011.png  00013.png
00002.pdf  00004.pdf  00006.pdf  00008.pdf  00010.pdf  00012.pdf  00014.pdf
00002.png  00004.png  00006.png  00008.png  00010.png  00012.png  00014.png

Если вам нужно только выходное изображение, можете перейти к последним пунктам этого мануала, там вы узнаете больше о возможностях массового извлечения текста. А если вы используете PDF, то далее мы восстановим и доработаем его.

3: Восстановление PDF-файлов из изображений (необязательно)

В предыдущем разделе мы применяли PDF-файл в качестве исходного, а теперь нужно снова с помощью PDFtk и Ghostscript собрать его из отдельных страниц, созданных Tesseract. Поскольку они последовательно пронумерованы, для их объединения в команду pdftk cat можно передать упорядоченный список файлов с помощью синтаксиса оболочки:

pdftk output/*.pdf cat output joined.pdf

Теперь есть один PDF-файл, восстановленный из выходных данных Tesseract – join.pdf. Осталось только переформатировать PDF с помощью Ghostscript. Это нужно сделать, потому что Tesseract не всегда точно соблюдает размеры PDF. Новый PDF-файл сейчас намного больше, чем исходный, так как он не был оптимизирован, потому нам нужен Ghostscript — мощный инструмент для повторного рендеринга PDF-файлов в соответствии с точными характеристиками. Выполните команду gs в файле join.pdf:

gs -sDEVICE=pdfwrite -sPAPERSIZE=letter -dFIXEDMEDIA -dPDFFitPage -o final.pdf joined.pdf

Вы можете получить предупреждение от команды о соответствии PDF-файла характеристикам, и это нормально. Ghostscript требовательнее к стандартам PDF, чем другие инструменты, но зато большинство PDF-файлов будут отображаться в большей части программ просмотра.

Параметры -sDEVICE=pdfwrite -sPAPERSIZE=letter -dFIXEDMEDIA -dPDFFitPage применяются для соблюдения размеров PDF. Вам может понадобиться изменить sPAPERSIZE=letter, если вы работаете с другими форматами страниц. Имя файла -o final.pdf, указанное команде gs, будет названием готового документа.

Чтобы убедиться, что распознавание прошло успешно, можно открыть PDF-файл локально в настольном приложении или использовать приложение командной строки. Например, pdftotext извлекает вложенный текст из документа.

Установить pdftotext в Ubuntu можно с помощью пакета poppler-utils. Он содержит инструменты для работы с PDF в командной строке:

sudo apt install poppler-utils

Затем запустите pdftotext в новом PDF:

pdftotext final.pdf

Будет создан новый файл final.txt. Просмотрите содержимое файла с помощью инструмента head:

head final.txt

Вы увидите:

Pakistan Journal of Applied Economics (1983) vol. II, no. 2 (167—180)

THE MEASUREMENT OF FARM-SPECIFIC
TECHNICAL EFFICIENCY

1. P. KALIRAJAN and J. C, FLINN*
Measures of technical efficiency were estimated using a stochastic translog
production frontier for a sample of rainfed rice farmers in Bicol, Philippines.
These estimates were farm specific as opposed to being based on deviations
from an average sample efficiency. A wide variation in the level of technical

Получим поток текста из входного файла. Он может быть расположен не по порядку или включать какие-то странные символы форматирования, но это норма при выводе всего текста сразу —  главное, что документ теперь содержит встроенный текст. На этом этапе можно удалить созданный каталог output, в котором содержатся незавершенные изображения и страницы PDF. Эти изображения нам больше не понадобятся.

Теперь у вас есть сквозной конвейер OCR, в котором присутствуют три инструмента и четыре команды. Их можно объединить в отдельный сценарий, интегрировать в другое приложение или запускать интерактивно по мере необходимости. Это комплексное решение для отдельных PDF-документов. Далее мы рассмотрим дополнительные параметры форматирования таблиц данных и массового извлечения текста.

4: Извлечение таблиц CSV после OCR (необязательно)

После выполнения OCR на изображениях или PDF-файлах также есть возможность извлечь любые табличные данные или данные в формате электронной таблицы в файл CSV. Это особенно полезно при работе со старыми источниками данных или научными статьями.

Для этого есть два инструмента, и оба работают одинаково: Tabula (написана на Java) и Camelot (на Python).

Tabula

Tabula можно установить как snap-пакет с помощью snap install:

sudo snap install tabula

В PDF-файле, который выступает в качестве примера, найдите таблицу в середине страницы 6:

Теперь нужно запустить tabula в PDF-файле. Укажите, что вам необходимо извлечь таблицу из -p 6 в final.pdf и перенаправить вывод в новый файл test.csv:

tabula -p 6 final.pdf > test.csv

Проверьте качество распознавания таблицы в test.csv. Теперь можно использовать её в качестве входных данных в программах для работы с электронными таблицами (например Excel) или для другого сценария анализа данных.

Camelot

Camelot — это библиотека Python, для ее работы требуются установленые Python и pip — менеджер пакетов Python. Если вы не установили Python, можете ознакомиться с первым пунктом мануала Установка Python 3 и настройка среды программирования на сервере Ubuntu.

Далее установим Camelot с помощью pip install вместе с зависимостью opencv:

sudo pip install camelot-py opencv-python-headless ghostscript

После этого можно запустить camelot в PDF-файле, указав -p 6, путь вывода и тип файла, а также входной файл final.pdf:

camelot -p 6 -f csv -o test.csv stream final.pdf

Для более точной настройки можете ознакомиться с материалами Camelot.

5: Другие инструменты OCR

Хотя Tesseract это самый долго разрабатываемый инструмент OCR, есть и другие программы для выполнения OCR. EasyOCR — это новый механизм OCR с открытым исходным кодом, он активно развивается и обеспечивает быстрые и точные результаты за счет работы на GPU. Но EasyOCR не поддерживает вывод в формате PDF, что затрудняет реконструкцию входных документов. Он полезен для вывода больших объемов необработанного текста.

EasyOCR — это библиотека Python, для работы с которой нужно установить Python и pip.

Затем установите EasyOCR с помощью pip install:

sudo pip install easyocr

После установки EasyOCR его можно использовать как библиотеку со скриптом Python или вызывать его из командной строки с помощью команды easyocr. Пример команды EasyOCR:

easyocr -l ch_sim en -f image.jpg --detail=1 --gpu=True

EasyOCR поддерживает одновременную загрузку нескольких языковых моделей для выполнения многоязычного OCR. Можно указать несколько языков после флага -l, в примере это ch_sim (упрощенный китайский) и en (английский). -f image.jpg — путь к входному файлу. –detail=1 передаст координаты рамок вместе с выводом, если вам нужно указать на местоположение извлеченного текста в файле. Можно не указывать эту информацию, используя флаг –detail=0.

Если среда GPU настроена, то флаг -gpu=True можно не использовать, и он будет пытаться использовать путь кода CUDA для более эффективного извлечения.

Подводим итоги

В этом мануале мы создали конвейер OCR с помощью инструментов с открытым исходным кодом, которые можно внедрить в другие стеки приложений или открыть через веб-сервис. Также мы рассмотрели синтаксис и опции этих инструментов для их “тонкой настройки” и возможности OCR для массового извлечения таблиц CSV и текста.

OCR — это хорошо понятная и широко используемая технология. Несмотря на это, реализация OCR “под ключ” часто ограничивается платным настольным программным обеспечением. 

Читайте также: Введение в машинное обучение

Tags: , , ,

Добавить комментарий