-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 循环中的所有行并且没有错误。但是当我忽略strategy = parser.processContent(pageNum, new SimpleTextExtractionStrategy()); 它会出错。

4

2 回答 2

0

您想捕获错误并跳过该页面并尝试使用

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

这没有成功。除非 DalvikVM 处理与 Java VM 完全不同的内存不足情况,否则这并不奇怪:ThrowableJava 在这种情况下使用的 是的另一个大子类型OutOfMemoryError,即不是一个,Exception而是一个。因此,您可能想尝试ErrorThrowable

} catch (OutOfMemoryError e) {

或者

} catch (Error e) {

甚至

} catch (Throwable e) {

来处理你的问题。但是请注意,当Error抛出 an 时,这通常意味着正在发生一些不好的事情。因此,捕获和忽略它可能会导致奇怪的程序状态。

但是,显然,如果您(如您所说)只想尝试跳过单个页面并继续,您将不得不定位try { ... } catch() { ... }不同的位置,更具体地说,围绕单个页面的处理,即在循环内。

另一方面,删除对 PDF 库持有的对象的所有引用并重新打开 PDF 可能会有所帮助,请记住 Kevin在 iText-Questions 邮件列表中对您的问题Search Text and Capacity of iText to read的回答。按照该建议,您将在try { ... } catch() { ... },您只需记住在某些外部变量中读取的最后一页。

PdfReader此外,您可以通过使用带有参数的构造函数来限制内存使用RandomAccessFileOrArray——以这种方式构造的阅读器不会将所有 PDF 保存在内存中,而只会保存交叉引用表和一些中心对象。其他所有内容按需阅读。

于 2013-01-29T07:53:20.987 回答
0

正如我所了解的错误,当内存不足以容纳您正在读取的数据时,我相信您无法捕捉到该错误。

我强烈建议您删除一些旧数据,并确保在您的变量中只保留不太重的数据。

或参考这个

由于要显示大量图像缩略图而导致内存不足错误

于 2013-01-29T02:07:33.373 回答