[英]iText Java Signing PDF DocumentException: Not enough space
我正在使用Java的iText 5.5.5,我想使用外部簽名創建簽名的PDF,如下所示:
提取應簽名的PDF文檔,並創建帶有空簽名的PDF,並提供BASE64編碼的字節以供外部簽名機制簽名:
PdfReader reader = new PdfReader(src);
FileOutputStream os = new FileOutputStream(dest);
PdfStamper stamper = PdfStamper.createSignature(reader, os, '\0');
PdfSignatureAppearance appearance = stamper.getSignatureAppearance();
appearance.setVisibleSignature(new Rectangle(36, 748, 144, 780), 1, "test");
appearance.setCertificate(chain[1]);
ExternalSignatureContainer external = new ExternalBlankSignatureContainer(PdfName.ADOBE_PPKLITE, PdfName.ADBE_PKCS7_DETACHED);
MakeSignature.signExternalContainer(appearance, external, 8192);
InputStream is = appearance.getRangeStream();
byte[] toSign = getBytes(is);
this.b64String = new String(Base64.encode(toSign));
使用外部簽名機制對b64String
進行簽名,以在BASE64中提供作為PKCS#7簽名數據的簽名。
創建ExternalSignatureContainer
以僅具有來自外部簽名機制的PKCS#7簽名的數據:
public class MyExternalSignatureContainer implements ExternalSignatureContainer {
protected byte[] sig;
public MyExternalSignatureContainer(byte[] sig) {
this.sig = sig;
}
@Override
public void modifySigningDictionary(PdfDictionary arg0) {
}
@Override
public byte[] sign(InputStream arg0) throws GeneralSecurityException {
return sig;
}
}
使用MyExternalSignatureContainer創建簽名的PDF文檔:
PdfReader reader = new PdfReader(dest);
FileOutputStream os = new FileOutputStream(signedpdf);
ExternalSignatureContainer external = new MyExternalSignatureContainer(signedData);
MakeSignature.signDeferred(reader, "test", os, external);
但是我在最后一行MakeSignature.signDeferred(reader, "test", os, external);
以下異常:
com.itextpdf.text.DocumentException: Not enough space
問題在哪里以及如何解決?
您已經估計簽名將適合8192字節。 但是,簽名byte[]
的字節數超過了8192,因此出現Not Not space space異常。 例如:您的外部簽名容器返回的簽名為10000字節。 iText告訴您10000比8192大,並且您正在問不可能的事情。
解決方法:在創建帶有空簽名的PDF時進行更好的估算。
對您的容器說一下,尺寸估計為:
MakeSignature.signExternalContainer(appearance, external, 0);
estateSize-簽名的保留大小。 估計是否為0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.