Java iText使用外部签名签署PDF - 容器大小估计

时间:2015-03-31 09:03:11

标签: 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.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(appearance, external, 8192);的最后一个参数是estimatedSize - 签名的保留大小。

如果PDF具有例如10 000字节并且estimatedSize设置为10 000字节并且实际签名容器具有1 000字节,则生成的PDF将具有原始PDF + {{1的大小而不是原始PDF的大小+签名容器的大小,这可能要大得多。

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

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

有没有其他方法如何使用iText签署PDF文档以避免这种情况?

1 个答案:

答案 0 :(得分:1)

这里已经有了这个问题的答案:https://stackoverflow.com/a/29345340/1622493有人表示选择0作为估算大小的值会导致iText在您的位置进行估算。

您无法计算签名的完全大小,但在我的书Digital signatures for PDF documents的第3.5节中,我详细解释了您应该考虑哪些因素:< / p>

enter image description here

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

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