iText 5440032字节分配内存不足

时间:2013-01-29 01:57:41

标签: java android itext

我从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,                     新的SimpleTextExtractionStrategy()); ,它错误。

2 个答案:

答案 0 :(得分:0)

因为我已经理解了错误,当内存不足以容纳您正在阅读的数据时,我发现你无法发现错误。

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

或参考此

Out of memory error due to large number of image thumbnails to display

答案 1 :(得分:0)

您希望捕获错误并跳过该页并尝试使用

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

没有做到这一点。除非DalvikVM处理与Java VM完全不同的内存不足情况,否则这并不奇怪:Java在这种情况下使用的ThrowableOutOfMemoryError,即不是Exception但是Error Throwable} catch (OutOfMemoryError e) { 的另一个大子类型。因此,您可能想尝试

} catch (Error e) {

} catch (Throwable e) {

甚至

Error

处理您的问题。但要注意,当try { ... } catch() { ... }被抛出时,这通常意味着发生了一些不好的事情;因此,捕捉和忽略它可能会导致一个奇怪的程序状态。

显然,如果你(如你所说)只想尝试跳过单个页面而继续,你必须以不同的方式定位try { ... } catch() { ... },更具体地说是围绕单个页面的处理,即在循环内部。

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

此外,您可以使用RandomAccessFileOrArray构造函数来获取{{1}}参数来限制内存使用量 - 以这种方式构造的读取器不会将所有PDF保存在内存中,而只是将交叉引用表和一些中心物体。其他所有内容都按需阅读。