代码之家  ›  专栏  ›  技术社区  ›  JDChi

iText7多重签名

  •  0
  • JDChi  · 技术社区  · 7 年前

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

    enter image description here

    enter image description here

    unsigned PDF

    signed PDF

    这是我的代码:

    @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();
            }
        }
    }
    

    以上是我的全部示例代码。

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

    1 回复  |  直到 7 年前
        1
  •  2
  •   mkl    7 年前

    这个问题的原因是 original file :它有一个空的间接字典,它将其用作 信息 字典和as 轮廓 字典。

    每当操作PDF iText时 信息 修改日期

    因此,在每次签名过程中 信息 dictionary被更改,并且随着dictionary对象的共享,dictionary对象也随之更改 词典但是改变 轮廓 信息 (和 轮廓 )不允许在创建第二个签名期间进行更改,并使第一个签名无效。

    This file 几乎与 原始文件 ,唯一的区别是它使用不同的空字典 信息 轮廓 (由于文件中有一个当前未使用的空间接字典,我只需要更改 信息 轮廓 此未使用的对象)。当对该文件进行两次签名时,Adobe不再抱怨。


    这是iText中的错误还是PDF中的错误?我认为iText在更改 信息 因为在PDF中通常不禁止重复使用字典。但PDF利用了这种