当前位置: 首页 > 知识库问答 >
问题:

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

蓝泰平
2023-03-14

我想问一个问题,如果我想在多页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());
}

原始代码在加盖印花时有效,但修改后的代码将使印花无效。我使用Adobe Acrobat Pro DC打开已签名的文档。此错误是“签名验证期间出错。Adobe Acrobat错误。应为dictionary对象。”。我不知道发生了什么事。

共有1个答案

景同
2023-03-14

您的问题基于使用pdfbox 2.0.12 java的多个esign问题答案“概念验证”部分中的代码。因此,我再次测试了将一个新的测试用例testCreateSignatureWithMultipleImageOnlyVisualizationshtml" target="_blank">添加到旧的测试类CreateMultipleVisualizations中,并且确实可以重现OP观察到的行为。

但是一个小小的改变足以让Adobe 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,进而仅绘制其他表单XObject,“层”n0和n2或(已弃用)甚至更多,并且只有这些层最终包含实际的文本和图形。

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

 类似资料:
  • 出身背景 我使用iTextSharp已经有一段时间了。我已经创建了一个带有两个可签名的PdfFormFields的pdf文档。如果我打开pdf文档,我可以手动对每个字段进行手动签名。我希望通过iTextSharp完成这件事。 我目前正在从X509Store检索证书。直到现在,我都能弄明白。 问题 有人能告诉我如何使用X509Certificate2签署一个已经存在的签名字段吗。 工具书类 以下参考

  • 有什么想法如何添加一个超链接在一个网页上使用这个库? 我发现了这个问题:如何使用pdfbox在内容中设置超链接,但这不起作用。 我只想在pdf文件的第一页添加一个超链接。 我更喜欢在页面底部添加以URL为中心的超链接。但目前任何建议都有帮助

  • 我有一个用数字证书签名的pdf。pdf(表单字段)的内容在签名后不得更改。应该允许添加签名。现在需要第二个人添加他的数字签名。之后不允许对文档进行更多更改。如何实现这一点? 我能够通过java和pdfbox创建pdf,对其进行签名,并使用java检查证书是否有效,证书是否用于对文档进行签名。在stackoverflow上,我遇到了以下代码片段,它将签名添加到已经签名的pdf中,但我不知道如何实现它

  • 对于IText5,添加数字签名相当容易。其留档的链接是:http://developers.itextpdf.com/examples/security/digital-signatures-white-paper/digital-signatures-chapter-2 有人可以在ITEXT 7中共享文档链接吗?我试过各种方法,但都没有用。在网上找不到任何链接。我可以取消签名并检查签名,但不能添

  • 在我的项目中,我按书签拆分了一个pdf文件。应该创建一个新的pdf文件,其中包含拆分的页面和一些新的书签。 这将导致以下异常: 线程“main”java.io.ioException中的异常:COSStream已关闭,无法读取。也许它所附的PDDocument已经关闭了? 如果删除行,则新的pdf包含拆分的页面(没有例外),但显然不包含书签。我想我尝试添加书签的方式有问题。 我的代码: Stack

  • 有没有办法在Apache Pdfbox中添加额外的字体样式? 我们目前正在尝试在系统中打印PDF(目前正在使用PDF渲染器)我一直在寻找各种替代方案(pdfbox、jpedal、jPDFPrint) 我们希望有一个免费的GPL兼容库可以使用,因此我们倾向于使用pdfbox。我已经能够编写一些示例代码来打印出“有效”的pdf。见下文: 正如我提到的,这是有效的,但我遇到的问题是PdfBox似乎无法识