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

pdfbox-签名后定义可视化签名模板

鲁弘厚
2023-03-14

该代码基于上面链接的PDFBox示例,如下所示:

// Read the document and prepare a signature.

PDDocument document = PDDocument.load( "path/to/file.pdf" );

PDSignature signature = new PDSignature();
signature.setFilter( PDSignature.FILTER_ADOBE_PPKLITE );
signature.setSubFilter( PDSignature.SUBFILTER_ADBE_PKCS7_DETACHED );
signature.setReason( "Test" );

InputStream template = createVisualSignatureTemplate( document ); // Implementation defined below.
SignatureOptions options = new SignatureOptions();
options.setVisibleSignature( template );
options.setPage( 0 );

document.addSignature( signature, options );

// Get the content to sign using PDFBox external signing support.

FileOutputStream outputStream = new FileOutputStream();
ExternalSigningSupport externalSigning = document.saveIncrementalForExternalSigning( outputStream );
byte[] content = IOUtils.toByteArray( externalSigning.getContent() );

// Send the content to the HSM service and get the response.

byte[] hash = MessageDigest.getInstance( "SHA-256" ).digest( content );
byte[] pkcs7 = MyHSMService.getSignedHash( hash );

// Add the signature to the PDF. 

externalSigning.setSignature( pkcs7 );
document.close();

和我的模板方法,基于链接的PDFBox示例中同名的方法,简化了:

PDDocument emptyDocument = new PDDocument();
emptyDocument.addPage( new PDFPage( document.getPage(0).getMediaBox() ) );

// Create the PDAcroForm, PDSignatureField, PDAppearanceDictionary, etc,
// just like in the official example.

(...)

// Define the content stream of the visual signature.

PDPageContentStream content = new PDPageContentStream( emptyDocument, appearanceStream );

content.beginText();
content.showText( "Signed by: ... " ); // The signer name should be here.
content.newLine();
content.showText( "Date: ..." ); // The signature datetime should be here.
content.endText();
content.close();

// Convert the empty document as an input stream and return it, just like the example.

(...)

这工作良好,我可以添加有效的视觉签名没有问题。我的问题是,我需要在签名外观中添加签名者姓名和签名日期,但由于我在调用我的HSM服务签名之前创建了模板,所以我还没有访问那个数据,这就是为什么我需要在签名文档之后定义内容的原因。

有没有办法做到这一点?我是一个新的PDF签名,所以我对基础的理解是相当差的。

提前道谢!

共有1个答案

卫弘义
2023-03-14

pdf签名的文档内可视化是pdf小部件注释,因此它是签名内容的一部分。因此,必须在签名前添加它,并且只有在签名前已知的信息才能在其中使用。

但是,有一个选项,大多数签名类型允许在签名的修订之后更改修订中的注释。阅读此处有关对签名pdf文档的允许和不允许的更改。

但是pdf查看器仍然可能在签名后警告已将更改应用于文档。这样的警告应该是这样的:

当涉及到datetime时,我可以显示PDSignature对象本身的日期,但在本例中,可视化显示的时间与PDF viewer中的signatures面板中显示的时间不相同,因为当我调用HSM服务时,实际的签名将在几秒钟后发生。在这种情况下,我没有别的选择,只能重新修改,只是为了更正时间,对吧?

首先,在pdf签名中嵌入的CMS签名容器中不需要签名时间属性,因为签名时间也可以在签名字典中的M条目中给出。

因此,一个选择是尝试并检索没有签名时间属性的签名容器。在这种情况下,pdsignature签名时间将显示在签名面板中。

但是,如果您使用数字时间戳来记录签名时间,它是CMS签名容器的一部分,甚至是单独的文档时间戳,所以这个选项是不起作用的。

此外,你提到了签名小组。由于在那里可以找到确切的信息,您真的需要签名可视化中的签名时间吗?可视化在本质上只是表面的,它可能包含任意的信息,所以任何人都不应该相信它。Adobe早在很多年前就警告过这一点,甚至在pdf成为ISO标准之前。

因此,另一个选择是简单地把一个好看的标志在那里,这就是它!

 类似资料:
  • 我正在尝试制作带有视觉签名和pdfbox的PDF。我有两条流,pdfbox似乎只能处理文件。没有三个临时文件,我没能成功。我可以从这里看到API已经改变了,但它仍然处理文件。 除了文件疯狂,我在签名上没有看到任何文字。结果是这样的: 当我用itext库做类似的事情时,情况就是这样 为什么视觉签名表示中缺少名称、位置和原因?我该怎么解决?

  • PDF创建步骤: 通过添加空签名字段名称创建pdf:suhasb@gmail.com和nikhil.courser@gmail.com,使用原始的hello.pdf输出文件名hello_tag.pdf运行程序>tagpdfsignaturefields.java 从hello_tag.pdf文件中提取签名字段suhasb@gmail.com进行首次签名,输出文件名为hello_signd.pdf

  • 我正在实现一个应用程序,以便在服务器中对PDF文件进行签名,并使用以下场景(使历史变长,变短): 客户端开始签名发送到服务器,日期/时间和水印 服务器将签名字典添加到文件中并发送要签名的数据 客户端签名内容 服务器完成签名 我正在使用PDFBox 2.0.15,并使用新的功能,如下面的代码所示: 在“IF”语句中,我正在生成要签名的数据。在“ELSE”语句中,添加签名,这是通过发布请求(这就是所做

  • 我在PDF文档中(以编程方式)填写一个表单(AcroPdf),然后在文档上签名。我从doc.pdf开始,使用pdfbox的setfields.java示例创建doc_filler.pdf。然后我对doc_fill.pdf进行签名,创建doc?filled_signer.pdf,使用一些代码,基于签名示例并在Acrobat Reader中打开pdf。输入的字段数据是可见的,并且签名面板告诉我 “此签

  • 我使用PDFBox在JAVA中实现了签名功能。 我的代码的签名部分是: 如果我使用用keytool命令生成的测试自动签名证书,一切都会正常工作。 问题是,当我用一个真正经过认证的现有证书尝试这段代码时,我得到了一个例外: 我不知道为什么这行不通... 任何帮助都将不胜感激!=)

  • 问题内容: 在PDFBox 2.x中,我将字典放入签名字段: 然后,我签名区域: 除了我在Adobe Acrobat中打开签名的文档时,它抱怨文档的内容已更改,一切看起来都还不错。如果我不添加字典,一切都很好。 任何人都知道哪里错了吗? 问题答案: 问题在于PDFBox签名没有考虑 Lock 字典。 根据ISO 32000-1(以及类似的ISO 32000-2): 12.8.2.4 FieldMD