1

我正在尝试务实地创建一个可见的 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

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

**更新: **

我根据 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:我的外部参照表似乎存在错误,它们没有指向正确的 XObjects,这就是我收到错误的原因。但是,现在即使我的 PDF 没有损坏并且签名正常(adobe 会告诉签名无法验证,因为证书是自签名的,但没关系)。

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

此处提供了 PDF 的新版本。

4

1 回答 1

0

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

正如评论中所讨论的,在您仅发布摘录的第一个文件中,存在基本的语法错误,特别是忽略了规范要求的流关键字stream后应跟一个行尾标记。

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

现在您讨论在 Adob​​e Reader 中查看时似乎已正确签名的第三个文件,只是图像没有显示。

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

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

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

如果不查看您在流的字典部分中设置的值,就会发现>>缺少该字典的关闭。因此,PDF 处理器看不到图像元数据的结束位置和图像有效负载的开始位置。

事后看来,这在您发布的先前文件中已经可见,但还有其他问题首先引起了人们的注意。

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

也已经在评论中讨论过,您标记了您的问题,但使用了SubFilteradbe.pkcs7.detached。这很奇怪,如果开始实施 PAdES 签名,为什么还要使用旧配置文件?

于 2019-09-15T21:17:40.390 回答