首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iText7多重签名

iText7多重签名
EN

Stack Overflow用户
提问于 2017-11-10 07:32:07
回答 1查看 1.5K关注 0票数 0

我想用iText7在一个pdf文档中做多个签名,但问题是,当我有一次签名时,它是有效的。如果我签了两次名,第一个签名无效。看起来是这样的:

未签名PDF

签名PDF

这是我的密码:

代码语言:javascript
复制
@Test
public void testMutiSign() {

    iTextSignerUtil1.SignMultPDF(getBytes(unsignedPath), destPath1);

    iTextSignerUtil2.SignMultPDF(getBytes(destPath1), destPath2);

}


 IExternalSignatureContainer externalP7DetachSignatureContainer = new IExternalSignatureContainer() {
    @Override
    public byte[] sign(InputStream data) throws GeneralSecurityException {


        //byte[] hashData = HashUtil.hash(data , "SHA256");

        byte signData = null;
        signData = signUtil.signP7DetachData(data);

        return signData;

    }


    @Override
    public void modifySigningDictionary(PdfDictionary signDic) {
        signDic.put(PdfName.Filter, PdfName.Adobe_PPKLite);
        signDic.put(PdfName.SubFilter, PdfName.Adbe_pkcs7_detached);
    }
};


public void SignMultPDF(byte[] pdfFile , String destPath , String name , String fname , String value){

    boolean success = false;

    int estimatedSize = 300000;

    while (!success) {
        try {

            PdfReader pdfReader = new PdfReader(new ByteArrayInputStream(pdfFile));
            PdfSigner pdfSigner = new PdfSigner(pdfReader, new FileOutputStream(destPath), true);

          pdfSigner.signExternalContainer(externalP7DetachSignatureContainer, estimatedSize);

            success = true;

        } catch (IOException e) {
            e.printStackTrace();
            estimatedSize += 1000;
        } catch (GeneralSecurityException e) {
            e.printStackTrace();
        }
    }
}

以上是我的所有示例代码。

还有一个问题,我是不是错过了创建签名字段?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-13 15:14:43

造成这个问题的原因是原始文件的一个怪癖:它有一个空的间接字典,它既用作信息字典,也用作概述字典。

每当操作PDF iText更新其信息字典时,特别是ModDate可能每次都会更改。

因此,在每次签名传递期间,将更改信息字典,并且随着字典对象的共享,概述字典也是如此。但是,不允许更改已经签名的PDF的大纲。因此,信息(和概述)在创建第二个签名期间的更改是不允许的,并且使第一个签名无效。

这个文件原始文件几乎相同,唯一的区别是它为Info change 使用不同的空字典(因为文件中有一个当前未使用的空间接字典,我只需要将Info大纲E 228的引用更改为这个未使用的对象)。当对此文件进行两次签名时,Adobe不再抱怨。

这是iText中的一个bug还是PDF中的一个bug?我认为iText在更改信息字典时应该使用一个新的间接对象号,因为在PDF中通常不禁止重复使用字典。但是,使用这种重复的间接对象使用的PDF实际上是自找麻烦。因此,我认为这个问题同时带来了iText问题和PDF中的一个问题。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47217751

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档