在实际环境中测试
在生产中测试无水印。
随时随地为您服务。
签署 PDF 文档,包括 PDF 文件。 数字签名是指一种数学公式,用于验证和确保电子文档的完整性。
在本教程中,我们将向您展示 如何在 PDF 中添加数字签名信息 在 C# 中使用 iTextSharp 和 IronPDF 库。
在深入了解代码之前,让我们先快速了解一下什么是数字签名以及数字签名的重要性。
数字签名是指一种数学公式,用于验证和确保电子文档的完整性。
它是一种电子签名,用于对电子文档进行数字签名。 数字签名具有很高的安全性,在许多国家都具有法律约束力。
在对文件进行数字签名时,会创建一个与文件相关联的唯一数字签名。
该签名使用私人密钥创建,而私人密钥只有签名者知道。 签名密钥包含签名者的信息,包括姓名、电子邮件地址和其他详细信息。
要验证数字签名文件的真实性,收件人必须能够获取签名者的公开密钥。 公钥用于解密签名并验证其真实性。
数字签名非常重要,因为它能提供高度的安全性,确保数字文档的完整性。
它们通常用于需要签署文件的场合,如合同、协议和其他法律文件。
与传统签名相比,数字签名具有多种优势:
既然我们已经了解了什么是数字签名以及数字签名的重要性,下面就让我们看看如何使用 iTextSharp 和 IronPDF 在 C# 中为 PDF 文档添加数字签名。
数字签名用于验证电子文档的真实性,而 PDF 是此类文档的常用数据格式。
在本教程中,我们将比较如何使用 iTextSharp 和 IronPDF 这两个 C# 库为 PDF 文件添加数字签名。
iTextSharp 是一个流行的开源库,用于用 C# 创建和操作 PDF 文档。
它包括对数字签名的支持,在 .NET 项目中被广泛使用。 另一方面,IronPDF 是一个商业库,提供类似的 PDF 操作功能,包括数字签名。
在本教程中,我们将演示如何使用这两个库为 PDF 文档添加数字签名,包括创建数字证书、使用私钥签署 PDF 文档和验证签名等概念。 我们还将提供每个步骤的源代码示例。
在开始之前,您应该对 C# 编程和 .NET Framework 有基本的了解。
此外,您还需要在项目中安装 iTextSharp 和 IronPDF 库。
您可以从 NuGet 下载 iTextSharp,也可以从 IronPDF 网站下载 IronPDF。
IronPDF for .NET 是一个.NET 库,可让您用 C# 创建、编辑和签署 PDF 文档。 在本指南中,我们将介绍使用 IronPDF 和 X509Certificate2 对象签署 PDF 的过程。
以下是使用 IronPDF 签署 PDF 的步骤:
using IronPdf; using IronPdf.Signing; using System.Security.Cryptography.X509Certificates;
using IronPdf; using IronPdf.Signing; using System.Security.Cryptography.X509Certificates;
Imports IronPdf
Imports IronPdf.Signing
Imports System.Security.Cryptography.X509Certificates
ChromePdfRenderer renderer = new ChromePdfRenderer();
PdfDocument pdf = renderer.RenderHtmlAsPdf("foo");
ChromePdfRenderer renderer = new ChromePdfRenderer();
PdfDocument pdf = renderer.RenderHtmlAsPdf("foo");
Dim renderer As New ChromePdfRenderer()
Dim pdf As PdfDocument = renderer.RenderHtmlAsPdf("foo")
在本例中,我们将呈现一个简单的 HTML 文档,其中只有一个标题元素。
![](/static-assets/pdf/blog/add-digital-signature-topdf-in-csharp-using-itextsharp/add-digital-signature-topdf-in-csharp-using-itextsharp-6.webp)
X509Certificate2 cert = new X509Certificate2("IronSoftware.pfx", "123456", X509KeyStorageFlags.Exportable);
X509Certificate2 cert = new X509Certificate2("IronSoftware.pfx", "123456", X509KeyStorageFlags.Exportable);
Dim cert As New X509Certificate2("IronSoftware.pfx", "123456", X509KeyStorageFlags.Exportable)
在本例中,我们从名为 "IronSoftware.pfx "的 PKCS#12 文件中加载证书,并提供密码 "123456"。 我们还将 X509KeyStorageFlags 设置为 Exportable,以便使用证书的私钥来签署 PDF。
![](/static-assets/pdf/blog/add-digital-signature-topdf-in-csharp-using-itextsharp/add-digital-signature-topdf-in-csharp-using-itextsharp-7.webp)
var sig = new PdfSignature(cert);
var sig = new PdfSignature(cert);
Dim sig = New PdfSignature(cert)
在本例中,我们使用步骤 3 中创建的证书对象创建一个新的 PdfSignature
对象。
PdfSignature
对象。 pdf.Sign(sig);
pdf.Sign(sig);
pdf.Sign(sig)
pdf.SaveAs("signed.pdf");
pdf.SaveAs("signed.pdf");
pdf.SaveAs("signed.pdf")
下面是完整的代码:
using IronPdf;
using IronPdf.Signing;
using System.Security.Cryptography.X509Certificates;
ChromePdfRenderer renderer = new ChromePdfRenderer();
PdfDocument pdf = renderer.RenderHtmlAsPdf("foo");
X509Certificate2 cert = new X509Certificate2("IronSoftware.pfx", "123456", X509KeyStorageFlags.Exportable);
var sig = new PdfSignature(cert);
pdf.Sign(sig);
pdf.SaveAs("signed.pdf");
using IronPdf;
using IronPdf.Signing;
using System.Security.Cryptography.X509Certificates;
ChromePdfRenderer renderer = new ChromePdfRenderer();
PdfDocument pdf = renderer.RenderHtmlAsPdf("foo");
X509Certificate2 cert = new X509Certificate2("IronSoftware.pfx", "123456", X509KeyStorageFlags.Exportable);
var sig = new PdfSignature(cert);
pdf.Sign(sig);
pdf.SaveAs("signed.pdf");
IRON VB CONVERTER ERROR developers@ironsoftware.com
创建数字证书后,我们就可以用它来签署 PDF 文件了。
要在 PDF 文件上签名,我们需要创建一个新的签名对象并设置其属性,例如新签名在页面上的位置和签名的原因。
iTextSharp 是一个流行的开源库,用于在 C# 中处理 PDF 文档。 有了 iTextSharp,你就可以创建和处理 PDF 文档,并为其添加数字签名。 在本文中,我们将重点介绍如何使用 iTextSharp 签署 PDF 文件。
要开始使用,您需要在项目中添加对 iTextSharp.dll 文件的引用。 你可以从其官方网站下载 iTextSharp 的最新版本。
在项目中添加 iTextSharp 引用后,就可以使用 PDFSigner 库来签署 PDF 文档。 PDFSigner 库包含三个类:"Cert"、"MetaData "和 "PDFSigner"。
Cert 类用于保存证书并提取签名所需的信息。 MetaData "类保存 PDF 元数据,"PDFSigner "类用于创建签名并将其添加到 PDF 文档中。
processCert "方法用于读取数字证书并提取私钥条目。 如果有数字证书链,它还会构建数字证书链。
签名 "方法用于使用 PDFStamper 创建新的 PDF 文档并添加签名。 您可以配置签名的外观,并为其添加原因、联系人和位置属性。 SetCrypto方法用于使用从证书文件中提取的私钥和链证书对文档进行签名。最后,如果需要在文档中添加可见签名,可使用
SetVisibleSignature` 方法。
下面是一个示例代码片段,展示了如何使用 iTextSharp 签署 PDF 文件:
using iTextSharp.text.pdf;
using System.IO;
public void SignPDF(string inputPDF, string outputPDF, string certPath, string certPassword, string reason, string contact, string location, bool visible) {
PdfReader reader = new PdfReader(inputPDF);
//Activate MultiSignatures
PdfStamper st = PdfStamper.CreateSignature(reader, new FileStream(outputPDF, FileMode.Create, FileAccess.Write), '\0', null, true);
//To disable Multi signatures uncomment this line:
//every new signature will invalidate older ones!
//PdfStamper st = PdfStamper.CreateSignature(reader, new FileStream(outputPDF, FileMode.Create, FileAccess.Write), '\0');
MetaData metadata = new MetaData();
metadata.setAuthor("John Doe");
metadata.setTitle("Signed PDF Document");
st.MoreInfo = metadata.getMetaData();
st.XmpMetadata = metadata.getStreamedMetaData();
PdfSignatureAppearance sap = st.SignatureAppearance;
//Read the certificate and extract the private key entry
Cert myCert = new Cert(certPath, certPassword);
sap.SetCrypto(myCert.Akp, myCert.Chain, null, PdfSignatureAppearance.WINCER_SIGNED);
sap.Reason = reason;
sap.Contact = contact;
sap.Location = location;
//Add a visible signature to the document if (visible)
sap.SetVisibleSignature(new iTextSharp.text.Rectangle(100, 100, 250, 150), 1, null);
st.Close();
}
using iTextSharp.text.pdf;
using System.IO;
public void SignPDF(string inputPDF, string outputPDF, string certPath, string certPassword, string reason, string contact, string location, bool visible) {
PdfReader reader = new PdfReader(inputPDF);
//Activate MultiSignatures
PdfStamper st = PdfStamper.CreateSignature(reader, new FileStream(outputPDF, FileMode.Create, FileAccess.Write), '\0', null, true);
//To disable Multi signatures uncomment this line:
//every new signature will invalidate older ones!
//PdfStamper st = PdfStamper.CreateSignature(reader, new FileStream(outputPDF, FileMode.Create, FileAccess.Write), '\0');
MetaData metadata = new MetaData();
metadata.setAuthor("John Doe");
metadata.setTitle("Signed PDF Document");
st.MoreInfo = metadata.getMetaData();
st.XmpMetadata = metadata.getStreamedMetaData();
PdfSignatureAppearance sap = st.SignatureAppearance;
//Read the certificate and extract the private key entry
Cert myCert = new Cert(certPath, certPassword);
sap.SetCrypto(myCert.Akp, myCert.Chain, null, PdfSignatureAppearance.WINCER_SIGNED);
sap.Reason = reason;
sap.Contact = contact;
sap.Location = location;
//Add a visible signature to the document if (visible)
sap.SetVisibleSignature(new iTextSharp.text.Rectangle(100, 100, 250, 150), 1, null);
st.Close();
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
要签署 PDF 文件,请按照以下步骤操作:
using IronPdf;
using IronPdf;
Imports IronPdf
PdfDocument pdf = PdfDocument.FromFile("annual_census.pdf");
PdfDocument pdf = PdfDocument.FromFile("annual_census.pdf");
Dim pdf As PdfDocument = PdfDocument.FromFile("annual_census.pdf")
在本例中,我们从当前目录加载名为 "annual_census.pdf "的 PDF 文件。 此方法返回一个 PdfDocument 对象,表示加载的 PDF 文件。
对 PDF 文件进行必要的编辑。
在本例中,我们假定对 PDF 文件进行了一些编辑。
pdf.SignWithFile("/assets/IronSignature.p12", "password", null, PdfDocument.SignaturePermissions.FormFillingAllowed);
pdf.SignWithFile("/assets/IronSignature.p12", "password", null, PdfDocument.SignaturePermissions.FormFillingAllowed);
pdf.SignWithFile("/assets/IronSignature.p12", "password", Nothing, PdfDocument.SignaturePermissions.FormFillingAllowed)
在本例中,我们使用位于"/assets "目录下的名为 "IronSignature.p12 "的 PKCS#12 文件对 PDF 文件进行签名。 我们还提供了 PKCS#12 文件的密码作为第二个参数。 第三个参数指定签署 PDF 文件的原因,我们将其留空。 第四个参数指定签名权限,我们将其设置为只允许填写表格。
PdfDocument pdfWithRevision = pdf.SaveAsRevision();
PdfDocument pdfWithRevision = pdf.SaveAsRevision();
Dim pdfWithRevision As PdfDocument = pdf.SaveAsRevision()
该方法创建一个新的 PdfDocument 对象,其中包含原始 PDF 文件和作为修订版的签名。
pdfWithRevision.SaveAs("annual\_census\_2.pdf");
pdfWithRevision.SaveAs("annual\_census\_2.pdf");
pdfWithRevision.SaveAs("annual\_census\_2.pdf")
在本例中,我们将已签名 PDF 文件的文件名保存为当前目录下的 "ann annual/_census/_2.pdf"。
以下是完整的代码:
using IronPdf; PdfDocument pdf = PdfDocument.FromFile("annual\_census.pdf");
// make any necessary edits
pdf.SignWithFile("/assets/IronSignature.p12", "password", null, PdfDocument.SignaturePermissions.FormFillingAllowed);
PdfDocument pdfWithRevision = pdf.SaveAsRevision();
pdfWithRevision.SaveAs("annual\_census_2.pdf");
using IronPdf; PdfDocument pdf = PdfDocument.FromFile("annual\_census.pdf");
// make any necessary edits
pdf.SignWithFile("/assets/IronSignature.p12", "password", null, PdfDocument.SignaturePermissions.FormFillingAllowed);
PdfDocument pdfWithRevision = pdf.SaveAsRevision();
pdfWithRevision.SaveAs("annual\_census_2.pdf");
IRON VB CONVERTER ERROR developers@ironsoftware.com
PDF 文档签名后,必须能够验证签名,以确保文档在签名后未被篡改。
要使用 C# 中的 iTextSharp 验证 PDF 数字签名,请按以下步骤操作:
PdfReader
对象。PdfReader
对象的 GetAcroFields
方法获取 PDF 文档的 AcroFields。AcroFields
对象的 GetSignatureNames
方法获取签名名称。PdfPKCS7
对象的 Verify
方法验证签名。如果签名有效,则返回 true。 否则,返回 false。
下面是在 C# 中使用 iTextSharp 验证 PDF 文档数字签名的代码:
public static bool VerifyPdfDigitalSignature(string filePath)
{
bool isValid = false;
try
{
// Create a PdfReader object
PdfReader reader = new PdfReader(filePath);
// Get the AcroFields of the PDF document
AcroFields fields = reader.AcroFields;
// Get the signature names
List<string> names = fields.GetSignatureNames();
// Iterate through the signature names
foreach (string name in names)
{
// Get the PdfPKCS7 object for the signature
PdfPKCS7 pkcs7 = fields.VerifySignature(name);
// Verify the signature
if (pkcs7.Verify())
{
isValid = true;
}
else
{
isValid = false;
}
}
reader.Close();
}
catch (Exception ex)
{
// Handle exception
isValid = false;
}
return isValid;
}
public static bool VerifyPdfDigitalSignature(string filePath)
{
bool isValid = false;
try
{
// Create a PdfReader object
PdfReader reader = new PdfReader(filePath);
// Get the AcroFields of the PDF document
AcroFields fields = reader.AcroFields;
// Get the signature names
List<string> names = fields.GetSignatureNames();
// Iterate through the signature names
foreach (string name in names)
{
// Get the PdfPKCS7 object for the signature
PdfPKCS7 pkcs7 = fields.VerifySignature(name);
// Verify the signature
if (pkcs7.Verify())
{
isValid = true;
}
else
{
isValid = false;
}
}
reader.Close();
}
catch (Exception ex)
{
// Handle exception
isValid = false;
}
return isValid;
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
在上述代码中,"VerifyPdfDigitalSignature "函数将 PDF 文档的路径作为参数,并返回一个布尔值,表示数字签名是否有效。
请注意,该功能会验证 PDF 文档中的所有签名。 如果只想验证特定签名,可以将签名名称作为参数传递给 VerifySignature
方法。
如果您的 PDF 文档包含一个或多个数字签名,您可以使用 IronPDF 验证签名,确保文档未被篡改。 下面介绍如何使用 IronPDF 的 "VerifyPdfSignatures "方法来实现这一点:
PdfDocument pdf = PdfDocument.FromFile("annual_census.pdf");
PdfDocument pdf = PdfDocument.FromFile("annual_census.pdf");
Dim pdf As PdfDocument = PdfDocument.FromFile("annual_census.pdf")
bool isValid = pdf.VerifyPdfSignatures();
bool isValid = pdf.VerifyPdfSignatures();
Dim isValid As Boolean = pdf.VerifyPdfSignatures()
处理结果 VerifyPdfSignatures 方法返回一个布尔值,表示文档中的所有签名是否有效。 如果值为 true,则表示所有签名都有效,文件未被篡改。 如果该值为 false,则表示一个或多个签名无效,文件可能被篡改。
您可以利用这些信息采取适当的措施,例如向用户显示一条信息或阻止进一步处理文档。
下面是完整的代码片段,展示了如何使用 IronPDF 验证 PDF 文档中的所有签名:
using IronPdf;
PdfDocument pdf = PdfDocument.FromFile("annual_census.pdf");
bool isValid = pdf.VerifyPdfSignatures();
if (isValid)
{
Console.WriteLine("All signatures are valid");
}
else
{
Console.WriteLine("One or more signatures are invalid");
}
using IronPdf;
PdfDocument pdf = PdfDocument.FromFile("annual_census.pdf");
bool isValid = pdf.VerifyPdfSignatures();
if (isValid)
{
Console.WriteLine("All signatures are valid");
}
else
{
Console.WriteLine("One or more signatures are invalid");
}
Imports IronPdf
Private pdf As PdfDocument = PdfDocument.FromFile("annual_census.pdf")
Private isValid As Boolean = pdf.VerifyPdfSignatures()
If isValid Then
Console.WriteLine("All signatures are valid")
Else
Console.WriteLine("One or more signatures are invalid")
End If
iTextSharp 和 IronPDF 库有不同的许可证和定价模式,这可能是您在项目中选择它们时需要考虑的因素。
iTextSharp 采用 Affero 通用公共许可证许可。 (AGPL)该许可证要求任何使用 iTextSharp 的软件也必须遵循 AGPL 许可证。
不过,iTextSharp 也有商业许可,允许开发人员在专有软件中使用该库,而无需发布源代码。
iTextSharp 商业许可证的定价根据开发人员和部署实例的数量而有所不同。
另一方面,IronPDF 是一个商业库,需要付费许可才能使用。 IronPDF 的定价基于开发人员和部署实例的数量,与 iTextSharp 类似。
不过,IronPDF 还为用户提供了一个 免费试用版 功能有限,可用于非商业项目。
在 定价对于小型项目或预算有限的项目来说,IronPDF 可能是一个更好的选择,因为免费试用版可以免费提供一些功能。
不过,对于大型项目或有特定许可要求的项目,iTextSharp 可能是一个更好的选择,因为它具有双重许可模式并支持 AGPL。
IronPDF 和 iTextSharp 是用 C# 处理 PDF 文件的两个流行库。 虽然这两个库为处理 PDF 文档提供了类似的功能,但它们之间也存在一些差异,开发人员在选择使用哪个库时应加以考虑。
从技术角度看,IronPDF 是一个现代化的 .NET 库,它提供了一个简单直观的 API 来处理 PDF 文件。 它支持多种 PDF 功能,包括文本、图像、表单和数字签名。 IronPDF 还提供 HTML 到 PDF 的转换和 PDF 编辑等高级功能。
另一方面,iTextSharp 是一个成熟的 PDF 库,其 API 更为复杂,可能需要花费更多精力来学习。 不过,iTextSharp 提供了高级功能,如低级 PDF 操作和对各种 PDF 标准的支持。
在许可方面,IronPDF 提供简单的商业许可模式,允许开发人员在专有软件中使用该库,而无需发布源代码。 这使得开发人员更容易在商业项目中使用 IronPDF,而不必担心许可证合规性问题。 另一方面,iTextSharp 提供双重许可模式,即免费的 AGPL 许可和专有软件的商业许可。 虽然这为开发人员提供了更大的灵活性,但操作起来也可能更加复杂。
从技术角度看,IronPDF 提供了更现代、更直观的应用程序接口,开发人员可能更容易使用。 此外,IronPDF 还提供 HTML 到 PDF 的转换和 PDF 编辑等高级功能,这些功能可能对某些项目有用。 不过,iTextSharp 提供了更高级的功能,如低级 PDF 操作和对各种 PDF 标准的支持。
IronPDF 用户可在 免费试用 并可 特许 用于商业用途,其精简版套餐起价仅为 499 美元。
最后,IronPDF 推出了一项特别促销活动,开发人员可以用两套软件的价格购买全部 6 套 Iron 软件产品 铁软件 产品 这可以让开发人员以实惠的价格使用各种功能强大的 .NET 库。