PDF 在 Foxit Reader 而不是 Adob​​e Reader 中显示签名

PDF shows signature in Foxit Reader but not Adobe Reader

为什么此 PDF 在 Foxit Reader 而不是 Adob​​e 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:

但不是在 Adob​​e Reader:

这里resulting PDF进行分析

这是为什么?我能做些什么来解决这个问题,以便 Adob​​e 能够识别它吗?

编辑

这是 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 以删除结构损坏的注释而闻名。如上所述,您的签名字段的字段结构已损坏。

其他特点

签名域的一些条目有些奇怪:

  • BSMK是为widget生成标准外观的数据。不过,通常情况下,可见签名会带来他们的自定义签名外观,您的签名也是如此。那么这些值有什么用呢?
  • DA,用于格式化可变文本注释文本的默认外观字符串,例如FreeText 注释或文本字段,但为什么在签名字段中有 DA

做什么

显然应该清除错误和异常。如上所述,我对 Syncfusion PDF 库没有任何经验,所以我无法告诉您具体的操作方法。

但有一个提示:我怀疑 Syncfusion PDF 库在创建签名时会定期创建此类废话,因此您要签名的文档很可能有一些特殊之处,请检查一下。例如。如果原始文档已经包含名为“签名”的表单字段,则损坏的结构可能是某些 Syncfusion 代码试图将新签名字段与旧字段合并的结果。

我们在旧版本方面已经遇到过此类问题。现在我们已经在最新版本中解决了这个问题。 Click here to download the latest version

Here is the sample to sign an existing PDF

我们已经检查了带有样本的数据文件。该问题已在最新版本中修复。您正在使用的 Nuget 包被认为是旧版本。找到下面的 link 下载最新的 nuget 包。

Click here to download

试用最新版本的示例。