我从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()); ,它错误。
答案 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在这种情况下使用的Throwable
是OutOfMemoryError
,即不是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保存在内存中,而只是将交叉引用表和一些中心物体。其他所有内容都按需阅读。