首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >itext 5创建PDF1.4而不是PDF/A

itext 5创建PDF1.4而不是PDF/A
EN

Stack Overflow用户
提问于 2020-07-15 07:53:34
回答 2查看 339关注 0票数 0

我目前正在做一个过时的项目,它签署PDF/A并试图升级它的依赖项。这里的相关内容是co.lowagie.itext,我将其从1.4升级到5.5.13.1。由于函数PdfSignatureAppearance.setCrypto()被删除,所以发生了很大变化。我在this中实现了修复(在最新版本中实现了所需的jars )问题,现在我得到了以下代码:

代码语言:javascript
复制
PdfStamper stp;
            try {

                stp = PdfStamper.createSignature(reader, fout, '\0');
                PdfSignatureAppearance sap = stp.getSignatureAppearance();
                ExternalDigest digest = new BouncyCastleDigest();
                BouncyCastleProvider provider = new BouncyCastleProvider();
                Security.addProvider(provider);
                ExternalSignature signature = new PrivateKeySignature(privateKey, DigestAlgorithms.SHA256, provider.getName());
                MakeSignature.signDetached(sap, digest, signature, certificateChain, null, null, null, 0, MakeSignature.CryptoStandard.CMS);
                stp.close();
            }

为了进行比较,这里是旧代码:

代码语言:javascript
复制
PdfStamper stp;
            try {
                stp = PdfStamper.createSignature(reader, fout, '\0');
                PdfSignatureAppearance sap = stp.getSignatureAppearance();
                sap.setCrypto(privateKey, certificateChain, null, PdfSignatureAppearance.WINCER_SIGNED);
                stp.close();
            }

这就是我的问题所在。在测试过程中,我注意到这个新版本将PDF/A转换为PDF1.4,而旧版本没有这样做。我没有PDF或PDF签名的经验。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-07-20 07:43:45

在那里,有两个问题妨碍代码创建有效的PDF/A。

第一个问题是,我没有使用PdfAStamper类,它需要盖章PDF/A并保留它的PDF/A有效性。

第二个问题是,签名的PDF/A需要由外部tsa服务器设置时间戳的签名。

代码语言:javascript
复制
PdfStamper stp;
            try {

                stp = PdfAStamper.createSignature(reader, fout, '\0',  PdfAConformanceLevel.PDF_A_1A); //<-- PdfAStamper with the PdfAConformanceLevel.
                TSAClient tsaClient = new TSAClientBouncyCastle("https://freetsa.org/tsr"); //<-- creating the TSAClient
                PdfSignatureAppearance sap = stp.getSignatureAppearance();
                ExternalDigest digest = new BouncyCastleDigest();
                BouncyCastleProvider provider = new BouncyCastleProvider();
                Security.addProvider(provider);
                ExternalSignature signature = new PrivateKeySignature(privateKey, DigestAlgorithms.SHA256, provider.getName());
                MakeSignature.signDetached(sap, digest, signature, certificateChain, null, null, tsaClient, 0, MakeSignature.CryptoStandard.CMS); //<-- Notice "tsaClient"
                stp.close();
            }
票数 0
EN

Stack Overflow用户

发布于 2020-07-15 08:24:25

PDF/A-1是PDF-1.4的简介.因此,如果您的源PDF是PDF/A-1,那么它也是PDF-1.4,而且iText没有对其进行更改。

此外,旧的iText 1.4和更新的iText 5.5.13 PdfStamper都不知道PDF/A。很可能您的测试检查了由iText 1.4签名的PDF的配置文件,根本就没有意识到这一点。

但是,在iText 5.5.13的情况下,您可能会感到幸运,因为在该版本中,iText还提供了一个PDF/A感知的PdfAStamper (这个类位于单独的jar中,但是,itext-pdfa.jar)。

因此,请再次尝试使用PdfAStamper而不是PdfStamper。如果这仍然没有帮助,请在使用新的和旧的iText版本签名之前和之后,为您的输入PDF共享一个PDF/A文件示例。还提到您使用哪个程序来确定PDF是否为PDF/A .

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

https://stackoverflow.com/questions/62910078

复制
相关文章

相似问题

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