在实际环境中测试
在生产中测试无水印。
随时随地为您服务。
签署 PDF 文档(包括 PDF 文件)需要使用数字签名,数字签名是指用于验证和确保电子文档完整性的数学公式。
在本教程中,我们将向您展示如何使用 iTextSharp 和 IronPDF 库实现数字签名在C#中。
在深入了解代码之前,让我们先快速了解一下什么是数字签名以及数字签名的重要性。
数字签名是指用于验证和确保电子文档完整性的数学公式。
它是一种电子签名,用于对电子文档进行数字签名。 数字签名具有很高的安全性,在许多国家都具有法律约束力。
在对文件进行数字签名时,会创建一个与文件相关联的唯一数字签名。
该签名使用私人密钥创建,而私人密钥只有签名者知道。 签名密钥包含签名者的信息,包括姓名、电子邮件地址和其他详细信息。
要验证数字签名文件的真实性,收件人必须能够获取签名者的公开密钥。 公钥用于解密签名并验证其真实性。
数字签名非常重要,因为它能提供高度的安全性,确保数字文档的完整性。
它们通常用于需要签署文件的场合,如合同、协议和其他法律文件。
与传统签名相比,数字签名具有多种优势:
与传统签名相比,它们更安全、更防篡改。
它们可以通过电子方式进行验证,从而减少了人工验证的需要。
它们可用于在世界任何地方签署文件。
既然我们已经了解了什么是数字签名以及数字签名的重要性,下面就让我们看看如何使用 iTextSharp 和 IronPDF 在 C# 中为 PDF 文档添加数字签名。
数字签名用于验证电子文档的真实性,而 PDF 是此类文档的常用数据格式。
在本教程中,我们将比较如何使用 iTextSharp 和 IronPDF 这两个 C# 库为 PDF 文件添加数字签名。
iTextSharp 是一个流行的开源库,用于用 C# 创建和操作 PDF 文档。
它包括对数字签名的支持,在 .NET 项目中被广泛使用。 另一方面,IronPDF 是一个商业库,提供类似的 PDF 操作功能,包括数字签名。
在本教程中,我们将演示如何使用这两个库为 PDF 文档添加数字签名,包括创建数字证书、使用私钥签署 PDF 文档和验证签名等概念。 我们还将提供每个步骤的源代码示例。
在开始之前,您应该对 C# 编程和 .NET Framework 有基本的了解。
此外,您还需要在项目中安装 iTextSharp 和 IronPDF 库。
您可以从 NuGet 下载 iTextSharp,也可以从以下网站下载 IronPDFIronPDF 网站.
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");
Imports IronPdf
Imports IronPdf.Signing
Imports System.Security.Cryptography.X509Certificates
Private renderer As New ChromePdfRenderer()
Private pdf As PdfDocument = renderer.RenderHtmlAsPdf("foo")
Private cert As New X509Certificate2("IronSoftware.pfx", "123456", X509KeyStorageFlags.Exportable)
Private sig = New PdfSignature(cert)
pdf.Sign(sig)
pdf.SaveAs("signed.pdf")
创建数字证书后,我们就可以用它来签署 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();
}
Imports Microsoft.VisualBasic
Imports iTextSharp.text.pdf
Imports System.IO
Public Sub SignPDF(ByVal inputPDF As String, ByVal outputPDF As String, ByVal certPath As String, ByVal certPassword As String, ByVal reason As String, ByVal contact As String, ByVal location As String, ByVal visible As Boolean)
Dim reader As New PdfReader(inputPDF)
'Activate MultiSignatures
Dim st As PdfStamper = PdfStamper.CreateSignature(reader, New FileStream(outputPDF, FileMode.Create, FileAccess.Write), ControlChars.NullChar, Nothing, 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');
Dim metadata As New MetaData()
metadata.setAuthor("John Doe")
metadata.setTitle("Signed PDF Document")
st.MoreInfo = metadata.getMetaData()
st.XmpMetadata = metadata.getStreamedMetaData()
Dim sap As PdfSignatureAppearance = st.SignatureAppearance
'Read the certificate and extract the private key entry
Dim myCert As New Cert(certPath, certPassword)
sap.SetCrypto(myCert.Akp, myCert.Chain, Nothing, 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, Nothing)
st.Close()
End Sub
要签署 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 数字签名,请按以下步骤操作:
首先,将 iTextSharp 库添加到项目中。 您可以使用 Visual Studio 中的 NuGet 软件包管理器来完成此操作。 搜索 iTextSharp 并安装。
使用 iTextSharp 库定义验证 PDF 文档数字签名的函数。
在该函数中,通过传递要验证的 PDF 文档的路径,创建一个 PdfReader
对象。
接下来,使用 PdfReader
对象的 GetAcroFields
方法获取 PDF 文档的 AcroFields。
使用 AcroFields
对象的 GetSignatureNames
方法获取签名名称。
遍历签名名称,并使用 "AcroFields "对象的 "GetSignature "方法检索每个签名的 "PdfPKCS7 "对象。
使用 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;
}
Public Shared Function VerifyPdfDigitalSignature(ByVal filePath As String) As Boolean
Dim isValid As Boolean = False
Try
' Create a PdfReader object
Dim reader As New PdfReader(filePath)
' Get the AcroFields of the PDF document
Dim fields As AcroFields = reader.AcroFields
' Get the signature names
Dim names As List(Of String) = fields.GetSignatureNames()
' Iterate through the signature names
For Each name As String In names
' Get the PdfPKCS7 object for the signature
Dim pkcs7 As PdfPKCS7 = fields.VerifySignature(name)
' Verify the signature
If pkcs7.Verify() Then
isValid = True
Else
isValid = False
End If
Next name
reader.Close()
Catch ex As Exception
' Handle exception
isValid = False
End Try
Return isValid
End Function
在上述代码中,"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用户可在免费试用并可特许LiteLicense` 起即可用于商业用途。
最后,IronPDF 提供了一个特别促销活动,开发人员可以以购买两件产品的价格购买全部 9 件 Iron Software 产品. 这可以让开发人员以实惠的价格使用各种功能强大的 .NET 库。