简体   繁体   English

使用 iText 向签名的 pdf 添加长期验证时出现问题

[英]Problem with adding long term validation to signed pdf using iText

I have a problem with adding long-term-validation to PDF signed using iText.我在向使用 iText 签名的 PDF 添加长期验证时遇到问题。 Do not know why it generates broken pdf.不知道为什么会生成损坏的 pdf。 When I try to add LTV to PDF signed by different lib (ex 'node-signpdf') then I got valid PDF.当我尝试将 LTV 添加到由不同库(例如“node-signpdf”)签名的 PDF 时,我得到了有效的 PDF。

Signing of pdf looks like this: pdf 的签名如下所示:

private static void applySignature(InputStream src,
            OutputStream dest,
            Certificate[] chain,
            PrivateKey pk,
            String digestAlgorithm,
            String provider,
            PdfSigner.CryptoStandard subfilter,
            String reason,
            String location)
            throws GeneralSecurityException, IOException {

        PdfReader reader = new PdfReader(src);
        PdfSigner signer = new PdfSigner(reader, dest, true);

        PdfSignatureAppearance appearance = signer.getSignatureAppearance()
                .setReason(reason)
                .setLocation(location)
                .setReuseAppearance(false);
        Rectangle rect = new Rectangle(0, 0, 0, 0);
        appearance.setPageRect(rect).setPageNumber(1);
        signer.setFieldName("Signature1");
        IExternalSignature pks = new PrivateKeySignature(pk, digestAlgorithm, provider);
        IExternalDigest digest = new BouncyCastleDigest();
        signer.signDetached(digest, pks, chain, null, null, null, 0, subfilter);
}    

Enabling LTV is basically taken from iText examples -> https://github.com/mkl-public/testarea-itext7/blob/master/src/main/java/mkl/testarea/itext7/signature/AdobeLtvEnabling.java Enabling LTV is basically taken from iText examples -> https://github.com/mkl-public/testarea-itext7/blob/master/src/main/java/mkl/testarea/itext7/signature/AdobeLtvEnabling.java

My code can be found here -> https://github.com/lstachowiak/pdf-sign-and-enable-ltv-example我的代码可以在这里找到-> https://github.com/lstachowiak/pdf-sign-and-enable-ltv-example

Thanks in advance for any help!提前感谢您的帮助!

In your PdfExample.main you do在你的PdfExample.main你做

public static void main(String[] args) throws Exception {
    ...

    PdfReader pdfSigned = new PdfReader(new FileInputStream(OUT_SIGNED_PDF));
    PdfDocument pdf = new PdfDocument(pdfSigned, new PdfWriter(OUT_SIGNED_LTV_PDF), new StampingProperties().preserveEncryption().useAppendMode());

    AdobeLtvEnabling adobeLtvEnabling = new AdobeLtvEnabling(pdf);
    adobeLtvEnabling.enable();
}

Here you forget to call pdf.close() or alternatively use a try-with-resources construct:在这里,您忘记调用pdf.close()或使用 try-with-resources 构造:

try (
    PdfReader pdfSigned = new PdfReader(new FileInputStream(OUT_SIGNED_PDF));
    PdfDocument pdf = new PdfDocument(pdfSigned, new PdfWriter(OUT_SIGNED_LTV_PDF), new StampingProperties().preserveEncryption().useAppendMode());
) {
    AdobeLtvEnabling adobeLtvEnabling = new AdobeLtvEnabling(pdf);
    adobeLtvEnabling.enable();
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM