Java使用pdfbox给pdf添加数字签名

Java uses pdfbox to add digital signature to pdf

我想请教一个问题。如果我要给一个多页的pdf加上数字签名,每一页都有相同的印章,我能不能只在第一页加一次数字签名,然后其他页面只需要引用第一张印章的样子就可以了。因为使用这种方法可以减少加戳的时间。

我用的是mkl给的代码,但是有个问题。我用其他代码替换了以下代码。

原文:

try (PDPageContentStream cs = new PDPageContentStream(pdDocument, appearanceStream))
{
    // show background (just for debugging, to see the rect size + position)
    cs.setNonStrokingColor(Color.yellow);
    cs.addRect(-5000, -5000, 10000, 10000);
    cs.fill();

    float fontSize = 10;
    float leading = fontSize * 1.5f;
    cs.beginText();
    cs.setFont(font, fontSize);
    cs.setNonStrokingColor(Color.black);
    cs.newLineAtOffset(fontSize, height - leading);
    cs.setLeading(leading);
    cs.showText("Signature text");
    cs.newLine();
    cs.showText("some additional Information");
    cs.newLine();
    cs.showText("let's keep talking");
    cs.endText();
}

现在:

PDImageXObject Sign0 = PDImageXObject.createFromByteArray(doc, imageByte, null);

try (PDPageContentStream cs = new PDPageContentStream(pdDocument, appearanceStream))
{
    cs.drawImage(Sign0,0, 0,rectangle.getWidth(),rectangle.getHeight());
}

原码在盖章时有效,修改后的码会使盖章失效。我使用 Adob​​e Acrobat Pro DC 打开签名文档。此错误是“签名验证期间发生错误。Adobe Acrobat 错误。预期的字典对象。”。我不确定发生了什么。

您的问题基于 to the question . Thus, I tested again adding a new test case testCreateSignatureWithMultipleImageOnlyVisualizations to the old test class CreateMultipleVisualizations 的“概念证明”部分中提供的代码,确实可以重现 OP 观察到的行为。

但随后的一个小改动足以让 Adob​​e Reader 再次高兴,我只是简单地在签名可视化中添加了一个 评论,如下所示:

try (PDPageContentStream cs = new PDPageContentStream(pdDocument, appearanceStream))
{
    cs.addComment("This is a comment");
    cs.drawImage(Sign0,0, 0,rectangle.getWidth(),rectangle.getHeight());
}

Adobe Reader 不再 运行 输出 PDF 时出现错误!


正如评论中已经提到的那样,我假设在仅绘制另一个 XObject 的签名外观的情况下,Adobe Acrobat 认为自己面临着通常由 Acrobat 本身构造的签名外观,即仅绘制签名外观一种 XObject 形式,它反过来只绘制其他形式的 XObjects,“层” n0n2 或(不推荐)甚至更多,并且只有这些层最终包含实际的文本和图形。

您的图像 XObject 不包含嵌套的 XObject,因此 Adob​​e Acrobat 在尝试从 XObject 中查找这些内层时失败。