带外部签名的Java iText签名PDF-容器大小估计

带外部签名的Java iText签名PDF-容器大小估计,java,pdf,size,itext,sign,Java,Pdf,Size,Itext,Sign,使用iText对带有外部签名的PDF文档进行签名时,我必须首先准备空签名容器: PdfReader reader = new PdfReader(src); FileOutputStream os = new FileOutputStream(dest); PdfStamper stamper = PdfStamper.createSignature(reader, os, '\0'); PdfSignatureAppearance appearance = stamper.getSignatu

使用iText对带有外部签名的PDF文档进行签名时,我必须首先准备空签名容器:

PdfReader reader = new PdfReader(src);
FileOutputStream os = new FileOutputStream(dest);
PdfStamper stamper = PdfStamper.createSignature(reader, os, '\0');
PdfSignatureAppearance appearance = stamper.getSignatureAppearance();
appearance.setVisibleSignature(rectangle, 1, fieldName);
appearance.setCertificate(chain[0]);
ExternalSignatureContainer external = new ExternalBlankSignatureContainer(PdfName.ADOBE_PPKLITE, PdfName.ADBE_PKCS7_DETACHED);
MakeSignature.signExternalContainer(appearance, external, 8192);
MakeSignature.signExternalContainer的最后一个参数(外观,外部,8192)
是签名的保留大小

例如,如果PDF有10000字节,并且
estimatedSize
设置为10000字节,而实际签名容器有1000字节,则生成的PDF的大小将为原始PDF+
estimatedSize
,而不是原始PDF的大小+签名容器的大小,后者可能大得多

有没有办法精确计算
estimatedSize
参数以避免签名PDF的大小增加

或者,能够计算签名的确切大小的先决条件是什么


有没有其他方法可以使用iText对PDF文档进行签名来避免这种情况?

这里已经有了这个问题的答案:如果有人指出,为估计大小的值选择
0
,将导致iText在您的位置进行估计

您无法计算签名的确切大小,但在我的书的第3.5节中,我详细解释了您应该考虑哪些因素:

假设您有一个使用证书创建的签名,该证书是需要添加2个OSCP响应的链的一部分,则需要添加2倍4192字节。如果要添加CRL,则需要估计CRL将占用多少字节。对于良好的CA,这可能是一个较低的数字。如果CA不好,CRL可能会很大。(换句话说:选择CRL或OSCP之间的权衡将取决于CA。)

另一个非常有用的指示是发送到客户端并在客户端签名的字节数。如果您已经发送了一个包含超过10000字节的哈希,那么您不应该期望签名的哈希小于10000字节。签名哈希的大小取决于签名算法和密钥长度