-1

PDF からテキストを抽出しているときに問題が発生しました。

01-29 09:44:15.397: E/dalvikvm-heap(8037): 5440032 バイトの割り当てでメモリが不足しています。

ページの内容を調べたところ、テキストの上に画像があります。私が知りたいのは、エラーをキャッチしてそのページをスキップする方法です。私が試してみました:

try {
        pages = new String[pdfPage];
        PdfReaderContentParser parser = new PdfReaderContentParser(reader);
        TextExtractionStrategy strategy;
        for (int pageNum = 1; pageNum <= pdfPage; pageNum++) {
            // String original_content = "";
            // original_content = PdfTextExtractor.getTextFromPage(reader,
            // pageNum, new SimpleTextExtractionStrategy());
            Log.e("MyActivity", "PageCatch: " + (pageNum + fromPage));
            strategy = parser.processContent(pageNum,
                    new SimpleTextExtractionStrategy());
            readPDF(strategy.getResultantText(), pageNum - 1);
        }
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

上記のtry catchは、 strategy = parser.processContent(pageNum, new SimpleTextExtractionStrategy());のエラーをキャッチしません。 forループ内のすべての行をコメントアウトしようとしましたが、エラーはありませんでした。しかし、戦略を除外すると = parser.processContent(pageNum, new SimpleTextExtractionStrategy()); そしてそれはエラーです。

4

2 に答える 2

0

エラーをキャッチしてそのページをスキップし、使用してみました

try {
    ...
} catch (Exception e) {
    ...
}

これはうまくいきませんでした。DalvikVM がメモリ不足の状況を Java VM とはまったく異なる方法で処理しない限り、これは驚くことではありません。そのThrowableような状況で Java によって使用される はOutOfMemoryError、つまり ではなくException、のもうError1 つの大きなサブタイプですThrowable。したがって、試してみることをお勧めします

} catch (OutOfMemoryError e) {

また

} catch (Error e) {

あるいは

} catch (Throwable e) {

あなたの問題を処理します。ただし、Errorがスローされた場合、これは通常、何か悪いことが起こっていることを意味することに注意してください。したがって、それをキャッチして無視すると、奇妙なプログラム状態になる可能性があります。

ただし、明らかに、(あなたが言ったように) 1 つのページだけをスキップして続行したい場合は、try { ... } catch() { ... }別の方法で配置する必要があります。より具体的には、単一のページの処理の周り、つまりループ内に配置する必要があります。

一方、PDF ライブラリに保持されているオブジェクトへのすべての参照を削除し、PDF を再度開くと役立つ場合があります。iText-Questions メーリング リストでの質問Search Text and Capacity of iText to readに対する Kevin の回答を思い出してください。そのアドバイスに従って、すべての iText を使用し、制限されたループ (限られた数のページに対して) を内部で使用すると、try { ... } catch() { ... }いくつかの外部変数で最後に読み取ったページを覚えているだけです。

PdfReaderさらに、パラメーターを取るコンストラクターを使用してメモリ使用量を制限できRandomAccessFileOrArrayます --- そのように構築されたリーダーは、すべての PDF をメモリ内に保持するのではなく、相互参照テーブルといくつかの中心的なオブジェクトのみを保持します。それ以外はすべてオンデマンドで読み取られます。

于 2013-01-29T07:53:20.987 に答える
0

メモリが読み取り中のデータを保持するのに十分でない場合に発生するエラーについて理解したので、そのエラーをキャッチできないと思います。

古いデータをいくつか削除し、変数に重すぎるデータを保持しないようにすることを強くお勧めします。

またはこれを参照してください

表示する画像サムネイルの数が多いため、メモリ不足エラーが発生しました

于 2013-01-29T02:07:33.373 に答える