我正在尝试找到一种方法来锁定签名并经过认证的PDF以使用iText进行修改,以使Abode Reader DC这样的查看器告诉我该文档没有像this那样可以进行修改。 (如果使用Adobe对文档进行签名,则可以执行此操作),使用PDF版本1.7和iText版本7.1.6。
但是,当我认证并签署pdf文件时,我得到this
在此过程中,首先用证明签名对PDF进行签名,并将证明级别设置为填充PdfSigner.CERTIFIED_FORM_FILLING
。
之后,PDF将由许多人进行数字签名。
我尝试在签名后放置认证签名并将认证级别设置为PdfSigner.CERTIFIED_NO_CHANGES
。这会破坏除认证签名以外的所有签名。
我也试图用密码“锁定”文件,但这也没有达到预期的效果。
使用iText库放置了最后一个签名后,是否可以通过任何方式锁定pdf文件,以便在签名和验证后显示第一条消息?
答案 0 :(得分:0)
Bruno Lowagie的白皮书Digital Signatures for PDF documents仍然是与iText签名相关的所有内容的良好来源。包含的Java示例代码适用于iText 5.5.x(实际上是5.3.x至5.5.x),但是您可以在itext/i7js-signatures github存储库中找到iText 7的端口。
白皮书在第2.5.5节中讨论了在签名后锁定字段和文档,其中包含一个示例,其中几个签名依次锁定了越来越多的表单字段,最后一个签名也锁定了表单。文档,将其从“证明者已指定允许该文档的表单填写和签名。不允许其他更改。” “证明者已指定不允许对此文档进行任何更改。”根据这个问题的需要。
示例代码here适用于iText 5.x,here是iText 7的端口。
不幸的是,iText 7端口的当前代码中存在一个小错误,该错误会导致步骤4的结果(锁定整个文档的签名)导致该签名面板出现:
(黄色三角形在那里是因为我不信任测试证书,但是红色圆圈和错误文本不应该在那里。)
这很容易解决,不过,原始示例目前会像这样准备最终的签名字段
lock = new PdfSigFieldLock().setDocumentPermissions(PdfSigFieldLock.LockPermissions.NO_CHANGES_ALLOWED);
table.addCell(createSignatureFieldCell("sig4", lock));
(C2_12_LockFields方法createForm
)
很遗憾,它忘记了在签名字段锁定字典中设置必需的 Action 条目。您可以将其添加到这样的代码中:
lock = new PdfSigFieldLock().setFieldLock(PdfSigFieldLock.LockAction.ALL).setDocumentPermissions(PdfSigFieldLock.LockPermissions.NO_CHANGES_ALLOWED);
table.addCell(createSignatureFieldCell("sig4", lock));
现在签名面板如下所示:
(如上所述,黄色三角形在那里,因为我不信任测试证书。)
此外,现在可以根据需要声明所有签名的签名属性