java - 认证和签名后锁定 PDF 文件
问题描述
我正在尝试找到一种方法来锁定已签名和认证的 PDF 以使用iText进行修改,这种方式让 Abode Reader DC 等查看器告诉我该文档未打开以进行这样的修改
(如果我使用 Adobe 签署文档,我可以这样做)使用 PDF 版本 1.7 和 iText 版本 7.1.6。
然而,当我证明并签署我的 pdf 文件时,我得到了这样的结果:
在处理过程中,此 PDF 首先使用认证签名进行签名,认证级别设置为表单填写PdfSigner.CERTIFIED_FORM_FILLING
。
之后,PDF 将由任意数量的人进行数字签名。
我试过放置认证签名并将认证级别设置为PdfSigner.CERTIFIED_NO_CHANGES
签名后。这会破坏除证书签名之外的所有签名。
我也尝试用密码“锁定”文件,但这也没有达到预期的效果。
有没有办法在使用 iText 库放置最后一个签名后锁定 pdf 文件,以便在签名和验证后显示第一条消息?
解决方案
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 的结果,即锁定整个文档的签名,导致出现此签名面板:
(黄色三角形在那里是因为我不信任测试证书,但红色圆圈和错误文本不应该在那里。)
这可以很容易地修复,但是,原始示例当前准备像这样的最终签名字段
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));
现在签名面板如下所示:
(如上所述,黄色三角形在那里是因为我不信任测试证书。)
此外,根据需要,所有签名的签名属性现在都要求
推荐阅读
- xamarin - 如何使用 Prism 保存导航堆栈从 Xamarin 表单中的 MasterDetailPage 导航到 ContentPage?
- ruby-on-rails - ActiveRecord 使请求参数中不存在的值无效
- git - 通过 Git Bash 访问桌面
- r - 在几何线中以不同比例绘制辅助轴
- angular - 无法将具有 Angular Universal 的 Angular 9 应用程序部署到具有 Firebase 功能的 Firebase
- java - JSON 映射集合到 ArrayList
- ruby-on-rails - lazyload-rails 显示扭曲的 PNG
- google-analytics - 是不是像加 onclick=”ga('send', 'event', 'Category', 'Action', 'Label', 'Value');》这么简单 到我的链接以跟踪点击事件?
- postgresql - 在 Postgres 的另一列中获取具有最大字符串长度的行
- javascript - Discord.js V12 如何显示具有特定角色的所有成员?