当前位置: 首页 > 知识库问答 >
问题:

尝试创建PDF可见签名时获取“对象标签格式错误”

罗俭
2023-03-14

我试图创建一个实用的可见PDF签名。不可见签名可以工作,但当我添加AP(外观)对象时,Acrobat Reader中出现了一个错误,它说:“对象标签格式不正确”。

我制作的相关XObject如下所示:

38 0 obj
<</F 132/Type/Annot/Subtype/Widget/Rect[343.0 142.0 543.0 192.0]/FT/Sig/DR<<>>/T(signature38)/V 40 0 R/AP <</N 41 0 R>>>>
endobj

39 0 obj << /Length 52 /Type /XObject /Subtype /Form /Resources << /XObject << /n2 42 0 R /n0 43 0 R >> /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] >> /BBox [0.0 0.0 200.0 50.0] /FormType 1 >> stream q 1 0 0 1 0 0 cm /n0 Do Q q 1 0 0 1 0 0 cm /n2 Do Q endstream endobj
40 0 obj
<</Contents <...>
/Type/Sig/SubFilter/adbe.pkcs7.detached/Location()/M(D:19700101010000+01'00')
/ByteRange [0000000000 0000064440 0000068536 0000220176]/Filter/Adobe.PPKLite/Reason()/ContactInfo()>>
endobj

41 0 obj << /Length 27 /Type /XObject /Subtype /Form /Resources << /XObject << /FRM 39 0 R >> /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] >> /BBox [0.0 0.0 200.0 50.0] /FormType 1 >> stream q 1 0 0 1 0 0 cm /FRM Do Q endstream 
endobj
42 0 obj << /Length 31 /Type /XObject /Subtype /Form /BBox [0.0 0.0 200.0 50.0] /Matrix [1.0 0.0 0.0 1.0 0.0 0.0] /Resources << /XObject << /img1 44 0 R >> /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] >> /FormType 1 >> 
stream q 200 0 0 50 0 0 cm /img1 Do Q 
endstream 
endobj
43 0 obj << /Length 0 /Type /XObject /Subtype /Form /BBox [0.0 0.0 200.0 50.0] /Resources << >> /FormType 1 >> stream endstream endobj
44 0 obj << /Length 218095 /Type /XObject /Subtype /Image /Filter /DCTDecode /BitsPerComponent 8 /Width 1300 /Height 1261 /ColorSpace /DeviceRGB 
stream
-JPEG bytes-
endstream

我似乎找不到其中的错误,但我肯定遗漏了什么。我阅读了Adobe的整个文档以及其他一些博客,并据此编写了代码。

**更新:**

我根据mkl的评论修改了代码:

    38 0 obj
<</F 132/Type/Annot/Subtype/Widget/Rect[343.0 142.0 543.0 192.0]/FT/Sig/DR<<>>/T(signature38)/V 40 0 R/P 3 0 R/AP <</N 41 0 R>>>>
endobj

39 0 obj
<<
/Length 52
/Type /XObject
/Subtype /Form
/Resources <<
/XObject <<
/n2 42 0 R
/n0 43 0 R
>>
/ProcSet [/PDF /Text /ImageB /ImageC /ImageI]
>>
/BBox [0.0 0.0 200.0 50.0]
/FormType 1
>>
stream
q 1 0 0 1 0 0 cm /n0 Do Q q 1 0 0 1 0 0 cm /n2 Do Q

endstream
endobj
40 0 obj
<<content>>
endobj

41 0 obj
<<
/Length 27
/Type /XObject
/Subtype /Form
/Resources <<
/XObject <<
/FRM 39 0 R
>>
/ProcSet [/PDF /Text /ImageB /ImageC /ImageI]
>>
/BBox [0.0 0.0 200.0 50.0]
/FormType 1
>>
stream
q 1 0 0 1 0 0 cm /FRM Do Q

endstream
endobj
42 0 obj
<<
/Length 31
/Type /XObject
/Subtype /Form
/BBox [0.0 0.0 200.0 50.0]
/Matrix [1.0 0.0 0.0 1.0 0.0 0.0]
/Resources <<
/XObject <<
/img1 44 0 R
>>
/ProcSet [/PDF /Text /ImageB /ImageC /ImageI]
>>
/FormType 1
>>
stream
q 200 0 0 50 0 0 cm /img1 Do Q

endstream
endobj
43 0 obj
<<
/Length 0
/Type /XObject
/Subtype /Form
/BBox [0.0 0.0 200.0 50.0]
/Resources <<
>>
/FormType 1
>>
stream

