我正在使用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问题。 (...
您可以执行以下操作来读取大文件: