该代码基于上面链接的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签名,所以我对基础的理解是相当差的。
提前道谢!
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