簡體   English   中英

使用Java Itext庫對PDF簽名導致大文件崩潰

[英]Signing PDF with Java itext library crashing for big files

我正在使用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”這是發生異常的函數...善於指導我如何解決此問題,因為寫入和附加過程位於該函數內部,我無法逐行更改和刷新數據...

我看到您已經閱讀了我的白皮書 ,但是我也看到您選擇在內存中簽名文檔。 正如Michaël指出的那樣,如果您要iText使用大量內存,則不應怪iText使用大量內存;-)

請閱讀標題為“簽名大型PDF文件”的2.2.4節。 在該部分中,您將找到一個示例,說明如何使用臨時文件進行簽名。 這將顯着減少內存使用。

不要忽略此注釋:如果對臨時文件使用createSignature()方法,則可以使用nullOutputStream ,在這種情況下,臨時文件將用作實際的目標文件。 如果您的目標是在文件系統上存儲簽名文件,則這是一種好習慣。 如果OutputStream不為null ,則在完成簽名后,iText將始終嘗試刪除該臨時文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM