
OP原始问题的原因,即在用PDFBox加载他的PDF(用于表单填充)然后保存它之后,该新PDF无法使用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
引用正常外观流)。另外(如果查找更改或添加的条目变得太麻烦了),他可以尝试其他选择。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)