该页面可以包含自动翻译的文本。
在 C# 和 VB.NET 中签署 PDF 文档
数字签名用于验证用户的身份和 PDF 文档的内容。 签名可以证明 PDF 文档:
- 自签署以来未曾修改过。
- 由特定人员进行数字签名。
用于签署 PDF 文档的 .NET 库
使用 Docotic.Pdf 库 在 .NET Framework 和 .NET Core 应用程序中签署 PDF 文档。 在 下载 C# .NET PDF 库 页面获取库和免费限时许可证密钥。
9.5.17615-dev 14,813 通过 NuGet 总下载量 4,924,084Docotic.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;