我在这里问这个问题是因为鉴于我所做的搜索,Adobe的支持似乎几乎不存在。根据这个在线验证工具,我有:
https://www.pdf-online.com/osa/validate.aspx
完全有效的 PDF,由代码生成。但是,使用 Acrobat Reader DC 时,我无法使用"填写并签名"-尝试签名时,会引发此错误:
The operation failed because Adobe Acrobat encountered an unknown error
这是有问题的 PDF:
https://github.com/DelphiWorlds/MiscStuff/blob/master/Test/PDF/SigningNoWork.pdf
这是一个非常相似的,填写和签名工作:
https://github.com/DelphiWorlds/MiscStuff/blob/master/Test/PDF/SigningWorks.pdf
福昕阅读器对它们中的任何一个都没有问题 - 填写和签名可以正常工作。
我会发布文件的来源,但是因为它们有二进制数据,我认为指向它们的链接更好。
问题是:为什么第一个不起作用,而第二个不起作用?
在您的非工作文件中,所有字体都定义
为/FirstChar 30
/LastChar 255
即有 226 个字形。但是,它们各自的Widths数组只有 224 个条目,因此它们不完整。
在每个宽度数组中添加两个条目后,此处的Adobe Reader在填写并签名期间不再遇到该未知错误。
正如 OP 询问我究竟是如何更改这些宽度数组的
:我希望更改具有尽可能少的副作用,因此我很高兴看到有问题的字体词典中有一些空白区域,因此进行简单的十六进制编辑就足够了,无需移动间接对象和更新交叉引用:
在对象 5、7、9 和 11 中的每个字体定义中,Widths数组是最后一个字典条目值,并以一些空格结尾,在最后一个宽度之后我们有这些字节:
20 0D 0A 5D 0D 0A 3E 3E --- space CR NL ']' CR NL '>' '>'
我使用空格添加了两个 0 值:
20 30 20 30 20 5D 3E 3E --- space '0' space '0' space ']' '>' '>'
Acrobat Reader DC - 免费版本,如果您的文档附加了元数据,则不再允许您进行填充和签名。
您需要购买Pro DC版本,价格为14.99美元,才能继续使用此处的填充和登录。
我刚刚完成了与Adobe的4个月的支持电子邮件交换,这是他们的最终答案。