【问题标题】:Signing an encrypted PDF document with PDFBox 2.0.0使用 PDFBox 2.0.0 签署加密的 PDF 文档
【发布时间】:2015-05-27 18:24:56
【问题描述】:

我尝试签署允许签名的加密 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)

我不知道文件的通过但允许签名:

我应该怎么做才能签署这份文件?

【问题讨论】:

  • 确实,我可以重现该问题。经过一些调试后,在我看来,PDFBox 签名代码尚未针对加密文件进行开发或测试。您可能想在 Apache PDFBox Jira 中打开一个问题。目前,您可能希望在第一步中删除密码保护,然后再签名。

标签: java pdf encryption pdfbox sign


【解决方案1】:

此问题已在 PDFBox 2.0 RC3(今天发布)中修复,请尝试。

虽然 Gleb 的回答是善意的,但由于我在问题中所写的原因,它是不正确的: https://issues.apache.org/jira/browse/PDFBOX-2729

解决方案存在先读取并保存文件的问题,所以在签名之前就不再一样了。另一个问题是我们必须使用与最初相同的方法和相同的加密密钥进行加密。对于 AES256,此(内部)加密密钥具有随机分量,即使用户向 API 提供相同的密钥也是如此。

【讨论】:

【解决方案2】:

这是我的解决方案:

当您加载您的 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-2729 中写下我的想法。这并不容易,因为即使 Adob​​e Reader 接受了该文件,也并不意味着它是正确的:-(
  • 您应该能够在不解锁的情况下签署加密的 PDF 文件。
  • @CyrilBremaud,是的,但这似乎是一个 pdfbox 问题。此解决方法有助于加密但未签名的文件,当您需要第二次签署加密文档时会失败。
  • @CyrilBremaud 为什么可以在不解密的情况下签署加密文件?签名本身(/Contents 字符串除外)是加密的,因此需要密钥。请参阅 PDFBOX-3173,其中包含签名加密的文件。
猜你喜欢
  • 2015-02-11
  • 2015-08-04
  • 1970-01-01
  • 2018-12-02
  • 1970-01-01
  • 1970-01-01
  • 2019-12-17
  • 2013-01-19
  • 1970-01-01
相关资源
最近更新 更多