该页面可以包含自动翻译的文本。

在 C# 和 VB.NET 中签署 PDF 文档

数字签名用于验证用户的身份和 PDF 文档的内容。 签名可以证明 PDF 文档:

  • 自签署以来未曾修改过。
  • 由特定人员进行数字签名。

使用 C# 和 VB.NET 向 PDF 添加数字签名

用于签署 PDF 文档的 .NET 库

使用 Docotic.Pdf 库 在 .NET Framework 和 .NET Core 应用程序中签署 PDF 文档。 您 可以下载该库的二进制文件或使用其NuGet包。 要尝试不受评估 模式限制的库,您可以在此处 获取免费的限时许可证密钥。

Docotic.Pdf 库 9.3.17036-dev 回归测试 14,665 通过 NuGet 总下载量 4,191,515

Docotic.Pdf 可以使用不同的摘要算法(SHA-1、SHA-256、SHA-384、SHA-512、RIPEMD-160)和不同的签名格式 (adbe.pkcs7.detached 或 ETSI.CAdES.detached)创建数字签名 。 该库还可以验证 PDF 签 名

C#中给PDF添加数字签名

您需要由有效证书颁发机构 (CA) 颁发的数字 PKCS#12 证书(.pfx 或 .p12 文件)才能签署 PDF 文档。 以下 是演示如何使用 C# 签署 PDF 文档的基本示例:

using BitMiracle.Docotic.Pdf;

using (var pdf = new PdfDocument("document_to_sign.pdf"))
{
    var options = new PdfSigningOptions("your_cert.p12", "your_cert_password")
    {
        DigestAlgorithm = PdfDigestAlgorithm.Sha256,
        Format = PdfSignatureFormat.Pkcs7Detached,
        Reason = "Testing digital signatures",
        Location = "My workplace",
        ContactInfo = "support@example.com"
    };

    pdf.SignAndSave(options, "signed.pdf");
}

将“your_cert.p12”和“your_cert_password”替换为您自己的 .p12 或 .pfx 证书文件和密码。 在 GitHub 上, 您可以下载并尝试使用 C# 和 VB.NET 编写的完整签署 PDF 文档 示例。

在某些情况下,您需要签署已经签署的文件。 或者多人应依次签署一份表格。 这也是有可能的。 步骤大部分是 相同的。 只需确保您增量签名并保存即可。 如果您仅应用允许的更改,则增量更新不会使数字签名失效。

对于这些情况,有 签署已签名的 PDF 文档由多人签署 PDF 表 单 C# 和 VB.NET 示例。

上面的代码隐式地向 PDF 文档添加了一个不可见的签名字段,并使用它进行签名。 让我们看看如何在 PDF 中添 加和自定义签名字段。

使用手写签名图像签署 PDF 文档

除了数字签名之外,您还经常需要在 PDF 中添加手写签名图像。 此示例演示如何在 C# 中添加带有关联图像的 数字签名:

using (var pdf = new PdfDocument("document_to_sign.pdf"))
{
    var options = new PdfSigningOptions("your_cert.p12", "your_cert_password")
    {
        DigestAlgorithm = PdfDigestAlgorithm.Sha256,
        Format = PdfSignatureFormat.Pkcs7Detached,
    };

    PdfSignatureField field = pdf.Pages[0].AddSignatureField(20, 20, 100, 50);
    options.Field = field;

    PdfImage image = pdf.AddImage("your_signature.jpg");
    options.Appearance.Image = image;
    options.Appearance.HideAllText();

    pdf.SignAndSave(options, "signed.pdf");
}

此代码添加签名字段,将该字段与签名选项相关联,并自定义该字段的外观。 您可以在签名字段中显示文本、图 像或两者。 有关更多详细信息,请参阅 PdfSignatureAppearanceOptions 类使用自定义样式签署签名字 段 示例。

使用签名字段锁定 PDF 表单字段

签名字段可用于在签名后锁定 PDF 表单字段。 此示例演示如何在登录 C# 后锁定特定表单字段:

var first = page.AddSignatureField("first", 100, 100, 200, 50);

// 当第一个字段被签名时,名称为“some_text_field”和“some_checkbox”的字段将被锁定以进行编辑
first.Lock = PdfSignatureFieldLock.CreateLockFields("some_text_field", "some_checkbox");

以下代码显示了如何在签名后锁定所有表单字段:

var second = page.AddSignatureField("second", 100, 200, 200, 50);

// 当第二个字段被签名时,所有字段将被锁定以进行编辑
second.Lock = PdfSignatureFieldLock.CreateLockAll();

您还可以锁定 PDF 文档中除特定字段之外的所有表单字段。 为此,请使用 PdfSignatureFieldLock.CreateLockAllExceptFields 方 法

从 GitHub 下载并尝试使用 C# 和 VB.NET 编写的完整用锁签名签名字 段

在数字签名中嵌入时间戳

您可以通过嵌入时间戳来为数字签名添加额外的安全性。 为此,请将时间戳颁发机构 URL 指定为签名选项之 一。 如果需要,您还可以提供用户名和密码。

签名时,库将从时间戳机构获取时间戳并将其嵌入到签名中。

出于兼容性原因,我们建议对时间戳签名使用 SHA 摘要算法之一。

// 将以下测试 URL 替换为您的时间戳授权 URL
options.Timestamp.AuthorityUrl = new Uri("http://tsa.starfieldtech.com/");

// 如果您的时间戳颁发机构需要身份验证,请指定用户名和密码
options.Timestamp.Username = null;
options.Timestamp.Password = null;