Я должен проанализировать файл 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, таким образом, решение, которое пользуется другой библиотекой, прекрасно. То, что я хочу, должно смочь проанализировать файл и знать то, что означает каждое проанализированное число.
Я не знаком с PDFBox, но вы можете попробовать посмотреть на itext. Хотя на домашней странице говорится о создании PDF, вы также можете выполнять манипуляции и извлечение PDF. Посмотрите, подходит ли он для вашего случая использования.
Извлечение данных из PDF неизбежно связано с проблемами. Документы создаются с помощью какого-то автоматического процесса? Если это так, вы можете подумать о преобразовании PDF-файлов в несжатый PostScript (попробуйте pdf2ps) и посмотреть, содержит ли PostScript какой-то обычный шаблон, который вы можете использовать.
Как насчет печати на изображение и выполнения OCR на нем?
Звучит ужасно неэффективно, но это практически сама цель PDF - сделать текст недоступным, вы должны делать то, что вы должны делать.
Вам нужно будет разработать алгоритм для извлечения данных в пригодный для использования формат. Независимо от того, какую PDF-библиотеку вы используете, вам необходимо это сделать. Персонажи и графика рисуются с помощью серии операций рисования с отслеживанием состояния, т. Е. Перемещаются в эту позицию на экране и рисуют глиф для символа 'c'.
Я предлагаю расширить org.apache.pdfbox.pdfviewer.PDFPageDrawer
и переопределить метод strokePath
. Оттуда вы можете перехватить операции рисования для горизонтальных и вертикальных сегментов линии и использовать эту информацию для определения позиций столбцов и строк в вашей таблице. Затем нужно просто настроить текстовые области и определить, какие числа / буквы / символы отображаются в какой области. Поскольку вы знаете расположение регионов, вы сможете определить, к какому столбцу принадлежит извлеченный текст.
Кроме того, причиной того, что между текстом, который визуально разделен, может не быть пробелов, является то, что очень часто символ пробела не отображается в PDF. Вместо этого обновляется текстовая матрица, и выдается команда рисования для «перемещения», чтобы нарисовать следующий символ и «ширину пробела» отдельно от последнего.
Удачи.