【问题标题】:Signing PDF with Java itext library crashing for big files使用 Java itext 库对 PDF 进行签名会导致大文件崩溃
【发布时间】:2013-04-02 09:15:16
【问题描述】:

我正在使用 Itext 库进行 PDF 签名,它适用于 50MB 以下的小文件。但是较大的文件会崩溃,例如文件大小为 150MB 时会崩溃

Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap space
at com.itextpdf.text.pdf.ByteBuffer.append(ByteBuffer.java:210)
at com.itextpdf.text.pdf.ByteBuffer.write(ByteBuffer.java:622)
at java.io.BufferedOutputStream.write(BufferedOutputStream.java:105)
at java.io.FilterOutputStream.write(FilterOutputStream.java:80)
at com.itextpdf.text.pdf.OutputStreamCounter.write(OutputStreamCounter.java:104)
at com.itextpdf.text.pdf.PRStream.toPdf(PRStream.java:230)
at com.itextpdf.text.pdf.PdfIndirectObject.writeTo(PdfIndirectObject.java:157)
at com.itextpdf.text.pdf.PdfWriter$PdfBody.write(PdfWriter.java:397)
at com.itextpdf.text.pdf.PdfWriter$PdfBody.add(PdfWriter.java:386)
at com.itextpdf.text.pdf.PdfWriter.addToBody(PdfWriter.java:848)
at com.itextpdf.text.pdf.PdfStamperImp.close(PdfStamperImp.java:353)
at com.itextpdf.text.pdf.PdfStamperImp.close(PdfStamperImp.java:327)
at com.itextpdf.text.pdf.PdfSignatureAppearance.preClose(PdfSignatureAppearance.java:1244)
at com.itextpdf.text.pdf.security.MakeSignature.signDetached(MakeSignature.java:134)

这是我的签名代码,适用于小于 50 MB 的 pdf 文件

     private void PdfSigningProcess(String src, String dest,
        Certificate[] chain,
        PrivateKey pk, String digestAlgorithm, String provider,
        MakeSignature.CryptoStandard subfilter, String reason, String location)
        throws
        GeneralSecurityException, IOException, DocumentException
  {
    // Creating the reader and the stamper
    PdfReader reader =
            new PdfReader(src);
    FileOutputStream os =
            new FileOutputStream(dest);
    PdfStamper stamper = PdfStamper.
            createSignature(reader, os, '\0');
    //Creating the appearance PdfSignature Appearance
    PdfSignatureAppearance appearance = stamper.getSignatureAppearance();
    appearance.setReason(reason);
    appearance.setLocation(location);
    appearance.setVisibleSignature(new Rectangle(36, 7, 48, 144, 780), 1, "DQCA Signature");
    // Creating the signature 
    ExternalDigest digest = new BouncyCastleDigest();
    ExternalSignature signature =
            new PrivateKeySignature(pk, digestAlgorithm, provider);
    MakeSignature.signDetached(appearance, digest, signature, chain, null, null, null, 0, subfilter); //HERE IT IS CRASHING
}

“MakeSignature.signDetached”这是出现异常的函数......请指导我如何解决这个问题,因为写入和附加过程在这个函数内部,我无法逐行更改和刷新数据......

【问题讨论】:

  • 如果这与 iText 有任何关系,我会感到惊讶。您是否尝试过增加堆空间?你的堆空间现在有多大?
  • netbeans_default_options="-J-client -J-Xss2m -J-Xms32m -J-XX:PermSize=32m -J-Dapple.laf.useScreenMenuBar=true -J-Dapple.awt.graphics。 UseQuartz=true -J-Dsun.java2d.noddraw=true -J-Dsun.java2d.dpiaware=true -J-Dsun.zip.disableMemoryMapping=true -J-Dsun.awt.disableMixing=true" 这就是我得到的我的 netbeans.config ...你的意思是这个文件配置看 heapsize 吗?
  • 除了 Bruno 的提示,请切换到使用不会导致整个 PDF 文档被解析到内存中的 PdfReader 构造函数。

标签: java exception itext digital-signature


【解决方案1】:

我看到你已经阅读了我的white paper,但我也看到你选择在内存中签署文件。正如 Michaël 所指出的,如果您要求 iText 使用大量内存,则不应责怪 iText 使用大量内存;-)

请阅读标题为“签署大型 PDF 文件”的第 2.2.4 节。在该部分中,您将找到一个示例,展示如何使用临时文件进行签名。这将显着减少内存使用。

不要忽略注意事项:如果您使用带有临时文件的createSignature() 方法,您可以使用OutputStreamnull,在这种情况下,临时文件将用作实际的目标文件.如果您的目标是在文件系统上存储签名文件,这是一种很好的做法。如果OutputStream不是null,iText总是会在签名完成后尝试删除临时文件。

【讨论】:

  • 谢谢布鲁诺...我没有意识到它明确包含这个主题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-04
相关资源
最近更新 更多