PDF 在 Foxit Reader 而不是 Adobe Reader 中显示签名
PDF shows signature in Foxit Reader but not Adobe Reader
为什么此 PDF 在 Foxit Reader 而不是 Adobe Reader 中显示签名?
这是来自 Syncfusion PDF library used to generate it (see also documentation about signing an existing document) 的代码:
var signature = new PdfSignature(loadedDocument, page, certificate, "Signature");
signature.Certificate = certificate;
signature.Bounds = new RectangleF(100, 100, 200, 200);
signature.Appearence.Normal.Graphics.DrawRectangle(PdfBrushes.Red, new RectangleF(0, 0, 200, 200));
当我在现有的 PDF 上使用它时,Foxit 识别出一个签名 Reader:
但不是在 Adobe Reader:
这里resulting PDF进行分析
这是为什么?我能做些什么来解决这个问题,以便 Adobe 能够识别它吗?
编辑
这是 original PDF 在对它进行任何操作之前的状态。
解决方案
我使用了 Syncfusion's own Nuget server 的 Nuget 包,它是最新的(Nuget.org 上的不是)。
本回答集中在第一个问题上:
Why is this?
由于我对 Syncfusion PDF 库没有任何经验,所以我无法告诉您具体是什么
can do to fix this so that Adobe will recognize it.
PDF 对象结构
字段层次结构损坏
在上面的屏幕截图中,可以看到在 AcroForm 字典中,Fields 数组只有一个条目,字段对象 12 0
.
Field 对象 12 0
只有一个本地名称(T 的值:“签名”)和一个 Kids 数组包含单个后代条目的后代字段对象,字段对象 9 0
.
字段对象 9 0
也有一个本地名称(也是“签名”;因此它的完全限定字段名称是 Signature.Signature
)和许多其他条目,其中大多数都可以用于签名字段和小部件。它没有 Parent 条目。
根据 PDF 规范,字段中的 Parent 条目是
Required if this field is the child of another in the field hierarchy
(ISO 32000-1, Table 220 – Entries common to all field dictionaries)
文档的单个页面(对象 5 0
)在其 Annots 引用中引用字段对象 9 0
作为小部件注释。
因此,来自 AcroForm 字典 Fields 数组,字段对象 9 0
是另一个字段的后代,并且具有完全限定名称 Signature.Signature
.
但是来自页面 Annots,字段对象 9 0
没有父级,因此显示为具有完全限定的根字段姓名 Signature
.
因此,签名字段的身份不明确。
请求重绘
此外,在上面的对象结构中看到 AcroForm 字典中 NeedAppearances 标志设置为 true
。
这会询问 PDF 查看器
to construct appearance streams and appearance dictionaries for all widget annotations in the document.
(ISO 32000-1, Table 218 – Entries in the interactive form dictionary)
在此过程中,Adobe Reader 以删除结构损坏的注释而闻名。如上所述,您的签名字段的字段结构已损坏。
其他特点
签名域的一些条目有些奇怪:
- BS和MK是为widget生成标准外观的数据。不过,通常情况下,可见签名会带来他们的自定义签名外观,您的签名也是如此。那么这些值有什么用呢?
- DA,用于格式化可变文本注释文本的默认外观字符串,例如FreeText 注释或文本字段,但为什么在签名字段中有 DA?
做什么
显然应该清除错误和异常。如上所述,我对 Syncfusion PDF 库没有任何经验,所以我无法告诉您具体的操作方法。
但有一个提示:我怀疑 Syncfusion PDF 库在创建签名时会定期创建此类废话,因此您要签名的文档很可能有一些特殊之处,请检查一下。例如。如果原始文档已经包含名为“签名”的表单字段,则损坏的结构可能是某些 Syncfusion 代码试图将新签名字段与旧字段合并的结果。
我们在旧版本方面已经遇到过此类问题。现在我们已经在最新版本中解决了这个问题。
Click here to download the latest version
我们已经检查了带有样本的数据文件。该问题已在最新版本中修复。您正在使用的 Nuget 包被认为是旧版本。找到下面的 link 下载最新的 nuget 包。
试用最新版本的示例。
为什么此 PDF 在 Foxit Reader 而不是 Adobe Reader 中显示签名?
这是来自 Syncfusion PDF library used to generate it (see also documentation about signing an existing document) 的代码:
var signature = new PdfSignature(loadedDocument, page, certificate, "Signature");
signature.Certificate = certificate;
signature.Bounds = new RectangleF(100, 100, 200, 200);
signature.Appearence.Normal.Graphics.DrawRectangle(PdfBrushes.Red, new RectangleF(0, 0, 200, 200));
当我在现有的 PDF 上使用它时,Foxit 识别出一个签名 Reader:
但不是在 Adobe Reader:
这里resulting PDF进行分析
这是为什么?我能做些什么来解决这个问题,以便 Adobe 能够识别它吗?
编辑
这是 original PDF 在对它进行任何操作之前的状态。
解决方案
我使用了 Syncfusion's own Nuget server 的 Nuget 包,它是最新的(Nuget.org 上的不是)。
本回答集中在第一个问题上:
Why is this?
由于我对 Syncfusion PDF 库没有任何经验,所以我无法告诉您具体是什么
can do to fix this so that Adobe will recognize it.
PDF 对象结构
字段层次结构损坏
在上面的屏幕截图中,可以看到在 AcroForm 字典中,Fields 数组只有一个条目,字段对象 12 0
.
Field 对象 12 0
只有一个本地名称(T 的值:“签名”)和一个 Kids 数组包含单个后代条目的后代字段对象,字段对象 9 0
.
字段对象 9 0
也有一个本地名称(也是“签名”;因此它的完全限定字段名称是 Signature.Signature
)和许多其他条目,其中大多数都可以用于签名字段和小部件。它没有 Parent 条目。
根据 PDF 规范,字段中的 Parent 条目是
Required if this field is the child of another in the field hierarchy
(ISO 32000-1, Table 220 – Entries common to all field dictionaries)
文档的单个页面(对象 5 0
)在其 Annots 引用中引用字段对象 9 0
作为小部件注释。
因此,来自 AcroForm 字典 Fields 数组,字段对象 9 0
是另一个字段的后代,并且具有完全限定名称 Signature.Signature
.
但是来自页面 Annots,字段对象 9 0
没有父级,因此显示为具有完全限定的根字段姓名 Signature
.
因此,签名字段的身份不明确。
请求重绘
此外,在上面的对象结构中看到 AcroForm 字典中 NeedAppearances 标志设置为 true
。
这会询问 PDF 查看器
to construct appearance streams and appearance dictionaries for all widget annotations in the document.
(ISO 32000-1, Table 218 – Entries in the interactive form dictionary)
在此过程中,Adobe Reader 以删除结构损坏的注释而闻名。如上所述,您的签名字段的字段结构已损坏。
其他特点
签名域的一些条目有些奇怪:
- BS和MK是为widget生成标准外观的数据。不过,通常情况下,可见签名会带来他们的自定义签名外观,您的签名也是如此。那么这些值有什么用呢?
- DA,用于格式化可变文本注释文本的默认外观字符串,例如FreeText 注释或文本字段,但为什么在签名字段中有 DA?
做什么
显然应该清除错误和异常。如上所述,我对 Syncfusion PDF 库没有任何经验,所以我无法告诉您具体的操作方法。
但有一个提示:我怀疑 Syncfusion PDF 库在创建签名时会定期创建此类废话,因此您要签名的文档很可能有一些特殊之处,请检查一下。例如。如果原始文档已经包含名为“签名”的表单字段,则损坏的结构可能是某些 Syncfusion 代码试图将新签名字段与旧字段合并的结果。
我们在旧版本方面已经遇到过此类问题。现在我们已经在最新版本中解决了这个问题。 Click here to download the latest version
我们已经检查了带有样本的数据文件。该问题已在最新版本中修复。您正在使用的 Nuget 包被认为是旧版本。找到下面的 link 下载最新的 nuget 包。
试用最新版本的示例。