【问题标题】:PDF shows signature in Foxit Reader but not Adobe ReaderPDF 在 Foxit Reader 中显示签名,但在 Adob​​e Reader 中不显示
【发布时间】:2018-01-09 03:01:45
【问题描述】:

为什么此 PDF 在 Foxit Reader 中显示签名,而不是 Adob​​e Reader?

这里是来自Syncfusion PDF library 的用于生成它的代码(另请参阅有关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 上使用此功能时,福昕阅读器中会识别出一个签名:

但不是在 Adob​​e Reader 中:

这里是resulting PDF 供分析。

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

编辑

这里是original PDF 之前的任何事情。

解决方案

我使用了来自Syncfusion's own Nuget server 的 Nuget 包,它是最新的(Nuget.org 上的包不是)。

【问题讨论】:

    标签: pdf adobe syncfusion adobe-reader foxit


    【解决方案1】:

    这个答案集中在第一个问题上:

    这是为什么?

    不过,由于我对 Syncfusion PDF 库没有任何经验,所以我无法告诉您具体是什么

    可以解决此问题,以便 Adob​​e 识别它。

    PDF 对象结构

    损坏的字段层次结构

    在上面的屏幕截图中可以看到,在 AcroForm 字典中,Fields 数组有一个条目,字段对象12 0

    字段对象12 0只有一个本地名称(T的值:“Signature”)和一个包含单个后代条目的后代字段对象的Kids数组,字段对象9 0

    字段对象9 0 也有一个本地名称(也称为“签名”;因此它的完全限定字段名称是Signature.Signature)和许多其他条目,其中大多数都可以用于签名字段和小部件。它没有Parent条目。

    根据 PDF 规范,字段中的 Parent 条目是

    如果此字段是字段层次结构中另一个字段的子字段,则为必填项

    (ISO 32000-1,表 220 - 所有字段字典通用的条目)

    文档的单页(对象5 0)在其注释引用中引用了字段对象9 0,作为小部件注释。

    因此,来自 AcroForm 字典 Fields 数组的字段对象 9 0 是另一个字段的后代,具有完全限定名称 Signature.Signature

    但是通过注释来自页面,字段对象9 0 没有父级,因此显示为具有完全限定名称Signature 的根字段。

    因此,签名字段的身份不明。

    请求重绘

    此外,在上面的对象结构中,AcroForm 字典中的 NeedAppearances 标志设置为 true

    这会询问 PDF 查看器

    为文档中的所有小部件注释构造外观流和外观字典。

    (ISO 32000-1,表 218 - 交互式表单字典中的条目)

    在此过程中,众所周知,Adobe Reader 会删除结构损坏的注释。如上所述,您的签名字段的字段结构已损坏。

    其他特点

    签名字段的一些条目有些奇特:

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

    做什么

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

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

    【讨论】:

    • 感谢您的详细解答!由于使用空白 PDF 生成了示例,我想知道 Syncfusion 库是否有问题。我已通过他们的论坛将您的答案的链接传递给 Syncfusion 人。
    • @Scott 也请将原始的、未签名的 PDF 发送给他们,以便他们重现该问题。我仍然认为它有一些特别之处......
    【解决方案2】:

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

    Here is the sample to sign an existing PDF

    【讨论】:

    • 欢迎来到 SO Sowmiya。如果将来提到的链接中的内容发生更改或链接被破坏,我担心您的回复会发生什么。最好在此处包含答案的基本部分并提供链接以供参考。
    • @Sowmiya 我正在使用版本 14.1.0.46 的 Nuget 包 Syncfusion.AspNet.Mvc5,这似乎是当前版本。这是正确的吗?
    • @ScottH Nipun 链接的页面谈到了 2017 年 5 月 8 日发布的 15.2.0.40 版本。
    • 这是我正在使用的Nuget package,我使用 Sowmiya 的示例项目对其进行了测试,并且按预期工作(感谢提供示例项目)。我将它引用的 PDF(在 Data 文件夹中)换成了我用于此问题的 PDF(现在可供下载,请参阅编辑),然后它未能生成签名。在对它进行任何操作之前,我已经编辑了我的问题以包含 PDF @mkl。
    • @ScottH 我看过文件。它的内容确实是微不足道的,只是它的结构有些复杂(一个线性化的 PDF 带有增量更新,破坏了线性)。恐怕我不知道为什么 Syncfusion 会表现得如此怪异。
    【解决方案3】:

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

    Click here to download

    试用最新版本的示例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-15
      相关资源
      最近更新 更多