PDFBox 1.8.10:“填充并签名” PDF会生成无效的签名

PDFBox 1.8.10:“填充并签名” PDF会生成无效的签名,第1张

PDFBox 1.8.10:“填充并签名” PDF会生成无效的签名

OP原始问题的原因,即在用PDFBox加载他的PDF(用于表单填充)然后保存它之后,该新PDF无法使用PDFBox签名代码成功签名,此答案]已经详细说明,简而言之:

  • 当定期保存文档时,PDFBox使用交叉引用表来保存。

    • 如果已经使用交叉引用流从PDF加载了要定期保存的文档,则交叉引用流字典的所有条目都将保存在尾部字典中。
    • 在应用签名过程中保存文档时,PDFBox会创建一个增量更新。由于此类增量更新要求更新使用与原始修订相同的交叉引用,因此在这种情况下,PDFBox尝试使用相同的技术。

    • 用于识别该技术最初使用PDFBox的着眼于 类型 在其文档表示成拖车或交叉参考流字典已加载的字典的项:如果有一个 类型 与值条目 外部参照 (其因此对于交叉引用流指定) ,则假定为流,否则为表。

因此,

doc.pdf
对于具有交叉参考流的OP原始PDF :

  • 加载并填写表格后,将定期保存文档,即使用交叉引用表,但是将所有以前的交叉引用流条目(包括 Type )复制到预告片中。(

    doc_filled.pdf

  • 使用交叉引用表加载此保存的PDF以进行签名后,使用增量更新再次保存它。PDFBox假定(由于 Type 尾部条目)现有文件具有交叉引用流,因此,在增量更新结束时也使用交叉引用流。(

    doc_filled_signed.pdf

  • 因此,最后,已填充然后签名的PDF具有两个修订版本,一个是内部版本,带有一个交叉引用表,另一个是外部版本,带有交叉引用流。

  • 由于无效,因此Adobe Reader在加载PDF时会以其内部文档表示形式对其进行修复。修复会更改文档字节。因此,Adobe Reader眼睛中的签名被破坏了。

  • 大多数其他签名验证者都不会尝试进行此类修复,而是按原样检查文档的签名。他们成功验证了签名。

上面引用的答案还提供了一些解决方法:

  • 答:加载PDF以进行表单填写后,请从预告栏删除“ 类型” 条目,然后定期保存。如果对该文件应用签名,PDFBox将假定一个交叉引用表(因为不存在误导的 Type 条目。因此,签名增量更新将是有效的。

  • B:也可以使用增量更新来保存表单填写更改,无论是在单独运行中还是在与签名相同的运行中。这也会导致有效的增量更新。

通常,我会建议使用后一个选项,因为如果使PDFBox保存例程相互兼容,则前一个选项可能会中断。

但是,遗憾的是,后一种选项要求 将添加和更改的对象标记为已更新,包括来自文档目录的路径。 如果这不可能或至少太麻烦,则首选第一个选项。


在当前情况下,OP尝试了后一种选择(

doc_filled_and_signed.pdf
):

当选中文本框时(仅使用Acrobat
Reader和Preview具有相同的行为),该文本框的内容仅在当下可见。我标记PDField,它的所有父对象,AcroForm,目录以及显示它的页面。

他将更改的字段标记为 已更新, 但未标记关联的外观流,该外观流在设置表单字段值时由PDFBox自动生成。

因此,在结果PDF文件中,该字段具有新值,但是旧的,空的外观流。仅当单击该字段时,Adobe Reader才会根据要编辑的值创建新外观。

因此,OP还必须标记新的正常外观流(表单字段字典包含引用字典的条目 AP ,其中 N
引用正常外观流)。另外(如果查找更改或添加的条目变得太麻烦了),他可以尝试其他选择。



欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/5003000.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-11-14
下一篇2022-11-14

发表评论

登录后才能评论

评论列表(0条)

    保存