使用 PDFBox 2.0.0 签署加密的 PDF 文档
Signing an encrypted PDF document with PDFBox 2.0.0
我尝试签署允许签名的加密 PDF 文档。
本文档:Encrypted PDF document
使用 PDFBox 2.0.0 示例代码:CreateSignature.java
但是我遇到了这个异常:
Exception in thread "main" java.lang.NullPointerException
at org.apache.pdfbox.pdmodel.encryption.StandardSecurityHandler.computeRevisionNumber(StandardSecurityHandler.java:131)
at org.apache.pdfbox.pdmodel.encryption.StandardSecurityHandler.prepareDocumentForEncryption(StandardSecurityHandler.java:335)
at org.apache.pdfbox.pdfwriter.COSWriter.write(COSWriter.java:1254)
at org.apache.pdfbox.pdmodel.PDDocument.saveIncremental(PDDocument.java:966)
at principal.CreateSignature.signDetached(CreateSignature.java:179)
at principal.CreateSignature.signDetached(CreateSignature.java:154)
at principal.CreateSignature.main(CreateSignature.java:334)
我不知道文件是否通过,但允许签名:
签署这份文件需要做什么?
这是我的解决方案:
加载 pdf 文件时,检查它是否受到保护,使用所有者密码加载它并重置所有安全性。
...
this.document = PDDocument.load(pdf, ownerPassword);
document.setAllSecurityToBeRemoved(true);
...
要再次保护文档,您应该使用旧密码和权限创建新的 StandartProtectionPolicy,保存文档,然后使用密码加载它,签名并再次保存。
.....
StandardProtectionPolicy policy = new StandertProtectionPolicy(ownerPassword, userPassword, accessPremission)
doc.protect(policy);
doc.save(signedFile);
doc.close();
doc = PDDocument.load(signedFile, policy.getOwnerPassword());
doc.protect(policy);
....
doc.addSignature(signature, this, options);
这对我有用。
PDFBox 2.0 RC3(今日发布)已修复此问题,请试用。
虽然 Gleb 的回答是 well-meant,但它是不正确的,原因是我在问题中写的:
https://issues.apache.org/jira/browse/PDFBOX-2729
方案存在先读取文件再保存的问题,所以签名前已经不一样了。另一个问题是我们必须使用与最初相同的方法和相同的加密密钥进行加密。对于 AES256,此(内部)加密密钥具有随机成分,即使用户向 API.
提供相同的密钥也是如此
我尝试签署允许签名的加密 PDF 文档。
本文档:Encrypted PDF document
使用 PDFBox 2.0.0 示例代码:CreateSignature.java
但是我遇到了这个异常:
Exception in thread "main" java.lang.NullPointerException
at org.apache.pdfbox.pdmodel.encryption.StandardSecurityHandler.computeRevisionNumber(StandardSecurityHandler.java:131)
at org.apache.pdfbox.pdmodel.encryption.StandardSecurityHandler.prepareDocumentForEncryption(StandardSecurityHandler.java:335)
at org.apache.pdfbox.pdfwriter.COSWriter.write(COSWriter.java:1254)
at org.apache.pdfbox.pdmodel.PDDocument.saveIncremental(PDDocument.java:966)
at principal.CreateSignature.signDetached(CreateSignature.java:179)
at principal.CreateSignature.signDetached(CreateSignature.java:154)
at principal.CreateSignature.main(CreateSignature.java:334)
我不知道文件是否通过,但允许签名:
签署这份文件需要做什么?
这是我的解决方案:
加载 pdf 文件时,检查它是否受到保护,使用所有者密码加载它并重置所有安全性。
...
this.document = PDDocument.load(pdf, ownerPassword);
document.setAllSecurityToBeRemoved(true);
...
要再次保护文档,您应该使用旧密码和权限创建新的 StandartProtectionPolicy,保存文档,然后使用密码加载它,签名并再次保存。
.....
StandardProtectionPolicy policy = new StandertProtectionPolicy(ownerPassword, userPassword, accessPremission)
doc.protect(policy);
doc.save(signedFile);
doc.close();
doc = PDDocument.load(signedFile, policy.getOwnerPassword());
doc.protect(policy);
....
doc.addSignature(signature, this, options);
这对我有用。
PDFBox 2.0 RC3(今日发布)已修复此问题,请试用。
虽然 Gleb 的回答是 well-meant,但它是不正确的,原因是我在问题中写的: https://issues.apache.org/jira/browse/PDFBOX-2729
方案存在先读取文件再保存的问题,所以签名前已经不一样了。另一个问题是我们必须使用与最初相同的方法和相同的加密密钥进行加密。对于 AES256,此(内部)加密密钥具有随机成分,即使用户向 API.
提供相同的密钥也是如此