iText PdfStamper增加签名pdf

时间:2016-09-26 12:31:22

标签: java pdf itext

为什么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

提前致谢!

1 个答案:

答案 0 :(得分:1)

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

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

enter image description here

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

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

enter image description here

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

enter image description here

总文件大小将始终增加。