10

PDFドキュメントを解析する必要があります。私はすでにパーサーを実装し、Library iTextを使用しましたが、これまでは問題なく機能していました。

しかし、単語の途中に非常に奇妙な空白が含まれる別のドキュメントを解析する必要はありません。例として、私は次のようになります。

Vo rber eitung auf dieMotorradsaison。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<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);
        }
    }
}
4

3 に答える 3

0

あなたが持っている文書は列に分割されているため、明らかなエラーは列の中にあります

SemTextExtraction頭脳系

クラス。私は、クラスColumnDetecterがおそらく責められるべきものであり、iText ではないと思います。列のサイズに基づいて実装され、それに基づいてテキストを取得するとしか思えません。

テキストだけが必要な場合は、Column のサイズに基づいて、実装をより簡単にすることができます。

于 2012-08-10T13:34:49.830 に答える