iText PdfStamper增加签名pdf的大小

为什么PdfStamper每次使用时都会增加我签名的pdf的大小?

那是我的代码:

private static void test(String src, String pwd, String dest) throws Exception { byte[] pwdByte = pwd != null ? pwd.getBytes() : null; PdfReader r = null; PdfStamper stp = null; FileOutputStream fos = null; try { r = new PdfReader(src, pwdByte); fos = new FileOutputStream(dest); stp = new PdfStamper(r, fos, '\0', true); } finally { stp.close(); fos.close(); r.close(); } } 

如果我调用test,则生成的pdf会根据签名信息增加大小:

  • 我的初始pdf有一个LTV标志,但我需要添加一个时间戳。 我需要添加LRv()一些pdf,然后添加addLtvNoTs(),因为它是一个不同的TSA。 这使得在模式中调用两次PdfReader并且每次我这样做都会增加我的pdf 190kb aprox。 这意味着增加380kb。 http://developers.itextpdf.com/question/how-enable-ltv-timestamp-signature

  • 我已经测试过调用上面的测试方法和一个简单的唱歌的pdf,每次我在结果pdf上调用test(),每次增加3,5kb(我认为由于小符号信息)。

为什么pdfstamper增加了我的pdf大小,如果签名甚至我没有添加任何更改? 我怎能避免它? 390kb这是一个问题,因为我需要辞去数千个pdf并存储它们。

我正在使用itext 5.5.9

提前致谢!

这是一个奇怪的问题,因为它揭示了你不理解数字签名的概念。 当您签署PDF时,您希望确保在有人更改单个字节后签名会中断。 每次签署文档时,都可以通过添加签名字典来保护文档以前版本的字节,其中的内容包含至少要保护的字节的签名哈希。

请参阅下图,其中显示了三次签名的PDF架构:

在此处输入图像描述

假设您想要添加第四个签名,并且您希望生成的文件具有与以前相同的大小,则必须更改现有文档中的某些字节。 这将打破至少一个现有签名。

你提到LTV。 LTV意味着添加文档安全存储(DSS)和时间戳签名。 同样的规则适用:您必须添加额外的字节,因为您更改现有字节的那一刻,您将打破现有的签名:

在此处输入图像描述

每次最新时间戳签名的证书到期时,您都必须重复相同的过程:

在此处输入图像描述

总文件大小将始终增加。