【问题标题】:PDFBox 2.0.8 issue while signing document签署文档时 PDFBox 2.0.8 问题
【发布时间】:2018-05-08 00:32:02
【问题描述】:

我正在尝试使用此方法签署 pdf,但得到的文档没有大小:

public static void sign(PDDocument doc) throws KeyStoreException, NoSuchAlgorithmException, CertificateException,
        IOException, UnrecoverableKeyException {
    System.out.println("Document pages ? " + doc.getNumberOfPages());
    KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
    ks.load(VisibleSignature.class.getResourceAsStream(CERT_FILE), ALIAS_PASS);
    System.out.println("KeyStore is null ? " + (ks == null));
    VisibleSignature vs = new VisibleSignature(ks, ALIAS_PASS.clone());
    InputStream is = Resource.get(IMAGE_FILE);
    int page = 1;
    vs.setVisibleSignDesigner(doc, 0, 0, -50, is, page);
    is.close();
    vs.setVisibleSignatureProperties("Test", "Test", "Test", 0, page, true);
    PDSignature signature = new PDSignature();
    PDAcroForm acroForm = doc.getDocumentCatalog().getAcroForm();
    System.out.println("Acroform is null ? " + (acroForm == null));
    System.out.println("Acroform getNeedAppearances ? " + (acroForm.getNeedAppearances()));
    if (acroForm != null && acroForm.getNeedAppearances())
        if (acroForm.getFields().isEmpty())
            acroForm.getCOSObject().removeItem(COSName.NEED_APPEARANCES);
        else
            System.out.println("/NeedAppearances is set, signature may be ignored by Adobe Reader");
    signature.setFilter(PDSignature.FILTER_ADOBE_PPKLITE);
    signature.setSubFilter(PDSignature.SUBFILTER_ADBE_PKCS7_DETACHED);
    if (vs.visibleSignatureProperties != null) {
        vs.visibleSignatureProperties.buildSignature();
        signature.setName(vs.visibleSignatureProperties.getSignerName());
        signature.setLocation(vs.visibleSignatureProperties.getSignerLocation());
        signature.setReason(vs.visibleSignatureProperties.getSignatureReason());
        System.out.println("SignerName " + vs.visibleSignatureProperties.getSignerName());
    }
    signature.setSignDate(Calendar.getInstance());
    vs.signatureOptions = new SignatureOptions();
    vs.signatureOptions.setVisualSignature(vs.visibleSignatureProperties.getVisibleSignature());
    vs.signatureOptions.setPage(vs.visibleSignatureProperties.getPage() - 1);
    doc.addSignature(signature, vs.signatureOptions);
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    doc.saveIncremental(baos);
    doc.close();
    IOUtils.closeQuietly(vs.signatureOptions);
    byte[] content = baos.toByteArray();
    System.out.println("Content length: >>>>>>>>>>>>>>>>>>> " + content.length);
}

这就是我在 eclipse 日志中得到的:

18:50:25,702 INFO [默认任务 14] 标准输出 - 文档页面? 1

18:50:25,740 INFO [default task-14] stdout - KeyStore 为空?假的

18:50:25,779 信息 [默认任务 14] 标准输出 - Acroform 为空?假的

18:50:25,780 信息 [默认任务 14] 标准输出 - Acroform getNeedAppearances ?假的

18:50:25,782 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - PDF 结构已创建

18:50:25,782 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDFTemplateCreator - pdf 构建已经开始

18:50:25,782 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - ProcSet 数组已创建

18:50:25,782 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - PDF 页面已创建

18:50:25,783 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - AcroForm 已创建

18:50:25,788 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - 签名字段已创建

18:50:25,788 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - PDSignature 已创建

18:50:25,788 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - AcroForm 字典已创建

18:50:25,789 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - 已添加矩阵

18:50:25,792 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - 签名矩形已创建

18:50:25,793 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - 格式化程序矩形已创建

18:50:25,815 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - 可见签名图像已创建

18:50:25,815 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - 已创建持有人表单流

18:50:25,816 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - 已创建持有人表单资源

18:50:25,816 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - 已创建持有人表单

18:50:25,816 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - PDF 外观字典已创建

18:50:25,817 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - 另一种形式的流(内部形式 - 它将在持有人形式内)已创建

18:50:25,817 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - 另一个表单的资源(内部表单 - 它将在持有人表单中)已创建

18:50:25,817 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - 已创建另一个表单(内部表单 - 将在持有人表单内)

18:50:25,817 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - 现在在持有人表单中插入内部表单

18:50:25,817 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - 创建的图像表单流

18:50:25,817 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - 创建的图像表单资源

18:50:25,818 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - 创建的图像表单

18:50:25,818 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - 创建背景层表单

18:50:25,818 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - 将 ProcSet 插入 PDF

18:50:25,818 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - 向 pdf 注入外观流

18:50:25,818 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - 可见签名已创建

18:50:25,819 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - WidgetDictionary 已创建

18:50:25,825 DEBUG [default task-14] org.apache.pdfbox.cos.COSStream - 创建 InputStream 调用之前没有将数据写入流。

18:50:25,825 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDFTemplateCreator - 流返回开始,大小 = 21301

18:50:25,825 INFO [默认任务 14] 标准输出 - SignerName 测试

18:50:25,857 INFO [default task-14] stdout - 内容长度:>>>>>>>>>>>>>>>>>>> 0

有人知道这里发生了什么吗?

【问题讨论】:

  • 我尝试重现您的问题。 VisibleSignature 类到底是什么?它似乎与CreateVisibleSignature PDFBox 示例类有关,但不一样。
  • 嗨@mkl,VisibleSignature 类基于 CreateVisibleSignature 并添加了 sign 方法,试图遵循位于 CreateVisibleSignature 类中的 signPDF 方法的逻辑,但只接收 PDDoucument 对象。
  • 所以将原来的CreateVisibleSignature 类复制为VisibleSignature 并添加你的sign 方法应该会给我你使用什么?
  • 我不得不做一些额外的小改动,但它起作用了。参照。我对如何解决您的问题的回答。

标签: java apache pdfbox


【解决方案1】:

在您的代码中,您没有为文档提供可用于签名的SignatureInterface 实现。在此用例中不提供此功能会使 PDFBox 假定您将在外部创建签名(例如,查看原始的 CreateVisibleSignature 方法 sign)。在这种情况下,在您使用ExternalSigningSupport 方法setSignature 设置签名后,结果将写入输出流。如果您不这样做,您的ByteArrayOutputStream baos 将保持为空。

但是您确实有一个 SignatureInterface 实例,您已经使用证书和密钥材料对其进行了初始化:您的 VisibleSignature vs。因此,我认为您没有提供SignatureInterface 不是故意的。

因此,要提供 SignatureInterface,您必须使用带有 SignatureInterface 参数的 PDDocument.addSignature 重载。例如。替换你的电话

doc.addSignature(signature, vs.signatureOptions);

通过

doc.addSignature(signature, vs, vs.signatureOptions);

使您的代码按预期工作。

【讨论】:

  • 你是对的@mkl,添加接口到addSignature方法是解决这个问题的方法。在做了这个小小的改动之后,结果正如预期的那样。谢谢大佬!
猜你喜欢
  • 2015-05-27
  • 2015-02-11
  • 2021-03-21
  • 1970-01-01
  • 1970-01-01
  • 2022-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多