PDFドキュメントを解析する必要があります。私はすでにパーサーを実装し、Library iTextを使用しましたが、これまでは問題なく機能していました。
しかし、単語の途中に非常に奇妙な空白が含まれる別のドキュメントを解析する必要はありません。例として、私は次のようになります。
Vo rber eitung auf dieMotorradsaison。Viele Motorr adf ahr er
すべての太字の単語を接続する必要がありますが、どういうわけかPDFパーサーは単語に空白を追加しています。しかし、PDFからテキストファイルにコンテンツをコピーして貼り付けると、これらのスペースが表示されません。
最初は、使用しているPDF解析ライブラリが原因だと思いましたが、別のライブラリでもまったく同じ問題が発生します。
解析された単語からを見てみるとsingleSpaceWidth
、空白を追加しているときは常に変化していることに気づきました。手動で組み合わせてみました。しかし、単語を再結合するパターンは実際にはないため、ほとんど不可能です。
他の誰かが同様の問題またはその問題の解決策を持っていましたか?
要求に応じて、ここにいくつかの詳細情報があります:
- iTextバージョン5.2.1
- http://prine.ch/whitespacesProblem.pdf(pdfへのリンク)
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<TextParsingStrategy> textParsingStrategies = new ArrayList<TextParsingStrategy>();
public ArrayList<ImageParsingStrategy> imageParsingStrategies = new ArrayList<ImageParsingStrategy>();
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);
}
}
}