0

j2ee アプリケーションで PDF ドキュメントを読み込もうとしています。

Web アプリケーションの場合、pdf ドキュメントをディスクに保存する必要があります。検索を簡単にするために、文書内のテキストの逆索引を作成したいと考えています。OCRの場合。

PDFbox ライブラリを使用すると、pdf ファイル全体を含む pdfDocument オブジェクトを作成できます。ただし、メモリを保持して全体的なパフォーマンスを向上させるには、ドキュメントをストリームとして処理し、一度に 1 ページずつバッファーに読み込みます。

PDFを含むファイルストリームをページごと、または一度に1行ずつ読み取ることができるのだろうか。

4

4 に答える 4

1

特定の一般的な pdf ドキュメントの場合、少なくとも PDFBox を使用して、あるページがどこで終了し、別のページが開始するかを知る方法はありません。

リソースの使用が懸念される場合は、pdf ドキュメントを COSDocument に解析し、.getObjects() を使用して COSDocument から解析済みオブジェクトを抽出することをお勧めします。これにより、java.util.List が得られます。これは、あなたが持っている希少なリソースに簡単に適合するはずです.

PDFBox API を使用して、解析した PDF ドキュメントを Lucene インデックスに簡単に変換できることに注意してください。

また、最適化の世界に足を踏み入れる前に、最適化が本当に必要かどうかを確認してください。PDFBox は、非常に大きな PDF ドキュメントのメモリ内表現をそれほど労力をかけずに作成できます。

InputStream から PDF ドキュメントを解析するには、COSDocumentクラスを参照してください。

luceneインデックスを記述するには、LucenePDFDocumentクラスを参照してください。

COSDocuments のメモリ内表現については、FDFDocument を参照してください。

于 2009-03-02T20:39:15.597 に答える
-1

PDF Renderer Java ライブラリを見てください。私は自分で試してみましたが、PDFBox よりもはるかに高速に思えます。ただし、OCRテキストを取得しようとはしていません。

上記のリンクからコピーした例を次に示します。これは、PDF ページを画像に描画する方法を示しています。

    File file = new File("test.pdf");
    RandomAccessFile raf = new RandomAccessFile(file, "r");
    FileChannel channel = raf.getChannel();
    ByteBuffer buf = channel.map(FileChannel.MapMode.READ_ONLY, 0, channel.size());
    PDFFile pdffile = new PDFFile(buf);

    // draw the first page to an image
    PDFPage page = pdffile.getPage(0);

    //get the width and height for the doc at the default zoom 
    Rectangle rect = new Rectangle(0,0,
            (int)page.getBBox().getWidth(),
            (int)page.getBBox().getHeight());

    //generate the image
    Image img = page.getImage(
            rect.width, rect.height, //width & height
            rect, // clip rect
            null, // null for the ImageObserver
            true, // fill background with white
            true  // block until drawing is done
            );
于 2010-08-19T14:12:23.817 に答える
-2

改ページを探して、ファイルをバイト単位で読み取ることができると思います。PDF の書式設定の問題が発生する可能性があるため、1 行ずつ行うのはより困難です。

于 2009-02-25T14:55:36.290 に答える