如何避免内存不足,无法通过iText7读取复杂的PDF?

问题描述 投票:0回答:1

我正在使用iText7和Java读取不是很大(10-30MB)的PDF,但是它们包含大量对象,在创建和使用OutOfMemoryError时会导致PdfDocument问题。 (内部xref表和Map/Tree/Pdf[Dict/Array]对象以百万计。)

例如,单个PDF可能只有33MB,但其中包含一个包含一百万行,跨越800页的表格,PdfDocument内部的簿记已达到400MB。这是示例代码和堆转储:

public static void main(String[] args) throws Exception {

    // PDF file is 33MB on disk (one big table over 800 pages)
    File pdf = new File("big.pdf"); // Also tried InputStream

    PdfReader reader = new PdfReader(pdf); // 35MB heap

    PdfDocument document = new PdfDocument(reader); // 400MB+ heap

    // do stuff ... assuming we didn't get an OOM above
}

<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS9ROUxLcS5qcGcifQ==” alt =“来自复杂PdfDocument的堆转储图像” >>

我们为JVM添加了更多的内存,但是我们不知道其中一些PDF可能有多大/复杂,因此需要一个长期的解决方案,理想情况下,该解决方案可以使我们分批读取内容或在某些情况下读取内容-像回调方式(如XML + STAX / SAX)。

是否存在更有效的方式来流PDF或将其分解为给定文件或PdfDocuments的子InputStream?我们要查找和提取诸如表单,表格,工具提示等对象。

更新:

我与IText团队联系,并且IText7不允许部分读取PDF。因此,在这种情况下,除了添加更多RAM或预解析PDF mysql并查找“数据太多”(很多工作)之外,我无能为力。我还检查了PDFBox,它也遇到了同样的问题。

我正在使用iText7和Java读取不是很大(10-30MB)的PDF,但是它们包含大量对象,在创建和使用PdfDocument时会导致OutOfMemoryError问题。 (...

java pdf itext itext7
1个回答
0
投票

您可以执行以下操作来读取大文件:

© www.soinside.com 2019 - 2024. All rights reserved.