Программное обеспечение для извлечения содержимого PDF

Может ли кто-нибудь порекомендовать библиотеку/API с открытым исходным кодом для извлечения текстов и изображений из PDF? Ниже приведены требования. Я использовал PDF Clown, версию С# .NET, но у меня возникли проблемы с созданием таблицы Excel с ее использованием.

  1. Он должен иметь возможность конвертировать таблицы PDF в таблицы Excel/CSV/XML/HTML.
  2. Это должно быть с открытым исходным кодом и не GPL.
  3. Он должен иметь возможность извлекать изображения из PDF.
  4. Если он не может преобразовать таблицу PDF в какой-либо формат, он должен, по крайней мере, дать мне координаты текстов в таблице, чтобы я мог создать из нее таблицу.
  5. Он должен иметь возможность сообщить мне исходную информацию о содержимом PDF после извлечения (какая страница, где на этой странице и т. д.).
Начните с прочтения ISO-32000-2, а затем оцените, сколько времени потребуется для написания такой библиотеки. Вы обнаружите, что (1) вы просите о чем-то, что во многих случаях невозможно (если только ваш PDF-файл не является правильно помеченным PDF-файлом), и (2) такая библиотека будет настолько ценной, что никто не будет предлагать ее по разрешительной лицензии.

Ответы (1)

Извлечение таблиц из PDF

Ваше требование по извлечению таблиц из PDF-файлов выполнить непросто.

Стандартные PDF-файлы не дают никаких намеков на семантику того, что они рисуют на странице: единственное различие, которое обеспечивает синтаксис, — это различия между векторными элементами (линиями, заливками,...), изображениями и текстом.

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

Справочную информацию о том, почему формат файла PDF никогда не следует рассматривать как подходящий для размещения извлекаемых структурированных данных , см. в этой статье:

Почему обновление долларов для документов было таким сложным (ProPublica-Website)

Сказав вышесказанное, теперь позвольте мне добавить следующее:

Табула написана на Ruby. Его исходный код открыт на GitHub . Его лицензия свободна и не является GPL .

Извлечение изображений из PDF

Здесь я бы рекомендовал изучить Poppler . Poppler — это библиотека для рендеринга PDF, созданная на основе кодовой базы xpdf-3.0 .

Он поставляется с утилитой командной строки, pdfimagesкоторая может отображать и извлекать изображения, встроенные в файлы PDF. Вот пример выполнения, в котором перечислены все изображения, содержащиеся в диапазоне страниц 3-5:

$ pdfimages -list -f 3 -l 5 some.pdf

  page num  type width height color comp bpc  enc interp objectID x-ppi y-ppi  size  ratio
  ----------------------------------------------------------------------------------------
   3     0 image   577   645  rgb     3   8  image  yes     593 0   152   152   106K  9.7%
   3     1 smask   577   645  gray    1   8  image  no      593 0   152   152   383B  0.1%
   3     2 image   382   419  rgb     3   8  image  yes     594 0   110   110  56.7K   12%
   3     3 smask   382   419  gray    1   8  image  no      594 0   110   110   178B  0.1%
   4     4 image  1569   344  rgb     3   8  image  yes     534 0   162   162  36.4K  2.3%
   5     5 image   719   930  index   1   8  image  yes     535 0   146   146  42.6K  6.5%

Как видите, результатом является таблица, содержащая всевозможную полезную информацию о встроенных изображениях:

  • номер страницы, на которой они появляются,
  • тип изображения,
  • их размеры по ширине/высоте,
  • их цветовое пространство,
  • количество базовых цветов,
  • глубина цвета,
  • их кодировка,
  • их идентификатор объекта PDF,
  • их соответствующие разрешения в направлениях X или Y и
  • их размеры и коэффициент сжатия.

Чтобы извлечь все изображения со страницы 9 в виде файлов PNG и назвать их префиксом images-from-page9---, используйте эту команду:

$ pdfimages -png -f 9 -l 9 some.pdf images-from-page9---

Чтобы просмотреть дополнительные параметры, запустите pdfimages -h.

Конечно, если вам не нужен инструмент командной строки, а вместо этого вы используете API/библиотеку Poppler со своим собственным кодом, вы можете получить те же функции...

Извлечение текста из PDF

Та же библиотека Poppler также поставляется с программой командной строки для извлечения текста: pdftotext.

Вот его краткий вывод справки :

$ pdftotext -h

 pdftotext version 0.32.0
 Copyright 2005-2015 The Poppler Developers - http://poppler.freedesktop.org
 Copyright 1996-2011 Glyph & Cog, LLC
 Usage: pdftotext [options] <PDF-file> [<text-file>]
   -f <int>          : first page to convert
   -l <int>          : last page to convert
   -r <fp>           : resolution, in DPI (default is 72)
   -x <int>          : x-coordinate of the crop area top left corner
   -y <int>          : y-coordinate of the crop area top left corner
   -W <int>          : width of crop area in pixels (default is 0)
   -H <int>          : height of crop area in pixels (default is 0)
   -layout           : maintain original physical layout
   -fixed <fp>       : assume fixed-pitch (or tabular) text
   -raw              : keep strings in content stream order
   -htmlmeta         : generate a simple HTML file, including the meta information
   -enc <string>     : output text encoding name
   -listenc          : list available encodings
   -eol <string>     : output end-of-line convention (unix, dos, or mac)
   -nopgbrk          : don't insert page breaks between pages
   -bbox             : output bounding box for each word and page size to html.  Sets -htmlmeta
   -opw <string>     : owner password (for encrypted files)
   -upw <string>     : user password (for encrypted files)
   [....]

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

Предостережения

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

См., например, эти последние ответы StackOverflow:


Однако лицензия Poppler - GPL....

Привет, я установил JRuby и попытался установить Tabula с помощью команды jruby -S gem install tabula-extractor, но по какой-то причине я получаю синтаксическую ошибку, есть мысли?
@SharkiChacko: "... есть мысли?" -- Да, два: (1) Первый: "что именно может быть за синтаксическая ошибка, как, черт возьми, я мог ее догадаться, как я мог ответить на это?!?" (2) Второй: «Почему вы не описываете свои проблемы в официальном трекере задач tabula-extractor
Ух ты. Очень хорошее резюме (+1), поздравляю! Итак, читаем между строк: нет инструмента «швейцарской армии», охватывающего все 3 компонента, а затем выводит хорошо отформатированную страницу Markdown, чтобы соответствовать сообщению SE (шучу; HTML со ссылками на изображения и хорошо отформатированный текст тоже подойдет) )?
@Izzy: Нет, нет инструмента «швейцарской армии», отвечающего условиям ОП: с открытым исходным кодом, но не под GPL . (Хотя есть и коммерческие инструменты... но они не так хороши, как tabulaкогда дело доходит до извлечения таблиц.)
Спасибо Курт! Я совсем забыл об этом лицензионном созвездии. Попплер — это то, чем я сейчас в основном пользуюсь, кстати. И я согласен с GPL: все мои программы тоже под GPL. По сути, я нацеливался на один инструмент, который мог бы сопоставить все это: что, если есть PDF-файл с таблицами, изображениями и большим количеством текста? Конечно, предпочтительнее открытый исходный код, но GPL меня устраивает (не думаю, что это оправдывает отдельный вопрос ;)
@Izzy: В швейцарской армии также нет такого инструмента с открытым исходным кодом, даже GPL , извините.
Хорошо, большое спасибо! Не твоя вина :) Было бы слишком мило, хотя...