在实际环境中测试
在生产中测试无水印。
随时随地为您服务。
签署 PDF 文档,包括 PDF 文件。数字签名是指一种数学公式,用于验证和确保电子文档的完整性。
在本教程中,我们将向你展示 如何在 PDF 中添加数字签名信息 在 C# 中使用 iTextSharp 和 IronPDF 库。
在深入了解代码之前,让我们先快速了解一下什么是数字签名以及数字签名的重要性。
数字签名是指一种数学公式,用于验证和确保电子文档的完整性。
它是一种电子签名,用于对电子文档进行数字签名。数字签名具有很高的安全性,在许多国家都具有法律约束力。
在对文件进行数字签名时,会创建一个与文件相关联的唯一数字签名。
该签名使用私人密钥创建,只有签名者知道该密钥。签名密钥包含签名者的信息,包括姓名、电子邮件地址和其他详细信息。
要验证数字签名文件的真实性,收件人必须获得签名者的公开密钥。公开密钥用于解密签名并验证其真实性。
数字签名之所以重要,是因为它能提供高度的安全性,确保数字文档的完整性。
数字签名通常用于需要签署文件的场合,如合同、协议和其他法律文件。
与传统签名相比,数字签名有几个优点:
1.与传统签名相比,它们更安全、更防篡改。
2.它们可以通过电子方式进行验证,从而减少了人工验证的需要。
3.它们可用于在世界任何地方签署文件。
4.与传统签名相比,它们能提供更高水平的保证。
既然我们已经了解了什么是数字签名以及数字签名的重要性,下面就让我们看看如何使用 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 是一个.NET 库,允许你用 C# 创建、编辑和签署 PDF 文档。在本指南中,我们将介绍使用 IronPDF 和 X509Certificate2 对象签署 PDF 的过程。
以下是使用 IronPDF 签署 PDF 的步骤:
1.包括必要的命名空间。
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)
3.加载 X509Certificate2 对象,其中包含用于签署 PDF 的数字签名。
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)
4.使用证书创建 PdfSignature 对象。
var sig = new PdfSignature(cert);
var sig = new PdfSignature(cert);
Dim sig = New PdfSignature(cert)
在本例中,我们使用步骤 3 中创建的证书对象创建一个新的 PdfSignature
对象。
5.使用 "PdfDocument.Sign "签署 PDF 文档()方法,传入在步骤 4 中创建的 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"。
证书类用于保存证书并提取签名所需的信息。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 文件,请按以下步骤操作:
1.包括必要的命名空间:
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 文件。
3.对 PDF 文件进行必要的编辑。
在本例中,我们假设已对 PDF 文件进行了一些编辑。
4.使用 PdfDocument.SignWithFile 签署 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 文件的原因,我们将其留为空值。第四个参数指定签名权限,我们将其设置为只允许填写表格。
5.使用 PdfDocument.SaveAsRevision 将带有签名的 PDF 文件保存为修订版() 方法:
PdfDocument pdfWithRevision = pdf.SaveAsRevision();
PdfDocument pdfWithRevision = pdf.SaveAsRevision();
Dim pdfWithRevision As PdfDocument = pdf.SaveAsRevision()
该方法创建一个新的 PdfDocument 对象,其中包含原始 PDF 文件和作为修订版的签名。
6.使用 PdfDocument.SaveAs 将已签名的 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 数字签名,请按照以下步骤操作:
1.首先,将 iTextSharp 库添加到项目中。可以使用 Visual Studio 中的 NuGet 软件包管理器来完成此操作。搜索 iTextSharp 并安装。
2.定义一个函数,使用 iTextSharp 库验证 PDF 文档的数字签名。
3.在函数中,通过传递要验证的 PDF 文档的路径,创建一个 PdfReader
对象。
4.然后,使用 PdfReader
对象的 GetAcroFields
方法获取 PDF 文档的 AcroFields。
5.使用 AcroFields
对象的 GetSignatureNames
方法获取签名名称。
6.遍历签名名称,并使用 AcroFields
对象的 GetSignature
方法为每个签名检索 PdfPKCS7
对象。
7.使用 PdfPKCS7
对象的 Verify
方法验证签名。
8.如果签名有效,则返回 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 "方法来实现这一功能:
1.加载 PDF 文档 首先,你需要使用 IronPDF 的 PdfDocument.FromFile 方法加载 PDF 文档。该方法将文件路径作为参数,并返回一个代表 PDF 文档的 PdfDocument 对象。
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()
3.处理结果 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 提供了一种简单的商业许可模式,允许开发人员在专有软件中使用该库,而无需发布源代码。另一方面,iTextSharp 提供双重许可模式,既有免费的 AGPL 许可,也有针对专有软件的商业许可。虽然这为开发人员提供了更大的灵活性,但使用起来也可能更加复杂。
从技术角度来看,IronPDF 提供了更现代、更直观的 API,开发人员可能更容易使用。此外,IronPDF 还提供 HTML 到 PDF 的转换和 PDF 编辑等高级功能,这对某些项目可能非常有用。不过,iTextSharp 提供了更多高级功能,如底层 PDF 操作和对各种 PDF 标准的支持。
IronPDF 用户可在 免费试用 并可 特许 用于商业用途,其精简版套餐起价仅为 499 美元。
最后,IronPDF 还提供了一个特别促销活动,开发人员可以用两个产品的价格购买所有 6 个 Iron 软件产品。 铁软件 产品。这样,开发人员就能以合理的价格使用各种功能强大的 .NET 库。