尝试 getSignatureDictionaries 时 PDFBox 不工作
Posted
技术标签:
【中文标题】尝试 getSignatureDictionaries 时 PDFBox 不工作【英文标题】:PDFBox not working when try getSignatureDictionaries 【发布时间】:2022-01-17 18:39:32 【问题描述】:我正在使用 PDFBox 来提取我的 PDF 签名。在 2.0.24 版本中,简单的 PDDocument.load(File file)
得到了一个不寻常的时间。我升级到 3.0.0.-alpha,Loader.loadPDF(File file)
玩得很开心,但是在下一步中,当我尝试提取签名时,我变得非常缓慢,而且永远不会结束。
for (PDSignature sig : document.getSignatureDictionaries())
COSDictionary sigDictionary = sig.getCOSObject();
COSString contents = (COSString) sigDictionary.getDictionaryObject(COSName.CONTENTS);
String subFilter = sig.getSubFilter();
if (subFilter != null)
PDFResult pdfResult = new PDFResult();
pdfResult.setName(sig.getName());
pdfResult.setContactInfo(sig.getContactInfo());
pdfResult.setLocation(sig.getLocation());
pdfResult.setReason(sig.getReason());
pdfResult.setFilter(sig.getFilter());
pdfResult.setSignDate(sig.getSignDate().getTime());
pdfResult.setSubFilter(subFilter);
switch (subFilter)
case "adbe.pkcs7.detached":
case "ETSI.CAdES.detached":
verifyPKCS7(getSignedContent(sig, contents), contents, pdfResult);
break;
case "adbe.pkcs7.sha1":
byte[] hash = MessageDigest.getInstance("SHA1").digest(getSignedContent(sig, contents));
verifyPKCS7(hash, contents, pdfResult);
break;
case "adbe.x509.rsa_sha1":
COSString certString = (COSString) sigDictionary.getDictionaryObject(COSName.CERT);
if (certString == null)
throw new IllegalStateException("The /Cert certificate string is missing in the pdfResult dictionary");
CertificateFactory factory = CertificateFactory.getInstance("X.509");
ByteArrayInputStream certStream = new ByteArrayInputStream(certString.getBytes());
Collection<? extends Certificate> certs = factory.generateCertificates(certStream);
X509Certificate cert = (X509Certificate) certs.iterator().next();
pdfResult.setCertificate(new br.com.fiorilli.signature.utils.model.Certificate(cert));
pdfResult.setCertificateEncoded(Base64.getEncoder().encodeToString(cert.getEncoded()));
break;
case "ETSI.RFC3161":
verifyETSIdotRFC3161(contents, pdfResult);
break;
default:
throw new IOException("Unknown certificate type: " + subFilter);
signatures.add(pdfResult);
else
throw new IOException("Missing subfilter for cert dictionary");
这种情况只发生在特定的 PDF 中,像这样。 Java开始使用高cpu,进程永不结束。
【问题讨论】:
请分享 PDF。我想知道字段树中是否存在循环。 我尝试了 ShowSignature 示例,它工作正常。确保你的类路径是干净的,即只有一个版本。 谢谢。我去看看。 代码测试分配了多少内存?您使用的是哪个 JRE 版本? 另外,请澄清您所说的“非常慢”是什么意思。秒?分钟?几小时? 【参考方案1】:解决方案是遵循 ShowSignature 示例的所有实现。我的 verifyPKCS7 方法有点不同。对于类似的问题,请按照 github 中的 ShowSignature 示例:
https://github.com/apache/pdfbox/blob/trunk/examples/src/main/java/org/apache/pdfbox/examples/signature/ShowSignature.java
【讨论】:
以上是关于尝试 getSignatureDictionaries 时 PDFBox 不工作的主要内容,如果未能解决你的问题,请参考以下文章
如何处理 Swift 的“尝试”?导致“尝试的结果?未使用”? [复制]