Пакетная обработка больших объемов PDF файлов бесплатно

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

Дополнительные условия:
Для каталогизации есть массив почти в 20 тыс сканированных документов на английском языке (примерно половина из них состоят из 2-х и более страниц), некоторые из которых содержат прямо распечатанные из офисного ПО документы, а большая часть - сканированные изображения (факсы, машинописные документы 80-ых годов, рукописные документы и т.д.). Так же много смешанных вариантов: в одном файле PDF присутствуют как распечатанные из офисного ПО документы, так и сканированные.

Решить бесплатными средствами с минимизацией ручной работы и минимальным привлечением сторонних ресурсов. Решение должно быть применимо на платформе MS Windows и, по возможности, на платформе Linux.

Решение:
Используются две бесплатные утилиты:

  • Пакет программ xpdf для обработки файлов PDF, работающие из командной строки;
  • Бесплатная программа ("движок") от Google для распознавания текстов Tesseract-OCR, так же работающая из командной строки.

Этапы работы:

  1. Скопировать в MS Excel или любую другую электронную таблицу список файлов PDF для обработки;
  2. Из полученного списка необходимо создать 4 файла BAT с командами для пакетных инструментов:
    1. Извлечь тексты из файлов, содержащих распечатанные из офисного ПО документы. Для каждого файла PDF указать команду:
      Цитата:
      pdftotext.exe -nopgbrk filename001.pdf outputs\txt\filename001.txt
      pdftotext.exe -nopgbrk filename002.pdf outputs\txt\filename002.txt
      pdftotext.exe -nopgbrk filename003.pdf outputs\txt\filename003.txt
      ...

      В результате получилось равное начальному списку количество текстовых файлов. Размер текстовых файлов, содержимое которых мы пытались извлечь из PDF со сканированными документами, равно нулю, так же хватает файлов с какими-то нечитабельными наборами символов. Отфильтровать, к примеру, все текстовые файлы с размером менее 100 байт и удалить - эти документы будут потом распознаны как изображения. Годными признаны 1,5 тыс файлов.

    2. Извлечь все возможные изображения из файлов. Для каждого файла PDF указать команду:
      Цитата:
      pdfimages.exe -j filename001.pdf outputs\img\filename001@
      pdfimages.exe -j filename002.pdf outputs\img\filename002@
      pdfimages.exe -j filename003.pdf outputs\img\filename003@
      ...

      В выходных именах файлов в конце добавлен "@" как разделитель. В случае наличия нескольких изображений в одном PDF они все будут выведены с порядковым номером в конце, который нам необходимо иметь возможность гарантировано отделить от имени основного файла. Если файл filename001.pdf будет содержать три изображения, то на выходе получится, соответственно, три файла:
      Цитата:
      filename001@-0000.ppm



      Если в Вашей задаче в именах файлов PDF может встречаться знак "@", то выберите другой или сочетание знаков, которые гарантировано не встречаются в именах исходных файлов.
      В результате извлечения получилось без малого 70 тыс изображений.

    3. Скопировать список извлеченных изображений в электронную таблицу.
    4. Произвести распознавание изображений с выводом результатов в текстовые файлы (так же возможны HTML, PDF, RTF и т.д.). Для каждого файла изображения указать команду:
      Цитата:
      tesseract -psm 1 outputs\img\filename001@-0000.ppm outputs\img\filename001@-0000
      tesseract -psm 1 outputs\img\filename001@-0001.ppm outputs\img\filename001@-0001
      tesseract -psm 1 outputs\img\filename001@-0002.ppm outputs\img\filename001@-0002
      tesseract -psm 1 outputs\img\filename002@-0000.ppm outputs\img\filename002@-0000
      tesseract -psm 1 outputs\img\filename003@-0000.ppm outputs\img\filename003@-0000
      ...

      В результате получилось такое же количество текстовых файлов с результатами распознавания.

    5. Слить вместе текстовые файлы из пункта 2.4 выше, принадлежащие одному файлу PDF, в один текстовый файл и добавить его к возможно уже имеющемуся текстовому файлу с результатами из пункта 2.1. Для этого по первому списку с именами файлов PDF для каждого файла указать команду:
      Цитата:
      copy /b outputs\img\filename001@*.txt outputs\txt\filename001.txt
      copy /b outputs\img\filename002@*.txt outputs\txt\filename002.txt
      copy /b outputs\img\filename003@*.txt outputs\txt\filename003.txt
      ...
  3. Импортировать список файлов PDF и содержимое текстовых файлов с результатами извлечения данных в ту или иную базу данных, а затем ее обработать и каталогизировать. Для своих целей я создал в базе данных MySQL таблицу с полями для имени файла PDF типа varchar(255) и для содержимого текстового файла типа text. SQL-скрипт для заполнения таблицы я тоже собрал на основании списка файлов PDF (для закачки содержимого текстовых файлов использовал функцию LOAD_FILE()). После импорта данных в БД по второму полю был создан индекс для полнотекстового поиска (fulltext).

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

Самая долгая операция в решении этой задачи была распознать текст из изображений. На этом HTPC, правда под управлением Windows 7 x64 и с 8ГБ ОЗУ, распознавание почти 70 тыс изображений заняло чуть боле 2-х суток. Я подозреваю, что основной преградой здесь была скорость работы дисковой подсистемы. При этом Tesseract-OCR достаточно неплохо распараллеливает процессы по ядрам процессора. И на более мощной машине с большим количеством ядер и быстрой дисковой подсистемой скорее всего можно список команд для распознавания разделить на части в отдельные BAT файлы и запустить их одновременно. Остальные операции суммарно заняли не более 10 часов.


Отправить новый комментарий

Содержимое этого поля хранится скрыто и не будет показываться публично.
  • Доступны HTML теги: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Строки и параграфы переносятся автоматически.
  • You can use BBCode tags in the text.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.

Больше информации о возможностях форматирования

CAPTCHA
Этот вопрос задается для проверки того, не является ли обратная сторона программой-роботом (для предотвращения попыток автоматической регистрации).