2013-04-02 63 views
2

我使用iText庫爲PDF簽署這下50MB對於小文件工作正常。但是,文件,這對於規模較大越來越崩潰一樣,如果文件大小爲150MB,然後它給簽名PDF與Java iText庫崩潰的大文件

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」這是哪裏來的異常功能...親切指導我如何解決這個問題,因爲寫作和附加過程是這樣的功能,我不能改變,並通過線刷新數據線裏面......

+1

我會感到驚訝,如果這有什麼關係的iText。你有沒有嘗試增加你的堆空間?你現在有多大的堆空間? –

+0

netbeans_default_options =「 - J-客戶-J-Xss2m -J-Xms32m -J-XX:PermSize =32米-J-Dapple.laf.useScreenMenuBar =真-J-Dapple.awt.graphics.UseQuartz =真-J-Dsun .java2d.noddraw =真-J-Dsun.java2d.dpiaware =真-J-Dsun.zip.disableMemoryMapping =真-J-Dsun.awt.disableMixing =真正的」這是我從我的netbeans.config了...你的意思是這個文件的配置,看到heapsize? – wolvorinePk

+0

除了布魯諾的提示,請切換到使用PdfReader構造函數,它不會導致整個PDF文檔被分析到內存中。 – mkl

回答

5

我見你已經讀過我的white paper,但我也看到你選擇在內存中籤署文件。正如Michaël所表示的,如果您要求iText使用大量內存,則不應該責怪iText使用大量內存;-)

請閱讀第2.2.4節,題爲「簽名大型PDF文件」。在該部分中,您將找到一個演示如何使用臨時文件進行簽名的示例。這會顯着減少內存使用量。

不要忽略注:如果您使用createSignature()方法有一個臨時文件,你可以使用OutputStreamnull,在這種情況下,臨時文件將作爲實際的目標文件。如果您的目標是在您的文件系統上存儲簽名文件,這是一個很好的做法。如果OutputStreamnull,iText的總是會嘗試刪除臨時文件簽署完成後。

+0

感謝布魯諾......我沒有意識到它明確包含了這個話題 – wolvorinePk