Java iText在5440032字节分配上内存不足
我从PDF中提取文本时遇到了一个问题 01-29 09:44:15.397:E/dalvikvm堆(8037):5440032字节分配的内存不足。 我查看了页面的内容,在文本上方有一个图像。我想知道的是如何捕捉错误并跳过该页?我试过:Java iText在5440032字节分配上内存不足,java,android,itext,Java,Android,Itext,我从PDF中提取文本时遇到了一个问题 01-29 09:44:15.397:E/dalvikvm堆(8037):5440032字节分配的内存不足。 我查看了页面的内容,在文本上方有一个图像。我想知道的是如何捕捉错误并跳过该页?我试过: try { pages = new String[pdfPage]; PdfReaderContentParser parser = new PdfReaderContentParser(reader); TextE
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();
}
试试看{
pages=新字符串[pdfPage];
PdfReaderContentParser=新的PdfReaderContentParser(读取器);
文本抽取策略;
对于(int pageNum=1;pageNum,正如我对错误的理解,当内存不足以容纳您正在读取的数据时,会发生这种错误,我相信您无法捕获该错误
我强烈建议您删除一些旧数据,并确保只在变量中保存不太重的数据
或者参考这个
您希望捕获错误并跳过该页,然后尝试使用
try {
...
} catch (Exception e) {
...
}
除非DalvikVM处理内存不足的情况与Java VM完全不同,否则这并不奇怪:Java在这种情况下使用的Throwable
是OutOfMemoryError
,即不是异常
,而是错误
,这是Throwable
的另一大子类型我们,你可能想试试
} catch (OutOfMemoryError e) {
或
甚至
} catch (Throwable e) {
处理您的问题。但是,请注意,当抛出错误时,这通常意味着发生了不好的事情;因此,捕获并忽略它可能会导致程序状态异常
但是,显然,如果您(如您所说)只想尝试跳过一个页面,然后继续,则必须以不同的方式定位try{…}catch(){…}
,更具体地说是围绕单个页面的处理,即在循环内部
另一方面,删除对PDF库中对象的所有引用并重新打开PDF可能会有所帮助,记住Kevin在iText问题邮件列表中对您的问题的回答。按照这个建议,您可以在try{…}catch(){…}中使用所有iText,并有一个有限的循环(对于数量有限的页面)
,您只需记住在某些外部变量中读取的最后一页
此外,您还可以通过使用PdfReader
构造函数来限制内存使用,该构造函数采用RandomAccessFileOrArray
参数——以这种方式构造的读卡器不会在内存中保存所有PDF,而是只保存交叉引用表和一些中心对象。其他所有内容都是按需读取的。如果我只需要文本而不需要im呢年龄?它会跳过图像吗?是的,我认为这会起作用,因为图像尤其是高分辨率的图像会消耗大量内存。问题中的PDF有多大?你使用哪个PdfReader构造函数?试试使用随机访问文件或数组构造函数的那个。
} catch (Throwable e) {