为什么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标志,但我需要添加一个时间戳。我需要添加LPt()一些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
提前致谢!
答案 0 :(得分:1)
这是一个奇怪的问题,因为它揭示了你不理解数字签名的概念。当您签署PDF时,您希望确保在有人更改单个字节后签名会中断。每次签署文档时,都可以通过添加签名字典来保护文档上一版本的字节,其中的内容包含至少要保护的字节的签名散列。
请参阅下图,其中显示了三次签名的PDF架构:
假设您想要添加第四个签名,并且您希望生成的文件具有与之前相同的大小,则必须更改现有文档中的某些字节。这将打破至少一个现有的签名。
你提到LTV。 LTV意味着添加文档安全性存储(DSS)和时间戳签名。适用相同的规则:您必须添加额外的字节,因为您更改现有字节的那一刻,您将打破现有的签名:
每次最新时间戳签名的证书到期时,您都必须重复相同的步骤:
总文件大小将始终增加。