首页 > 解决方案 > 认证和签名后锁定 PDF 文件

问题描述

我正在尝试找到一种方法来锁定已签名和认证的 PDF 以使用iText进行修改,这种方式让 Abode Reader DC 等查看器告诉我该文档未打开以进行这样的修改

(如果我使用 Adob​​e 签署文档,我可以这样做)使用 PDF 版本 1.7 和 iText 版本 7.1.6。

然而,当我证明并签署我的 pdf 文件时,我得到了这样的结果:

在处理过程中,此 PDF 首先使用认证签名进行签名,认证级别设置为表单填写PdfSigner.CERTIFIED_FORM_FILLING

之后,PDF 将由任意数量的人进行数字签名。

我试过放置认证签名并将认证级别设置为PdfSigner.CERTIFIED_NO_CHANGES签名后。这会破坏除证书签名之外的所有签名。

我也尝试用密码“锁定”文件,但这也没有达到预期的效果。

有没有办法在使用 iText 库放置最后一个签名后锁定 pdf 文件,以便在签名和验证后显示第一条消息?

标签: javapdfkotlinitextitext7

解决方案


Bruno Lowagie的白皮书PDF 文档的数字签名仍然是与 iText 签名相关的所有内容的良好来源。包含的 Java 示例代码适用于 iText 5.5.x(实际上是 5.3.x 到 5.5.x),但您可以在itext/i7js-signatures github 存储库中找到 iText 7 的端口。

在第 2.5.5 节中,白皮书讨论了在签名后锁定字段和文档,其中包含一个示例,其中几个签名依次锁定了表单的越来越多的字段,最后一个也锁定了文档,将其从“验证者指定该文件允许填写和签署表格。不允许进行其他更改。至“认证机构已指定不允许对本文档进行任何更改。” 根据这个问题的需要。

示例代码可用于 iText 5.x,这里是 iText 7 的端口

不幸的是,iText 7 端口的当前代码中存在一个小错误,导致步骤 4 的结果,即锁定整个文档的签名,导致出现此签名面板:

步骤 4 输出的签名面板

(黄色三角形在那里是因为我不信任测试证书,但红色圆圈和错误文本不应该在那里。)

这可以很容易地修复,但是,原始示例当前准备像这样的最终签名字段

lock = new PdfSigFieldLock().setDocumentPermissions(PdfSigFieldLock.LockPermissions.NO_CHANGES_ALLOWED);
table.addCell(createSignatureFieldCell("sig4", lock));

C2_12_LockFields方法createForm

不幸的是,它忘记在签名字段锁定字典中设置所需的操作条目。您可以像这样将其添加到代码中:

lock = new PdfSigFieldLock().setFieldLock(PdfSigFieldLock.LockAction.ALL).setDocumentPermissions(PdfSigFieldLock.LockPermissions.NO_CHANGES_ALLOWED);
table.addCell(createSignatureFieldCell("sig4", lock));

现在签名面板如下所示:

带有固定锁字典的步骤 4 输出的签名面板

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

此外,根据需要,所有签名的签名属性现在都要求


推荐阅读