web-dev-qa-db-ja.com

PDF iTextを使用したテキスト抽出

情報抽出の研究を行っており、iTextを利用したいと考えています。

現在、iTextを調査中です。私たちがレビューした文献によると、iTextは使用するのに最適なツールです。 iTextの1行あたりPDFからテキストを抽出することは可能ですか?私はここに私の関連するstackoverflowの質問投稿を読みましたが、それを抽出しないためにテキストを読んだだけです。誰かが私の問題を手伝ってくれる?ありがとうございました。

10
rogelie

セオドアが言ったように、PDFからテキストを抽出でき、クリスが指摘したように

それが実際にテキストである限り(アウトラインやビットマップではない)

最善の方法は、BrunoLowagieの本Itextを実際に購入することです。第2版​​では、第15章でテキストの抽出について説明します。

しかし、あなたは例のために彼のサイトを見ることができます。 http://itextpdf.com/examples/iia.php?id=279

そして、それを解析してプレーンなtxtファイルを作成できます。コード例は次のとおりです。

/*
 * This class is part of the book "iText in Action - 2nd Edition"
 * written by Bruno Lowagie (ISBN: 9781935182610)
 * For more info, go to: http://itextpdf.com/examples/
 * This example only works with the AGPL version of iText.
 */

package part4.chapter15;

import Java.io.FileOutputStream;
import Java.io.IOException;
import Java.io.PrintWriter;

import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.parser.PdfReaderContentParser;
import com.itextpdf.text.pdf.parser.SimpleTextExtractionStrategy;
import com.itextpdf.text.pdf.parser.TextExtractionStrategy;

public class ExtractPageContent {

    /** The original PDF that will be parsed. */
    public static final String PREFACE = "resources/pdfs/preface.pdf";
    /** The resulting text file. */
    public static final String RESULT = "results/part4/chapter15/preface.txt";

    /**
     * Parses a PDF to a plain text file.
     * @param pdf the original PDF
     * @param txt the resulting text
     * @throws IOException
     */
    public void parsePdf(String pdf, String txt) throws IOException {
        PdfReader reader = new PdfReader(pdf);
        PdfReaderContentParser parser = new PdfReaderContentParser(reader);
        PrintWriter out = new PrintWriter(new FileOutputStream(txt));
        TextExtractionStrategy strategy;
        for (int i = 1; i <= reader.getNumberOfPages(); i++) {
            strategy = parser.processContent(i, new SimpleTextExtractionStrategy());
            out.println(strategy.getResultantText());
        }
        reader.close();
        out.flush();
        out.close();
    }

    /**
     * Main method.
     * @param    args    no arguments needed
     * @throws IOException
     */
    public static void main(String[] args) throws IOException {
        new ExtractPageContent().parsePdf(PREFACE, RESULT);
    }
}

ライセンスに注意してください

この例は、AGPLバージョンのiTextでのみ機能します。

他の例を見ると、テキストの一部を省略したり、PDFの一部を抽出したりする方法がわかります。

それが役に立てば幸い。

17
ruud van reede

iTextを使用するとそれが可能になりますが、テキストブロックの粒度については保証されません。これらは、ドキュメントの作成に使用される実際のpdfレンダラーによって異なります。

各単語または文字でさえ、独自のテキストブロックを持っている可能性は十分にあります。また、これらは辞書式順序である必要はありません。信頼できる結果を得るには、座標に基づいてテキストブロックを並べ替える必要がある場合があります。また、テキストブロック間にスペースを挿入する必要があるかどうかを計算する必要がある場合もあります。

3
Theodore Bundie