我正在使用iTextSharp& pkcs11RsaSignature在PDF文档的每一页上插入数字签名。以下是我的代码:
PdfReader pdfSource = new PdfReader(...);
NumberOfPages = pdfSource.NumberOfPages;
pdfSource.Close();
CurrentPage = 1;
while (CurrentPage <= NumberOfPages)
{
Temp3PDF = Temp1PDF;
Temp1PDF = Temp2PDF;
Temp2PDF = Temp3PDF;
PdfReader pdfSrc = new PdfReader(Temp1PDF);
FileStream pdfDes = new FileStream(Temp2PDF, FileMode.Create);
PdfStamper pdfStamper = PdfStamper.CreateSignature(pdfSrc, pdfDes, '\0', Path.GetTempFileName(), true);
PdfSignatureAppearance pdfSignAppearance = pdfStamper.SignatureAppearance;
pdfSignAppearance.Acro6Layers = false;
pdfSignAppearance.SetVisibleSignature(new iTextSharp.text.Rectangle(100, 100, 250, 150), CurrentPage, null);
MakeSignature.SignDetached(pdfSignAppearance, pkcs11RsaSignature, certPath, null, null, null, 0, CryptoStandard.CADES);
pdfStamper.Close();
pdfDes.Close();
pdfSrc.Close();
CurrentPage++;
}
可以看出,这不是一种非常优雅的编程方式,因为文件的读取和写入次数与页数一样多。有没有其他方法在PDF文档的每一页上插入数字签名。
这里真正想做的是 - 如果将PDF文档拆分成页面(将来),由于内容没有改变,所以技术上数字签名对于签名的页面应该是有效的。但我意识到签名将失效。 (修改问题 - 有没有办法只对一页pdf而不是整个文档进行数字签名?)
致Bruno Lowagie(您是专家):除了PDF规范中未提供外,还可以通过签署仅在所选组件上计算的哈希来部分签署PDF文件。您是否认为可以升级PDF规范以满足此类要求。谢谢你的帮助。
答案 0 :(得分:2)
这里真正想做的是 - 如果将PDF文档拆分成页面(将来),由于内容没有改变,所以技术上数字签名对于签名的页面应该是有效的
这种思路是基于一种误解。是的,您可以在一个特定页面上显示签名的可视化,但是加密签名会签署整个PDF,但嵌入式CMS签名容器本身除外。
但你自己发现了这个。因此,让我们考虑一下你的改述问题:
但我意识到签名将失效。 (修改问题 - 有没有办法只对一页pdf而不是整个文档进行数字签名?)
过去,可能允许签署单页的方式有两种:
现在,这些技术不再是可用的选项了,因为
因此,不,没有办法只对一页pdf而不是整个文档进行数字签名,至少不是以可互操作的方式。
在多页PDF中实现与页面签名相似的选项将是