我使用ittext库进行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, ' ');
//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。这是异常发生的函数…请指导我如何解决这个问题,因为写作和追加过程是在这个函数内,我不能改变和逐行刷新数据…
我看到您已经阅读了我的白皮书,但我也看到您选择在内存中签署文件。正如Michaël所示,如果您要求iText使用大量内存,则不应该责怪iText使用了大量内存;-)
请阅读第2.2.4节"签名大型PDF文件"。在该部分中,您将看到一个示例,演示如何使用临时文件进行签名。这将大大减少内存使用。
不要忽略注意事项:如果您对临时文件使用createSignature()
方法,则可以使用OutputStream
即null
,在这种情况下,临时文件将作为实际的目标文件。如果您的目标是在文件系统中存储签名文件,那么这是一个很好的实践。如果OutputStream
不是null
,则在签名完成后,ittext将始终尝试删除临时文件。