Мне нужно проанализировать PDF-документ. Я уже реализовал парсер и использовал библиотеку iText , и до сих пор все работало без проблем.
Но нет, мне нужно разобрать другой документ, в котором есть очень странные пробелы в середине слов. В качестве примера я получаю:
Vo rber eitung auf die Motorr adsaison. Viele Motorr adf ahr er
Все слова, выделенные жирным шрифтом, должны быть связаны, но анализатор PDF каким-то образом добавляет в слова пробелы. Но когда я копирую и вставляю содержимое из PDF в текстовый файл, я не получаю этих пробелов.
Сначала я подумал, что это из-за библиотеки синтаксического анализа PDF, которую я использую, но и с другой библиотекой я получаю точно такую же проблему.
Я посмотрел на singleSpaceWidth
из проанализированных слов и заметил, что они всегда меняются тогда, когда добавляются пробелы. Пробовал собирать их вручную. Но поскольку шаблона для рекомбинации слов на самом деле нет, это почти невозможно.
У кого-нибудь была похожая проблема или хотя бы решение этой проблемы?
По просьбе, вот дополнительная информация:
Анализ с помощью SemTextExtractionStrategy:
PdfReader reader = new PdfReader("data/SpecialTests/SuedostSchweiz/" + src);
SemTextExtractionStrategy semTextExtractionStrategy = new SemTextExtractionStrategy();
for (int i = 1; i <= reader.getNumberOfPages(); i++) {
// Set the page number on the strategy. Is used in the Parsing strategies.
semTextExtractionStrategy.pageNumber = i;
// Parse text from page
PdfTextExtractor.getTextFromPage(reader, i, semTextExtractionStrategy);
}
Здесь метод SemTextExtractionStrategy, который фактически анализирует текст. Там я вручную добавляю после каждого проанализированного слова пробел, но каким-то образом он разделяет слова при обнаружении:
@Override
public void parseText(TextRenderInfo renderInfo, int pageNumber) {
this.pageNumber = pageNumber;
String text = renderInfo.getText();
currTextBlock.getText().append(text + " ");
....
}
Вот весь класс SemTextExtraction, но там он вызывает только метод сверху (parseText):
public class SemTextExtractionStrategy implements TextExtractionStrategy {
// Text Extraction Strategies
public ColumnDetecter columnDetecter = new ColumnDetecter();
// Image Extraction Strategies
public ImageRetriever imageRetriever = new ImageRetriever();
public int pageNumber = -1;
public ArrayList textParsingStrategies = new ArrayList();
public ArrayList imageParsingStrategies = new ArrayList();
public SemTextExtractionStrategy() {
// Add all text parsing strategies which are later on applied on the extracted text
// textParsingStrategies.add(fontSizeMatcher);
textParsingStrategies.add(columnDetecter);
// Add all image parsing strategies which are later on applied on the extracted text
imageParsingStrategies.add(imageRetriever);
}
@Override
public void beginTextBlock() {
}
@Override
public void renderText(TextRenderInfo renderInfo) {
// TEXT PARSING
for(TextParsingStrategy strategy : textParsingStrategies) {
strategy.parseText(renderInfo, pageNumber);
}
}
@Override
public void endTextBlock() {
}
@Override
public void renderImage(ImageRenderInfo renderInfo) {
for(ImageParsingStrategy strategy : imageParsingStrategies) {
strategy.parseImage(renderInfo);
}
}
}