Сохранять "длинные" пробелы в извлечении текста PDFBox - PullRequest
2 голосов
/ 11 января 2011

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

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

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

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

Библиотека / инструмент pdftotext C имеет переключатель '-layout', который пытается сохранить макет. По сути, если бы я мог эмулировать это с PDFBox, это было бы идеально.

Ответы [ 2 ]

2 голосов
/ 12 января 2011

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

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

1 голос
/ 12 января 2011

PDF извлечение текста является сложным.

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

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

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

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

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

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

...