认证和签名后锁定PDF文件

时间:2019-07-11 12:19:54

标签: java pdf kotlin itext itext7

我正在尝试找到一种方法来锁定签名并经过认证的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文件,以便在签名和验证后显示第一条消息?

1 个答案:

答案 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的结果(锁定整个文档的签名)导致该签名面板出现:

Signature Panel of output of step 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));

现在签名面板如下所示:

Signature Panel of output of step 4 with fixed lock dictionary

(如上所述,黄色三角形在那里,因为我不信任测试证书。)

此外,现在可以根据需要声明所有签名的签名属性

"The certifier has specified that no changes are allowed to be made to this document"