Как извлекать данные из файла PDF, отслеживая его структуру?
Моя цель - извлечь текст и изображения из файла PDF, анализируя его структуру. Возможности для анализа структуры не являются исчерпывающими; Мне нужно только определить заголовки и абзацы.
Я пробовал несколько разных вещей, но в любом из них я не очень далеко:
- Преобразование PDF в текст. Это не работает для меня, поскольку я теряю изображения и структуру документа.
- Преобразование PDF в HTML. Я нашел несколько инструментов, которые помогли мне в этом, и лучший пока что pdftohtml. Этот инструмент действительно хорош, но я не смог успешно проанализировать HTML.
- Преобразование PDF в XML. То же, что и выше.
У кого-нибудь есть предложения по решению этой проблемы?
Ответы
Ответ 1
По сути, это не простое решение для вырезания и вставки, потому что PDF не очень интересуется структурой. На этом сайте есть много других ответов, которые расскажут вам гораздо более подробно, но это должно дать вам основные моменты:
Если определение текстовой структуры в PDF-документах настолько сложно, как читатели PDF делают это так хорошо?
Если вы хотите сделать это в самом PDF (где у вас будет большая часть контроля над процессом), вам придется перебирать весь текст на страницах и определять заголовки, просматривая их текстовые свойства (используемые шрифты, размер относительно другого текста на странице и т.д.).
Кроме того, вам также придется идентифицировать абзацы, глядя на расположение текстовых фрагментов, пробел на странице, близость определенных букв, слов и строк... PDF сам по себе даже не имеет понятие "слово", не говоря уже о "строках" или "параграфах".
Чтобы еще больше усложнить ситуацию, как текст нарисован на странице (и, следовательно, порядок, в котором он появляется в самом файле PDF), даже не должен быть правильным порядком чтения (или то, что мы, люди, рассмотрим для правильного порядка чтения).
Ответ 2
Если это не помеченный контент, PDF не имеет структуры... Вы должны "угадать" это то, что делают различные инструменты. Существует хорошее сообщение в блоге, объясняющее проблемы на http://blog.idrsolutions.com/2010/09/the-easy-way-to-discover-if-a-pdf-file-contains-structured-content/
Ответ 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