Java iText在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

我从PDF中提取文本时遇到了一个问题

01-29 09:44:15.397:E/dalvikvm堆(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();
    }
试试看{
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) {