Как извлекать данные из файла PDF, отслеживая его структуру?

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

Я пробовал несколько разных вещей, но в любом из них я не очень далеко:

  • Преобразование PDF в текст. Это не работает для меня, поскольку я теряю изображения и структуру документа.
  • Преобразование PDF в HTML. Я нашел несколько инструментов, которые помогли мне в этом, и лучший пока что pdftohtml. Этот инструмент действительно хорош, но я не смог успешно проанализировать HTML.
  • Преобразование PDF в XML. То же, что и выше.

У кого-нибудь есть предложения по решению этой проблемы?

Ответ 1

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

Если определение текстовой структуры в PDF-документах настолько сложно, как читатели PDF делают это так хорошо?

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

Кроме того, вам также придется идентифицировать абзацы, глядя на расположение текстовых фрагментов, пробел на странице, близость определенных букв, слов и строк... PDF сам по себе даже не имеет понятие "слово", не говоря уже о "строках" или "параграфах".

Чтобы еще больше усложнить ситуацию, как текст нарисован на странице (и, следовательно, порядок, в котором он появляется в самом файле PDF), даже не должен быть правильным порядком чтения (или то, что мы, люди, рассмотрим для правильного порядка чтения).

Ответ 3

Вы можете использовать следующий подход, например, с iTextSharp или другими библиотеками с открытым исходным кодом:

  • Прочитайте файл PDF с помощью iTextSharp или аналогичных инструментов с открытым исходным кодом и соберите все текстовые объекты в массив (или конвертируйте PDF в HTML с помощью инструмента например pdftohtml, а затем проанализировать HTML)
  • Сортировка всех текстовых объектов по координатам, чтобы они были вместе.
  • Затем перебираем объекты и проверяем расстояние между ними, чтобы увидеть, могут ли два или более объекта быть объединены в один абзац или нет.

Или вы можете использовать коммерческий инструмент, например ByteScout PDF Extractor SDK, который способен делать именно это:

  • извлеките текст и изображения вместе с анализом макета текста
  • XML или CSV, где текстовые объекты объединяются или разделяются на абзацы внутри сетки виртуального макета.
  • объекты доступа через специальный API, который позволяет адресовать каждый объект через его "виртуальный" индекс строки и столбца, не учитывая, как он хранится в исходном PDF файле.

Отказ от ответственности: я связан с ByteScout

Ответ 4

iText api: PdfReader pr = новый PdfReader ( "C:\test.pdf" );

Литература: PDFReader