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

Java iText sign PDF with external signature - container size estimation

使用iText对带有外部签名的PDF文档进行签名时,需要先准备一个空的签名容器:

PdfReader reader = new PdfReader(src);
FileOutputStream os = new FileOutputStream(dest);
PdfStamper stamper = PdfStamper.createSignature(reader, os, '[=11=]');
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 + estimatedSize,而不是原始 PDF 的大小 + 签名容器的大小,后者可能更大。

有什么方法可以准确计算 estimatedSize 参数以避免签名 PDF 的大小增加吗?

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

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

这里已经有了这个问题的答案: 有人指出选择 0 作为估计大小的值将导致 iText 代替您进行估计。

你无法计算签名的 精确 大小,但在我的书 Digital signatures for PDF documents 的第 3.5 节中,我详细解释了你应该计算哪些因素考虑到:

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

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