在 C# 中使用 iTextSharp 在 PDF 中添加多个数字签名

Posted

技术标签:

【中文标题】在 C# 中使用 iTextSharp 在 PDF 中添加多个数字签名【英文标题】:Add multiple Digital Signature in PDF using iTextSharp in C# 【发布时间】:2017-06-03 17:58:14 【问题描述】:

我已经使用 iTextSharp Dll 实现了数字签名,以使用单个签名对 PDF 文件进行签名。现在,我想在以前或已经数字签名的 PDF 中添加另一个数字签名,但在验证一个签名时出现错误。

如何在一个 PDF 中添加多个数字签名并验证所有签名。

我正在使用以下代码:

PdfReader reader = new PdfReader(fileName);
using (FileStream fout = new FileStream(SignedFileName, FileMode.Create, FileAccess.ReadWrite))

    // appearance
    PdfStamper stamper = PdfStamper.CreateSignature(reader, fout, '\0');
    PdfSignatureAppearance appearance = stamper.SignatureAppearance;
    //appearance.Reason = SignReason;
    //appearance.Location = SignLocation;
    appearance.SignDate = DateTime.Now.Date;
    appearance.SetVisibleSignature(new iTextSharp.text.Rectangle(xPos, yPos, xPos + 200, yPos + 100), PageNo, null);//.IsInvisible

    // Custom text and background image
    appearance.Image = iTextSharp.text.Image.GetInstance(SignatureImg);
    appearance.ImageScale = 0.6f;
    appearance.Image.Alignment = 300;
    appearance.Acro6Layers = true;

    StringBuilder buf = new StringBuilder();
    buf.Append("Digitally Signed by ");
    String name = SignerName;

    buf.Append(name).Append('\n');
    buf.Append("Date: ").Append(DateTime.Now.ToString("dd-MM-yyyy HH:mm:ss zzz"));

    string text = buf.ToString();

    appearance.Layer2Text = text;

    //digital signature
    IExternalSignature es = new PrivateKeySignature(pk, "SHA-256");
    MakeSignature.SignDetached(appearance, es, new Org.BouncyCastle.X509.X509Certificate[]  pk12.GetCertificate(alias).Certificate , null, null, null, 0, CryptoStandard.CMS);

    stamper.Close();


【问题讨论】:

您是否尝试过运行适用于具有不同参数的初始签名的代码示例?就像字段的新名称,新的边界框一样。 向我们展示您的代码!第一个签名是否允许额外的数字签名? (如果您添加额外的签名,“不允许更改”级别的作者签名将中断!)您是否在附加模式下添加了第二个签名? (如果您更改原始 PDF 中的字节,第一个签名将中断。)您的问题不完整,因此投反对票。请先阅读the documentation,如果仍有不清楚的地方,请解决您的问题。 “以前或已经数字签名” - 以前签名已经签名的意思不同吗?如果是,请在改进@Bruno 所描述的问题时解释差异。 @mkl - 以前签名或已经签名的意思是... PDF 将使用 itextsharp.dll 签名或任何 PDF 文件将由其他数字签名实用程序签名。 好的,我撤回了反对票。您的问题是由“用户没有阅读文档”引起的。查看我的答案以了解如何解决问题。 【参考方案1】:

错误在这一行:

PdfStamper stamper = PdfStamper.CreateSignature(reader, fout, '\0');

改成:

PdfStamper stamper = PdfStamper.CreateSignature(reader, fout, '\0', true);

解释:您没有在附加模式下签署文档。

在进一步检查您的代码后,我发现您还添加了一张图片。这可能很棘手。以附加模式添加新签名解决了一个问题。添加额外内容可能会导致额外问题,具体取决于您使用的 iText 版本。

【讨论】:

我添加了 PdfStamper stamper = PdfStamper.CreateSignature(reader, fout, '\0', null, true);在我的代码中,它已成功验证签名。但它错过了我为签名添加的图像......请提出建议。 如果没有添加图片,则不会添加图片。对于这样一个不完整的问题,我不确定您希望得到什么样的答复。

以上是关于在 C# 中使用 iTextSharp 在 PDF 中添加多个数字签名的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中使用 iTextSharp 在 PDF 中添加多个数字签名

iTextSharp PDF 使用 C# 读取突出显示的文本(突出显示注释)

如何在 c# 中的 iTextSharp pdf 中将位图显示为 jpeg 格式

C#可以用itextsharp 打开PDF文件吗?

c# itextsharp PDF 创建每个页面上都有水印

C#如何利用itextSharp修改现有PDF文件内容,比如插入