endstream
endobj
44 0 obj << /Length 9451 /Type /XObject /Subtype /Image /Filter /DCTDecode /BitsPerComponent 8 /Width 1300 /Height 1261 /ColorSpace /DeviceRGB 
stream
--JPEG bytes--
endstream

在这里你可以下载我的PDF。

更新2:我的xref表似乎有一个错误,它们没有指向正确的XObject,这就是为什么我得到了这个错误。然而,现在即使我的PDF没有损坏,签名也可以(adobe会告诉签名无法验证,因为证书是自签名的,但没关系)。

但是现在,我有另一个问题:图像没有出现。它是可点击的,可以工作,但它是空的。

此处提供了PDF的新版本。

共有1个答案

孟永望
2023-03-14

您遇到的问题对于在不使用经过测试的PDF库的情况下执行特定PDF编辑任务的项目来说是典型的。

正如在注释中讨论的那样,在第一个文件中,您只发布了一个摘录,其中存在基本的语法错误,特别是忽略了规范要求的流关键字流后面应该有一个行尾标记。

在第二个文件中,您自己发现了损坏的交叉引用条目。

现在讨论第三个文件,它似乎在Adobe Reader中正确签名,只是图像没有显示。

但实际上,仍然存在多个错误。

图像未显示的一个原因是图像XObject流在语法上被破坏:

44 0 obj << /Length 9451 /Type /XObject /Subtype /Image /Filter /DCTDecode /BitsPerComponent 8 /Width 1300 /Height 1261 /ColorSpace /DeviceRGB 
stream 
...

如果不查看您在流的字典部分中设置的值,您已经看到结束

事后看来,这在你之前发布的文件中已经可以看到,但还有其他问题首先映入眼帘。

此外,您的交叉引用仍然有些不完整,许多条目指向具有任意生成编号的文件偏移量23。文档中至少引用了一些这样处理的对象编号。这使得一些程序已经无法加载您的PDF。

同样已经在评论中讨论过,您标记了问题PADE,但使用了子过滤器值adbe。pkcs7。独立的这很奇怪,如果一个人开始实现PAdES签名,为什么要使用遗留概要文件?

 类似资料:
  • 是否可以用开放源码软件库pdfbox提取已签名PDF的可见签名(图像)? 工作流: null 像下面这样的oop风格的东西会很棒: 找到了类PDSignature和如何签署一个PDF,但没有解决方案提取一个可见的签名作为图像。

  • 我有一个场景,我需要用iText7库从pdf中获取签名信息。签名可能存在,也可能不存在。当我为没有任何数字签名的PDF实例化一个新的对象时,会出现异常 “没有相关的PdfWriter用于进行间接操作。” .如果有签名,就很好用。我不确定如何纠正这个异常。 更新为包含代码示例

  • 据我所知有两种方法 添加DSS字典 在签名时在签名中嵌入CRL或OCSP响应 DSS方法似乎是可行的,Adobe将签名识别为启用了LTV。第二种方法更适合我们的应用程序,所以我仍在努力让它工作。我在向签名添加OCSP响应时遇到了问题,所以我只尝试添加证书和CRL。如果我错了,请纠正我,但据我所知,CRL或OCSP响应都应该添加到签名中。不需要两者兼而有之吗?我收集签名证书及其根证书,还有TSA证书

  • 我试图为我的应用程序生成一个签名的APK,但是,我得到了下面的两个错误消息。请看我的Android宣言文件。 我收到以下两条错误消息,请有人帮助我,因为我正在努力生成一个唱歌的APK。我能够构建我的应用程序,但是,在尝试创建API时,我总是收到下面指示的两条错误消息。 错误:任务“:移动:转换类与DexForRelease”的执行失败。 com.android.build.api.transfor

  • 问题内容: 如何使html 始终可见,而不仅仅是关注? 似乎 应该 像这样简单: 的HTML: CSS: 无论我做什么,似乎我根本都无法影响某个区域的样式,它看起来确实不受CSS影响。有任何想法吗?另外,还有其他无法使用样式标记的示例吗? 问题答案: jQuery插件MapHilight: 您可能会在这里发现jQuery插件MapHilight)。 HTML / CSS替代 我建议使用带有绝对链接

  • 我想实现PDF的“并行”签名过程,这样用户就可以对文档进行数字签名,而不是“一个一个”,而是同时进行。为了实现这一点,我决定为所有用户创建初始文档的单独副本,并在其上获得签名。最终,所有签名都应该连接到单个PDF中。 让我们假设,除了签名字段创建(所有的acroForms、signatureContainers、可视签名等都是在之前创建的,并且都是类似的),在签名过程中PDF没有改变。 在进一步的