Методы разбора больших файлов PDF

У меня есть очень большой файл PDF (200 000 КБ или более), который содержит серию страниц, содержащих только таблицы. Я хотел бы как-то разобрать эту информацию с помощью Ruby и импортировать полученные данные в базу данных MySQL.

Кто-нибудь знает какие-либо методы извлечения этих данных из PDF? Данные форматируются следующим образом:

Имя | Адрес | Отчет о наличных деньгах | Отчетный год | Имя владельца

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

Из-за неправильного формата я застрял в этом. По крайней мере, может ли кто-нибудь указать мне библиотеку Ruby PDF для этой задачи?

ОБНОВЛЕНИЕ: Я случайно указал неверную информацию! Фактический размер файла составляет 300 МБ или 300 000 КБ. Я сделал изменение выше, чтобы отразить это.


person Anthony    schedule 14.09.2010    source источник
comment
Вау, действительно PDF-файл размером 200 ГБ?   -  person llasram    schedule 15.09.2010
comment
Ваш размер 200 000 МБ будет равен 200 ГБ; это должно быть опечатка. Но даже если это только 200 МБ: это тоже большой PDF, учитывая, что он должен содержать только текст в таблицах. Сколько страниц составляют эти 200 МБ? Некоторые программы для обработки PDF-файлов не очищают полученный файл при редактировании (удалении, изменении, добавлении страниц) PDF-файла. На самом деле, вы даже можете удалить 90% страниц, которые больше не будут видны ни в одном просмотрщике. Но результирующий PDF-файл может быть больше в размере файла, потому что функция удаления только добавила теги к объектам PDF, пометив их как скрытые/невидимые, но не удалила ни одного байта.   -  person Kurt Pfeifle    schedule 15.09.2010
comment
Извините, это была опечатка. Фактический размер составляет 300 000 КБ. В документе более 216 000 страниц одинакового формата.   -  person Anthony    schedule 15.09.2010
comment
ха!, тогда мое предположение о 200000 страниц было не так уж плохо. ;-) Но я вам скажу: 1,4 КБ на страницу чистого текстового контента — это не так уж и плохо. Тогда PDF не нуждается в «санитизации»… :-) [Кстати, вы можете исправить опечатку, добавив новый абзац Update: в свой вопрос.]   -  person Kurt Pfeifle    schedule 15.09.2010
comment
@pipitas: я обновил вопрос. Спасибо за быстрый ответ. Я использовал приложение pdftotext, которое вы мне дали, и теперь у меня есть текстовый файл размером 800 МБ. По крайней мере, на данный момент это обычный текстовый формат, с которым я могу работать. Спасибо.   -  person Anthony    schedule 16.09.2010


Ответы (5)


Я предполагаю, что вы можете без проблем копировать и вставлять текстовые фрагменты, когда ваш PDF-файл открыт в Acrobat Reader или какой-либо другой программе просмотра PDF?

Прежде чем пытаться анализировать и извлекать текст из таких файлов-монстров программно (даже если это всего 200 МБ - для простого текста в таблицах это ооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооо)

  1. Попробуйте сначала очистить файл, повторно перегнав его.
  2. Попробуйте с помощью различных инструментов CLI извлечь текст в файл .txt.

Это дело нескольких минут. Написание программы Ruby для этого, безусловно, является делом часов, дней или недель (в зависимости от ваших знаний о внутреннем устройстве формата файла PDF... Я подозреваю, что у вас пока нет большого опыта в этом).

Если "2." работает, вы можете уже наполовину сделать. Если это работает, вы также знаете, что сделать это программно с помощью Ruby — задача, которую в принципе можно решить. Если "2." не работает, вы знаете, что это может быть чрезвычайно сложно достичь программно.

Очистите «Monster.pdf»:

Я предлагаю использовать Ghostscript. Вы также можете использовать Adobe Acrobat Distiller, если у вас есть к нему доступ.

gswin32c.exe ^
  -o Monster-PDF-sanitized ^
  -sDEVICE=pdfwrite ^
  -f Monster.pdf

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

Извлечь текст из PDF:

Я предлагаю сначала попробовать pdftotext.exe (от ребят из XPDF ). Есть и другие, немного более неудобные методы, но этот уже может сработать:

pdftotext.exe ^
   -f 1 ^
   -l 10 ^
   -layout ^
   -eol dos ^
   -enc Latin1 ^
   -nopgbrk ^
   Monster-PDF-sanitized.pdf ^
   first-10-pages-from-Monster-PDF-sanitized.txt

Это не приведет к извлечению всех страниц, а только 1-10 (для проверки концепции, чтобы увидеть, работает ли она вообще). Чтобы извлечь из каждой страницы, просто оставьте параметр -f 1 -l 10. Возможно, вам потребуется настроить кодировку, изменив параметр на -enc ASCII7 (или UTF-8, UCS-2).

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

person Kurt Pfeifle    schedule 15.09.2010

По крайней мере, может ли кто-нибудь указать мне библиотеку Ruby PDF для этой задачи?

Если вы этого еще не сделали, вам следует проверить два предыдущих вопроса: «Ruby: чтение PDF-файлов" и "ruby pdf анализирует gem/library". PDF::Reader, PDF::Toolkit и Docsplit являются одними из относительно популярных предлагаемых библиотек. Существует даже предложение использовать JRuby и парсер библиотеки Java PDF.

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

person Yaser Sulaiman    schedule 14.09.2010

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

Библиотеки Java являются наиболее надежными и могут делать больше, чем просто извлекать текст. Поэтому я бы посмотрел на JRuby и iText или PDFbox.

person Mark Thomas    schedule 15.09.2010

Проверьте, есть ли в PDF-файле структурированный контент. Я написал статью в блоге, объясняющую это, по адресу http://www.jpedal.org/PDFblog/? р=410

Если нет, вам нужно будет построить его.

person mark stephens    schedule 15.09.2010

Может быть, рубиновая библиотека Prawn? текст ссылки

person Mangano    schedule 14.09.2010
comment
Нет: Prawn — это PDF-библиотека для письма. - person Yaser Sulaiman; 15.09.2010
comment
как iText и другие библиотеки Java, упомянутые другими пользователями - person Mangano; 04.02.2013