繁体   English   中英

编辑大PDF时iText7(PDFSweep)抛出OutofMemory错误

iText7(PDFSweep) throw OutofMemory Error when redact a large PDF

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我试图使用PDFSweep从PDF中删除一些内容,以下是我的代码的一部分,我正在使用CompositeCleanupStrategy并将RegexBasedCleanupStrategy添加到该策略中:

    CompositeCleanupStrategy strategy = new CompositeCleanupStrategy();
    for (int i = 0; i < keywordlist.size(); i++) {

        String kvalue = keywordlist.get(i);


        Loger.getLogger().info("keyword " + i + "=" + kvalue);

        strategy.add(new RegexBasedCleanupStrategy(kvalue).setRedactionColor(ColorConstants.GRAY));

    }

   try {
        PdfWriter writer = new PdfWriter(dest);
        writer.setCompressionLevel(0);
        PdfDocument pdf = new PdfDocument(new PdfReader(src), writer);
        // sweep
        PdfAutoSweep pdfAutoSweep = new PdfAutoSweep(strategy);

        pdfAutoSweep.cleanUp(pdf);

        // close the document
        pdf.close();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

当工作量很小时,例如只有一两个,清理工作正常,如果关键字列表中有243个,则PDF大小约为70 MB,我得到以下错误:

 Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit 
 exceeded
at java.lang.String.toLowerCase(String.java:2590)
at java.lang.String.toLowerCase(String.java:2670)
at com.itextpdf.io.font.PdfEncodings.convertToString(PdfEncodings.java:287)
at com.itextpdf.kernel.pdf.PdfString.toUnicodeString(PdfString.java:163)
at com.itextpdf.kernel.pdf.canvas.parser.data.TextRenderInfo.getUnscaledBaselineWithOffset(TextRenderInfo.java:425)
at com.itextpdf.kernel.pdf.canvas.parser.data.TextRenderInfo.getBaseline(TextRenderInfo.java:213)
at com.itextpdf.kernel.pdf.canvas.parser.listener.CharacterRenderInfo.<init>(CharacterRenderInfo.java:112)
at com.itextpdf.kernel.pdf.canvas.parser.listener.RegexBasedLocationExtractionStrategy.toCRI(RegexBasedLocationExtractionStrategy.java:156)
at com.itextpdf.kernel.pdf.canvas.parser.listener.RegexBasedLocationExtractionStrategy.eventOccurred(RegexBasedLocationExtractionStrategy.java:135)
at com.itextpdf.pdfcleanup.autosweep.CompositeCleanupStrategy.eventOccurred(CompositeCleanupStrategy.java:115)
at com.itextpdf.kernel.pdf.canvas.parser.PdfCanvasProcessor.eventOccurred(PdfCanvasProcessor.java:534)
at com.itextpdf.kernel.pdf.canvas.parser.PdfCanvasProcessor.displayPdfString(PdfCanvasProcessor.java:549)
at com.itextpdf.kernel.pdf.canvas.parser.PdfCanvasProcessor.access$4700(PdfCanvasProcessor.java:108)
at com.itextpdf.kernel.pdf.canvas.parser.PdfCanvasProcessor$ShowTextArrayOperator.invoke(PdfCanvasProcessor.java:617)
at com.itextpdf.kernel.pdf.canvas.parser.PdfCanvasProcessor.invokeOperator(PdfCanvasProcessor.java:452)
at com.itextpdf.kernel.pdf.canvas.parser.PdfCanvasProcessor.processContent(PdfCanvasProcessor.java:281)
at com.itextpdf.kernel.pdf.canvas.parser.PdfCanvasProcessor.processPageContent(PdfCanvasProcessor.java:302)
at com.itextpdf.kernel.pdf.canvas.parser.PdfDocumentContentParser.processContent(PdfDocumentContentParser.java:77)
at com.itextpdf.kernel.pdf.canvas.parser.PdfDocumentContentParser.processContent(PdfDocumentContentParser.java:90)
at com.itextpdf.pdfcleanup.autosweep.PdfAutoSweep.getPdfCleanUpLocations(PdfAutoSweep.java:130)
at com.itextpdf.pdfcleanup.autosweep.PdfAutoSweep.cleanUp(PdfAutoSweep.java:186)
1 个回复

(完整披露: RegexBasedCleanupStrategy原始作者在此处)

RegexBasedCleanupStrategy不能这样使用。 您正在创建200个此类的实例,所有这些实例都将遍历文档以查看它们是否可以与正则表达式匹配(逐块)PDF。

为此,它们会将所有块存储在文档中,对它们进行排序,然后在它们上循环。

因此,您在内存中将文档复制了200倍左右。 那是你的瓶颈。

我的建议:建立更好的正则表达式。 您显然可以将关键字a,b,c等与正则表达式匹配

(a)|(b)|(c)

这样只会在内存中复制一次文档,然后尝试将聚合正则表达式与此文档进行匹配。

它兼具性能和内存占用优势。

1 iText7(PdfSweep):编辑文本时出现NullPointerException

我正在尝试使用PDFSweep 2.0.0(JAVA)从PDF编辑文本。 我用了这个例子 。 它适用于我拥有的大多数PDF,但是在某些PDF文件上,代码会抛出NullPointerException 。 这是代码示例: 我使用此PDF作为SRC文件。 这是itext7 / ...

2 带旋转矩形的pdfSweep(itext7)

我有要求在itext7中执行编辑。 我们有几个已由用户选择的矩形。 其中一些已经轮换。 我还没有找到在itext7中旋转矩形的能力。 通常,我们如何绘制“旋转”矩形是对我们在代码中绘制的“假”矩形执行一些数学运算,然后使用一系列线条绘制它们,如下所示: 对于图像或类似的情况,我们 ...

4 编辑使用 JFileChooser 选择的 PDF。 文本7

我已经对此进行了编码,它添加了一个新页面并通过在文件名中编码来插入文本。 我试图让它在我的其他程序中工作,该程序使用 JFileChooser 让用户 select 文档。 更换PdfDocument pdfDoc = new PdfDocument(new PdfWriter(dest)); 使 ...

6 iText 7的PdfSweep可以用来突出显示文本吗?

浏览Java iText 7库,PdfSweep类中有一个highlight()方法。 不幸的是,几乎没有文档。 有谁知道是否因此不仅可以使用使用此类进行编辑,还可以对正则表达式进行突出显示? 理想情况下,如果我们可以标记与正则表达式匹配的文本,然后以选择的样式突出显示匹配项,那就 ...

7 itext 7 如何合并PDF?

我有一个问题,需要你的帮助。 我正在运行 itext 7.0.2。 java,我正在尝试将 PdfDocument 类型的列表 ArrayList 合并到一个 pdf 中。 我尝试了以下方法: 导致这个错误: com.itextpdf.kernel.PdfException:无法从正在写 ...

2018-05-11 09:09:15 1 3113   pdf/ itext
8 iText 7拼合PDF

是否可以通过IText7中的PushButton或Button字段来展平AcroForm字段。 例如; 用户下载了PDF文件,然后填写表格并通过按钮将其展平。 谢谢。 ...

2019-12-01 02:39:10 0 209   itext7
暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM