2011-01-11 2 views
2

Я использую PDFBox для извлечения текста из PDF. PDF имеет табличную структуру, которая довольно проста, а столбцы также очень сильно расставлены друг с другом.Сохранять «длинные» пробелы в извлечении текста PDFBox

Это работает очень хорошо, за исключением того, что все виды горизонтального пространства преобразуются в один символ пробела, так что я не может больше раскрыть столбцы (пространство внутри слов в столбце выглядит просто как пробел между столбцами).

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

Есть ли способ сказать PDFBox, чтобы превратить горизонтальные пробелы более чем x дюймов в нечто иное, чем одно пространство? Также будет работать пропорциональный подход (x inch станет y пробелами).

pdftotext C library/tool имеет переключатель «-layout», который пытается сохранить макет. В принципе, если я смогу подражать этому с помощью PDFBox, это будет идеально.

+0

Возможно, вы захотите посмотреть [этот ответ] (https://stackoverflow.com/a/45842515/1729265). – mkl

ответ

2

Для этого не существует настройки, но мне удалось изменить источник для инструмента PDFTextStripper для вывода разделителя столбцов (|), когда было встречено «длинное» пространство. В коде, где он строит выходную строку, можно посмотреть на позиции x текущей и предыдущей буквы, и если она достаточно большая, сделайте что-то особенное. PDFTextStripper имеет множество защищенных методов, но оказался не совсем таким расширяемым. Мне пришлось копировать весь класс, чтобы изменить частный метод.

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

+1

Какой частный метод вам нужно изменить, и как вы его изменили? –

1

PDF-текст извлечения затруднен.

Если текст был выведен как одна большая строка, разделенные пробелами, такие как: -

PDFTextOut("  Column 1     Column 2   Column 3"); 

и использование шрифта фиксированной шириной, такие как Courier, то вы могли бы теоретически рассчитать количество пробелов между пунктами текст, потому что каждый символ имеет одинаковую ширину. Если шрифт пропорционален Arial, то вычисление сложнее.

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

PDFMoveTo(100,100); 
PDFTextOut("Column 1"); 
PDFMoveTo(250,100); 
PDFTextOut("Column 2"); 

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

+1

Ну, извлечение текста в формате PDF затруднено, но вариант сохранения макета ppftotext xpdf работает довольно хорошо. Было бы неплохо иметь что-то подобное для PDFBox (которому уже удается сохранить порядок чтения, помещая текст в одну строку в одну и ту же выходную строку и группируя символы в слова). Является ли этот вывод открытым текстом достаточно ясным для следующей логики разбора (которая должна восстанавливать таблицу), это еще один вопрос. К счастью, в моем случае это сработало. – Thilo

Смежные вопросы