Парсинг файлов PDF (особенно с таблицами) с PDFBox

Я должен проанализировать файл PDF, который содержит табличные данные. Я использую PDFBox для извлечения текста файла для парсинга результата (Строка) позже. Проблема состоит в том, что извлечение текста не работает, как я ожидал для табличных данных. Например, у меня есть файл, который содержит таблицу как это (7 столбцов: первые два всегда имеют данные, только один столбец Complexity имеет данные, только один столбец Financing имеет данные):

+----------------------------------------------------------------+
| AIH | Value | Complexity                     | Financing       |
|     |       | Medium | High | Not applicable | MAC/Other | FAE |
+----------------------------------------------------------------+
| xyz | 12.43 | 12.34  |      |                | 12.34     |     |
+----------------------------------------------------------------+
| abc | 1.56  |        | 1.56 |                |           | 1.56|
+----------------------------------------------------------------+

Затем я использую PDFBox:

PDDocument document = PDDocument.load(pathToFile);
PDFTextStripper s = new PDFTextStripper();
String content = s.getText(document);

Те две строки данных были бы извлечены как это:

xyz 12.43 12.4312.43
abc 1.56 1.561.56

Между последними двумя числами нет никаких пробелов, но это не самая большая проблема. Проблема состоит в том, что я не знаю то, что означают последние два числа: Носитель, Высоко, Не применимый? MAC/Другой, FAE? У меня нет отношения между числами и их столбцами.

Это не требуется для меня пользоваться библиотекой PDFBox, таким образом, решение, которое пользуется другой библиотекой, прекрасно. То, что я хочу, должно смочь проанализировать файл и знать то, что означает каждое проанализированное число.

63
задан Brian Tompsett - 汤莱恩 26 April 2017 в 18:57
поделиться

4 ответа

Я не знаком с PDFBox, но вы можете попробовать посмотреть на itext. Хотя на домашней странице говорится о создании PDF, вы также можете выполнять манипуляции и извлечение PDF. Посмотрите, подходит ли он для вашего случая использования.

-1
ответ дан 24 November 2019 в 16:28
поделиться

Извлечение данных из PDF неизбежно связано с проблемами. Документы создаются с помощью какого-то автоматического процесса? Если это так, вы можете подумать о преобразовании PDF-файлов в несжатый PostScript (попробуйте pdf2ps) и посмотреть, содержит ли PostScript какой-то обычный шаблон, который вы можете использовать.

2
ответ дан 24 November 2019 в 16:28
поделиться

Как насчет печати на изображение и выполнения OCR на нем?

Звучит ужасно неэффективно, но это практически сама цель PDF - сделать текст недоступным, вы должны делать то, что вы должны делать.

-1
ответ дан 24 November 2019 в 16:28
поделиться

Вам нужно будет разработать алгоритм для извлечения данных в пригодный для использования формат. Независимо от того, какую PDF-библиотеку вы используете, вам необходимо это сделать. Персонажи и графика рисуются с помощью серии операций рисования с отслеживанием состояния, т. Е. Перемещаются в эту позицию на экране и рисуют глиф для символа 'c'.

Я предлагаю расширить org.apache.pdfbox.pdfviewer.PDFPageDrawer и переопределить метод strokePath . Оттуда вы можете перехватить операции рисования для горизонтальных и вертикальных сегментов линии и использовать эту информацию для определения позиций столбцов и строк в вашей таблице. Затем нужно просто настроить текстовые области и определить, какие числа / буквы / символы отображаются в какой области. Поскольку вы знаете расположение регионов, вы сможете определить, к какому столбцу принадлежит извлеченный текст.

Кроме того, причиной того, что между текстом, который визуально разделен, может не быть пробелов, является то, что очень часто символ пробела не отображается в PDF. Вместо этого обновляется текстовая матрица, и выдается команда рисования для «перемещения», чтобы нарисовать следующий символ и «ширину пробела» отдельно от последнего.

Удачи.

18
ответ дан 24 November 2019 в 16:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: