有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java 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符号,但我需要添加一个时间戳。我需要添加LTV()一些PDF,然后添加LTVNOTS(),因为这是一个不同的TSA。这使得在模式append中调用两次PdfReader,每次我这样做都会增加大约190kb的pdf。这意味着增加380kb。 http://developers.itextpdf.com/question/how-enable-ltv-timestamp-signature

  • 我已经用一个简单的sing调用了上面的测试方法,每次我对生成的pdf调用test(),每次都会增加3,5kb(我想是因为小符号信息)

为什么pdfstamper在我没有添加任何更改的情况下也会增加我的pdf大小?我怎样才能避免呢?390kb这是一个问题,因为我需要放弃数千个PDF并存储它们

我正在使用itext 5.5.9

提前谢谢


共 (1) 个答案

  1. # 1 楼答案

    这是一个奇怪的问题,因为它表明你不理解数字签名的概念。当你签署PDF文件时,你要确保一旦有人更改了一个字节,签名就会中断。每次对文档进行签名时,都要添加一个签名字典,其中的内容至少包含要保护的字节的签名哈希,从而保护文档上一版本的字节

    请参见下图,其中显示了签名三次的PDF模式:

    enter image description here

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

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

    enter image description here

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

    enter image description here

    总文件大小将始终增加