Как упоминалось в комментарии, у меня однажды была аналогичная проблема с лигатурами. Мне пришлось проверять файлы PDF на наличие определенных строк, и мне было интересно, почему это не сработало для некоторых. После анализа я обнаружил, что эти файлы содержат лигатуры, и поэтому я не смог найти «Текстовое поле», даже если оно визуально содержало его. Мое решение заключалось в том, чтобы искать не только textfield
, но и textfield
- поэтому ищите две строки, одну с лигатурой и одну без лигатуры.
Вы сказали, что хотите извлечь текст из файлов PDF. Поэтому я бы добавил этап постобработки.
- Извлеките текст, как вы делаете сейчас
- Найдите все лигатуры, например, «» и «», и замените его на «fi».
У меня были документы, в которых после лигатуры не было места, поэтому я рассмотрел оба случая. Также следует учитывать варианты окончания слов (например, «баффи») (может быть, тогда два пробела?).
Общее слово: топи c не так прост, как вы уже исследовали. Этот шаг называется NFK C нормализация . В pdfbox 2.X это делается внутренне (cp. PDFBOX-2384), но в pdfbox 1.X TextNormalize. java было это делается .
Обновление:
Еще одна возможность, которую вы можете попробовать, - это изменить PDFTextStripper. java. Есть метод под названием normalizeWord(...)
. Он преобразует одиночную лигатуру «fi» в «f» и «i». Там можно было добавить
//line 1971...
//for PDFs where ligatures are followed by a space (e.g. "fi ve")
if(word.substring(q+1,q+2).equals(" ")) {
p = q + 2;
}
else {
p = q + 1;
}
Но я пробовал только с pdfbox 2.0.19 (и, похоже, вы используете 1.8.X). Хорошо, что он применяется только при обнаружении лигатуры. Однако это не может быть общим решением из-за проблем со словами, заканчивающимися лигатурой. Но в вашем случае все должно быть в порядке, поскольку после каждой лигатуры всегда остается пробел.