插入多个(;2次);数字签名&xFF0C;我发现pdf中有3个信息字典

插入多个(;2次);数字签名&xFF0C;我发现pdf中有3个信息字典,c,pdf,podofo,C,Pdf,Podofo,我也遇到了同样的问题(在c++中使用podofo进行开发)。插入多个(2次)数字签名后,我发现pdf文件中有3个信息字典: 如何在不使前一个数字签名失效的情况下添加两个数字签名 谢谢 我用记事本++打开文件,发现不同的 the first: 97 0 obj<</Title(? G I S e r C l u bThR\n 2 0 1 4 0 7 2 0) /Author(edison qian) /Keywords(GISerClub) /Creator(? M i c r o

我也遇到了同样的问题(在c++中使用podofo进行开发)。插入多个(2次)数字签名后,我发现pdf文件中有3个信息字典:

如何在不使前一个数字签名失效的情况下添加两个数字签名

谢谢

我用记事本++打开文件,发现不同的

the first:  97 0 obj<</Title(? G I S e r C l u bThR\n 2 0 1 4 0 7 2 0) /Author(edison qian) /Keywords(GISerClub) /Creator(? M i c r o s o f t ?  W o r d   2 0 1 3) 
            /CreationDate(D:20150601200942+08'00') /ModDate(D:20150601200942+08'00') /Producer(? M i c r o s o f t ?  W o r d   2 0 1 3) >>

the second: 97 0 obj<</Author(edison qian)/CreationDate(D:20150601200942+08'00')/Creator(? M i c r o s o f t ?  W o r d   2 0 1 3)/Keywords(GISerClub)
            /ModDate(D:20190426155330+08'00')/Producer(? M i c r o s o f t ?  W o r d   2 0 1 3)/Title(? G I S e r C l u bThR\n 2 0 1 4 0 7 2 0)>>

the third:  97 0 obj<</Author(edison qian)/CreationDate(D:20150601200942+08'00')/Creator(? M i c r o s o f t ?  W o r d   2 0 1 3)/Keywords(GISerClub)
            /ModDate(D:20190426155428+08'00')/Producer(? M i c r o s o f t ?  W o r d   2 0 1 3)/Title(? G I S e r C l u bThR\n 2 0 1 4 0 7 2 0)>>

我使用上述代码两次,第一个签名无效。 如何添加两个数字签名而不使前一个无效?

在右侧绘制
PdfCanvas
在分析示例pdf之后,第二个签名使第一个签名无效的原因变得很清楚:在签名过程中,您使用签名的小部件注释更改页面的页面内容

但是更改任何页面的内容都会使以前的签名无效!有关允许和不允许更改已签署文件的详细信息,请参阅

事实上:

PdfPainter painter;

try
{
    painter.SetPage( /*&sigXObject*/pPage );

    /* Workaround Adobe's reader error 'Expected a dict object.' when the stream
        contains only one object which does Save()/Restore() on its own, like
        the image XObject. */
    painter.Save();
    painter.Restore();
    draw_annotation( *document, painter, image, annot_rect );
}
显然,您在这里更改了页面内容本身的某些内容。当在应用第二个签名时执行此代码时,第一个签名无效

您在评论中确认:


我使用“&sigXObject”而不是“pPage”,这两个签名都有效!但红印消失了

使用正确的坐标 关于您观察到的红印消失的情况:您在注释外观上绘制图像时使用了错误的坐标

可以使用页面坐标系的坐标,但必须使用外观边界框给定的坐标系中的坐标

因此,你的

painter.DrawImage( annot_rect.GetLeft(), annot_rect.GetBottom(), &image );
如果是错误的,请尝试以下操作

painter.DrawImage( 0, 0, &image );
因为您的外观的边界框是

[ 0 0 151 151 ]
右侧绘画
PdfCanvas
在分析示例pdf之后,第二个签名使第一个签名无效的原因变得很清楚:在签名过程中,您使用签名的小部件注释更改页面的页面内容

但是更改任何页面的内容都会使以前的签名无效!有关允许和不允许更改已签署文件的详细信息,请参阅

事实上:

PdfPainter painter;

try
{
    painter.SetPage( /*&sigXObject*/pPage );

    /* Workaround Adobe's reader error 'Expected a dict object.' when the stream
        contains only one object which does Save()/Restore() on its own, like
        the image XObject. */
    painter.Save();
    painter.Restore();
    draw_annotation( *document, painter, image, annot_rect );
}
显然,您在这里更改了页面内容本身的某些内容。当在应用第二个签名时执行此代码时,第一个签名无效

您在评论中确认:


我使用“&sigXObject”而不是“pPage”,这两个签名都有效!但红印消失了

使用正确的坐标 关于您观察到的红印消失的情况:您在注释外观上绘制图像时使用了错误的坐标

可以使用页面坐标系的坐标,但必须使用外观边界框给定的坐标系中的坐标

因此,你的

painter.DrawImage( annot_rect.GetLeft(), annot_rect.GetBottom(), &image );
如果是错误的,请尝试以下操作

painter.DrawImage( 0, 0, &image );
因为您的外观的边界框是

[ 0 0 151 151 ]

你说你也有同样的问题。。。和什么一样?你说你发现有三个信息——字典。。。这完全没关系,在增量更新的情况下,通常每个版本都会有一个信息字典。你可能还想展示你的方法的关键代码,并分享一个示例结果?你是对的,我打开“PdfMemDocument”进行增量更新,你还可以分享一个示例结果来说明问题以供分析吗?当然你说你也遇到了同样的问题。。。和什么一样?你说你发现有三个信息——字典。。。这完全没关系,在增量更新的情况下,通常每个版本都会有一个信息字典。你可能还想展示你的方法的关键代码,并分享一个示例结果?你是对的,我打开“PdfMemDocument”进行增量更新。你还可以分享一个示例结果,该结果说明了问题以供分析吗?当然,我使用“&sigXObject”而不是“pPage”,所有两个签名都有效!但是红印消失了,我该如何修改我的代码?衷心感谢您的代码忽略了PdfErrors。您可以检查是否引发了此类异常,如果是,请共享详细信息吗?我调试了代码,没有异常。请参阅“确定”。在这种情况下,您是否也可以共享
draw_annotation
方法的代码以及使用“&sigXObject”而不是“pPage”的示例签名pdf?是的,请参见我使用“&sigXObject”而不是“pPage”,所有两个签名都有效!但是红印消失了,我该如何修改我的代码?衷心感谢您的代码忽略了PdfErrors。您可以检查是否引发了此类异常,如果是,请共享详细信息吗?我调试了代码,没有异常。请参阅“确定”。在这种情况下,您是否也可以共享
draw_annotation
方法的代码以及使用“&sigXObject”而不是“pPage”的示例签名pdf?是的,请参阅