我目前正在做一个过时的项目,它签署PDF/A并试图升级它的依赖项。这里的相关内容是co.lowagie.itext,我将其从1.4升级到5.5.13.1。由于函数PdfSignatureAppearance.setCrypto()被删除,所以发生了很大变化。我在this中实现了修复(在最新版本中实现了所需的jars )问题,现在我得到了以下代码:
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();
}为了进行比较,这里是旧代码:
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签名的经验。
发布于 2020-07-20 07:43:45
在那里,有两个问题妨碍代码创建有效的PDF/A。
第一个问题是,我没有使用PdfAStamper类,它需要盖章PDF/A并保留它的PDF/A有效性。
第二个问题是,签名的PDF/A需要由外部tsa服务器设置时间戳的签名。
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();
}发布于 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 .
https://stackoverflow.com/questions/62910078
复制相似问题