0

次のコードを使用して itext 5.3.4 を使用してテキスト形式の pdf を抽出する場合:

try {
    reader = new PdfReader(thepdffilename);
} catch (IOException e) {
    openok=false;
}

if (openok==true){
    int numberOfPages = reader.getNumberOfPages();
    PdfReaderContentParser parser = new PdfReaderContentParser(reader);
    for (int page = 1; page <= numberOfPages; page++){
        try {
              SimpleTextExtractionStrategy strategy = parser.processContent(page, new SimpleTextExtractionStrategy());              
            content = content + strategy.getResultantText();
        } catch (Throwable t) { 
            crap=true;
            break;
        }
    }
    reader.close();
}

ただし、ときどき GooglePlay がクラッシュし、itext に NP 例外があったと ANR が報告します。

java.lang.NullPointerException in com.itextpdf.text.pdf.PdfReader$PageRefs.readPages at 
com.itextpdf.text.pdf.PdfReader$PageRefs.readPages(PdfReader.java:3382) at 
com.itextpdf.text.pdf.PdfReader$PageRefs.<init>(PdfReader.java:3350) at com.itextpdf.text.pdf.PdfReader$PageRefs.<init>(PdfReader.java:3328) at 
com.itextpdf.text.pdf.PdfReader.readPages(PdfReader.java:1003) at com.itextpdf.text.pdf.PdfReader.readPdf(PdfReader.java:530) at 
com.itextpdf.text.pdf.PdfReader.<init>(PdfReader.java:170) at 
com.itextpdf.text.pdf.PdfReader.<init>(PdfReader.java:159)

3382 行目の 5.3.4 ソース コードは次のとおりです。

http://grepcode.com/file/repo1.maven.org/maven2/com.itextpdf/itextpdf/5.3.4/com/itextpdf/text/pdf/PdfReader.java?av=f

3374    void  readPages() throws IOException {
3375      if (refsn != null)
3376           return;
3377        refsp = null;
3378            refsn = new ArrayList<PRIndirectReference>();
3379            pageInh = new ArrayList<PdfDictionary>();
3380            iteratePages((PRIndirectReference)reader.catalog.get(PdfName.PAGES));
3381            pageInh = null;
3382            reader.rootPages.put(PdfName.COUNT, new PdfNumber(refsn.size()));
3383        }
3384
3385    void  reReadPages() throws IOException {
3386            refsn = null;
3387            readPages();
3388    }

したがって、特定のpdfファイルでテキストが抽出されているときに何か問題が発生しており、問題のpdfがないため、それが発生する可能性がある理由はおそらくソートされません。

私が必要とするのは、アプリがクラッシュしないように NP 例外をキャッチする方法です。

私はもう試した

} catch (Exception e) {

そして、例外をキャッチしようとする最後の手段として

} catch (Throwable t) {

この特定の itext エラーをキャッチする方法を知っている人はいますか?

ありがとう

4

2 に答える 2

3

私があなたを正しく理解していれば、その NPE をキャッチしようとするあなたの試みは、ドキュメント ページのループ内で行われました。

for (int page = 1; page <= numberOfPages; page++){
    try {
        SimpleTextExtractionStrategy strategy =
            parser.processContent(page, new SimpleTextExtractionStrategy());              
        content = content + strategy.getResultantText();
    } catch (Throwable t) { 
        crap=true;
        break;
    }
}

ただし、例外をよく見ると...

java.lang.NullPointerException in com.itextpdf.text.pdf.PdfReader$PageRefs.readPages at 
com.itextpdf.text.pdf.PdfReader$PageRefs.readPages(PdfReader.java:3382) at 
[...]
com.itextpdf.text.pdf.PdfReader.<init>(PdfReader.java:159)

PdfReader の構築で例外が既に発生していることがわかります ( PdfReader.<init>)。したがって、PdfReader を構築する場所で既に NPE をキャッチする必要があります。

try {
    reader = new PdfReader(thepdffilename);
} catch (IOException e) {
    openok=false;
} catch (NullPointerException npe) { // !!
    openok=false;                    // !!
}

または、チャンスを逃したくない場合

try {
    reader = new PdfReader(thepdffilename);
} catch (Throwable t) {              // !!
    openok=false;
}

a が構築されている他のコードの場所もある場合PdfReaderは、それらも強化することができます。

@BrunoLowagieこのNPEは、タグ付きの例外に変換した方がよいのではないでしょうか?

于 2013-02-28T11:57:40.363 に答える
0

これは見苦しいですが、どうしてもキャッチしたい場合は、RuntimeException をキャッチしてみてください。

于 2013-02-28T11:30:32.893 に答える