PDFBox добавляет пробелы в словах

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

Я использую pdfbox-app-1.6.0.jar(последняя версия) в следующем примере файла в разделе Downloads на этой странице: http://www.sheffield.gov.uk/roads/children/parents/6-11/pedestrian-training

Я пробовал с несколькими другими файлами PDF и, похоже, делал то же самое на нескольких страницах.

Я делаю следующее:

java -jar pdfbox-app-1.6.0.jar ExtractText -force -console ~/Desktop/ped training pdf.pdf

в загруженном файле, и вы увидите пробелы в следующем неверно введенном в результате на консоли: • Если дети могут ходить безопасно, это может уменьшить заторы. "

"• Развивает хорошие привычки для дальнейшей жизни".

"www.sheff ield.gov.uk"

"Think Ahead!, который основан на"

и т.д.

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

Я нахожусь на ubuntu и запускаю Sun JDK 1.6.

Я пробовал это в нескольких разных PDF файлах и пытался найти решение на форумах, были похожие ошибки, но все, похоже, было разрешено.

Любая помощь или если кто-то другой имеет такую ​​же проблему, прокомментируйте. Это вызывает большую проблему при индексировании содержимого для поиска.

Ответ 1

К сожалению, в настоящее время нет простого решения для этого.

Внутренне PDF-документы просто содержат инструкции, такие как "поместить символы" abc "в положение X" и "поместить символы" def "в позицию Y", а PDFBox пытается определить, должен ли полученный выделенный текст "abc def" или "abc def", abcdef "на основе таких вещей, как расстояние между X и Y. Эти эвристики в целом довольно точны, но, как вы можете видеть, они не всегда дают правильный результат.

Одним из способов улучшить качество извлеченного текста является попытка поиска словаря для каждого извлеченного слова или токена. Если поиск не удался, попробуйте комбинировать токен со следующим. Если поиск словаря на комбинированном токене преуспевает, то довольно вероятно, что текстовый экстрактор ошибочно добавил дополнительное пространство внутри слова. К сожалению, такой возможности еще нет в PDFBox. См. https://issues.apache.org/jira/browse/PDFBOX-1153 для запроса функции, поданного для этого. Патчи приветствуются!

Ответ 2

Класс org.apache.pdfbox.util.PDFTextStripper (pdfbox-1.7.1) позволяет изменить склонность, чтобы решить, являются ли две строки частью одного и того же слова или нет.

Увеличение spacingTolerance уменьшит количество вставленных пробелов.

/**
 * Set the space width-based tolerance value that is used
 * to estimate where spaces in text should be added.  Note that the
 * default value for this has been determined from trial and error.
 * Setting this value larger will reduce the number of spaces added. 
 * 
 * @param spacingToleranceValue tolerance / scaling factor to use
 */
public void setSpacingTolerance(float spacingToleranceValue) {
    this.spacingTolerance = spacingToleranceValue;
}