gpt4 book ai didi

java - 使用 PDFBox Annotation ConstructionAppearances() 方法获取 OutOfMemoryError

转载 作者:行者123 更新时间:2023-12-02 01:04:52 24 4
gpt4 key购买 nike

简而言之

我一直在开发一个程序,它可以获取 pdf、突出显示一些单词(通过 pdfbox 标记注释)并保存新的 pdf。

为了让这些注释对某些查看者可见,例如 pdf.js ,在将标记注释添加到页面注释列表之前,需要调用pdAnnotationTextMarkup.constructAppearances()。

但是,通过这样做,在处理包含数千个标记注释的大型文档时,我会遇到 OutOfMemoryError。

我想知道是否有办法防止这种情况发生。

(这是 this ticket 的续集,但这与此无关)

技术规范:

PDFBox 2.0.17
Java 11.0.6+10,采用OpenJDK
MacOS Catalina 10.15.2、16GB、x86_64

我的代码

//my pdf has 216 pages     
for (int pageIndex = 0; pageIndex < numberOfPages; pageIndex++) {
PDPage page = document.getPage(pageIndex);
List<PDAnnotation> annotations = page.getAnnotations();

// each coordinate obj represents a hl annotation. crashing with 7.816 elements
for (CoordinatePoint coordinate : coordinates) {
PDAnnotationTextMarkup txtMark = new PDAnnotationTextMarkup(PDAnnotationTextMarkup.SUB_TYPE_HIGHLIGHT);
txtMark.setRectangle(pdRectangle);
txtMark.setQuadPoints(quadPoints);
txtMark.setColor(getColor());
txtMark.setTitlePopup(coordinate.getHintDescription());
txtMark.setReadOnly(true);

// this is what makes everything visible on pdf.js and what causes the Java heap space error
txtMark.constructAppearances();

annotations.add(txtMark);
}
}

当前结果

这是导致该问题的繁重 pdf 文档: https://pdfhost.io/v/I~nu~.6G_French_Intensive_Care_Society_International_congress_Ranimation_2016.pdf

我的程序尝试在整个 216 页中添加 7.816 个注释。

和堆栈跟踪:

[main] INFO highlight.PDFAnnotation - Highlighting 13613_2016_Article_114.pdf...
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at org.apache.pdfbox.io.ScratchFile.<init>(ScratchFile.java:128)
at org.apache.pdfbox.io.ScratchFile.getMainMemoryOnlyInstance(ScratchFile.java:143)
at org.apache.pdfbox.cos.COSStream.<init>(COSStream.java:61)
at org.apache.pdfbox.pdmodel.interactive.annotation.handlers.PDAbstractAppearanceHandler.createCOSStream(PDAbstractAppearanceHandler.java:106)
at org.apache.pdfbox.pdmodel.interactive.annotation.handlers.PDHighlightAppearanceHandler.generateNormalAppearance(PDHighlightAppearanceHandler.java:136)
at org.apache.pdfbox.pdmodel.interactive.annotation.handlers.PDHighlightAppearanceHandler.generateAppearanceStreams(PDHighlightAppearanceHandler.java:59)
at org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationTextMarkup.constructAppearances(PDAnnotationTextMarkup.java:175)
at org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationTextMarkup.constructAppearances(PDAnnotationTextMarkup.java:147)
at highlight.PDFAnnotation.drawHLAnnotations(PDFAnnotation.java:288)

我已经尝试将 jvm xmx 和 xms 参数增加到 -Xmx10g -Xms10g 之类,但这只是稍微推迟了崩溃时间。

我想要什么

我想防止出现此内存问题,并且仍然能够在 pdf.js 查看器中查看我的注释。如果不调用constructAppearances,该过程会更快,我没有这个问题,但注释只能在某些pdf查看器(例如Adobe)上看到。

有什么建议吗?我在这里做错了什么或者遗漏了什么吗?

最佳答案

在即将推出的版本 2.0.19 中,构建外观如下:

annotation.constructAppearances(document);

在2.0.18及更早版本中,您需要自己初始化外观处理程序:

setCustomAppearanceHandler(new PDHighlightAppearanceHandler(annotation, document));

该行可以在 2.0.19 中删除,因为这是默认的外观处理程序。

为什么这一切?因此,注释处理程序中使用文档公共(public)内存空间(“临时文件”),而不是每次创建一个新空间(很大)。后者是在调用 new COSStream() 而不是 document.getDocument().createCOSStream() 时完成的。

当然,所有这些仅在进行大量注释时才重要。

相关 PDFBox 问题:PDFBOX-4772PDFBOX-4080

关于java - 使用 PDFBox Annotation ConstructionAppearances() 方法获取 OutOfMemoryError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60195287/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com