如果尝试使用itext 5.5.13.1模拟不同用户的签名几次,从而对文档进行签名,则PdfStamper处于AppendMode上。如果文档没有签名,则证书级别为CERTIFIED_NO_CHANGES_ALLOWED或CERTIFIED_FORM_FILLING_AND_ANNOTATIONS,否则我不会为PdfSignatureAppearence设置此参数。第二次签名后,第一个签名无效,因为文档已更改。任何想法如何解决这一问题? 这是我的代码:
characters
答案 0 :(得分:0)
屏幕截图中最重要的部分
是签名面板上的签名之间的文本“已修改1页” 。这告诉我们,您所做的其他更改不只是添加和填充签名字段。检查文件本身很快就能识别出更改:
在原始样本中。pdf
只有一个内容流。
在带有一个签名的sample_signed.pdf中
一共有三个内容流,原始的一个被新的内容包住了。
在带有两个签名的sample_signed_signed.pdf中
一共有五个内容流,前三个由两个新的内容包住。
因此,在每次签名过程中,您都要更改页面内容。如您在this answer中所读,总是禁止对签名文档的页面内容进行更改。所添加的流的内容微不足道甚至没有帮助,前面添加的每个流都包含:
q
,最后添加的每个流都包含
Q
q
Q
即只有一些保存和恢复图形状态发生。
上述更改是通过PdfStamper
方法GetOverContent
完成的典型准备步骤,将原始内容包装在q ... Q
(保存并恢复图形状态)信封中,以防止更改影响OverContent
中的添加项,并开始一个新的程序段(也包含在这样的信封中)。后面的块保持空白,表示OverContent
尚未编辑。
在您发布的代码中找不到这样的调用,但是在您的代码中缺少方法SetStampCoordinates
。您可能会在该方法中为GetOverContent
参数调用PdfStamper
吗?