我试图使用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楼 票数:2 已采纳

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

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

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

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

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

(a)|(b)|(c)

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

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

  ask by J Zou translate from so

未解决问题?本站智能推荐:

1回复

当我尝试将html转换为pdf时,Itext7抛出错误

我正在使用 Itext7 将 html 转换为 pdf,但是当我尝试将 html 转换为 pdf 时,这使我无法调用“com.itextpdf.layout.margincollapse.MarginsCollapse.joinMargin(float)”为空聚甲醛: 代码: java.lang
1回复

itext7如何合并PDF?

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

如何编辑现有的pdf文件itext7,C#?

之前,我将一个字段编辑到现有的 PDF 文件中,如下所示: 我怎么能用iText7做到这iText7 。 在iText7我找不到PdfStamper等价物。
1回复

使用iText7修改现有pdf时出现路径共享冲突错误

我使用 Itext7 在 c# 中创建了一个 pdf,但是在向其中添加标头后我无法覆盖 pdf,它给出了路径共享冲突错误。 我也在正确关闭文档。 我首先使用以下代码创建至少 10 页的 Pdf: 然后我使用这个函数来添加标题 它给了我这个错误: pdf 已创建,但当它调用 Header() 函数时
1回复

iText7在第一个PDF页面中抛出InlineImageParseException,而在iText5中则完美运行

我正在将iText 7.1.1用于.Net Core 2.0。 当我尝试从PDF的第一页获取文本时,出现以下异常: 码: 除第一页外的所有其他页面在iText 7中均可正常运行。 使用iText 5不会引发异常,并且第一页可以完美地转换为文本。 PDF档案: https : /
1回复

在生成PDF然后使用Itext7合并它时,如何摆脱PDFstartxref错误和AbstractRenderer警告消息?

我正在使用IText版本7.1.6生成PDF,最后我试图将其合并。 以下是用于与注释合并的代码。 合并PDF列表时,出现以下错误和警告。 此外,警告还会多次打印。 谁能让我知道如何解决它? 警告 错误
1回复

使用IText7签名Pdf时的Java堆空间

我创建了这种方法来签署pdf文件: (此方法在最后一页中创建一个图章并签名pdf)但是当我尝试签名500MB文件时,我得到了一个Java堆空间: 如果我尝试对较小的文件进行签名(我只能一一尝试,不知道我是否同时尝试多个,我会遇到相同的错误) 我已经尝试通过我的应用程序更改内存,但没有
1回复

在itext7中添加到PDF时旋转的图像

我正在使用以下扩展方法,我建立在 itext7 的com.itextpdf.layout.Document类型之上,将图像应用于我的应用程序中的 PDF 文档:fun Document.writeImage(imageStream: InputStream, page: Int, x: Float,