在實際環境中測試
在生產環境中測試無浮水印。
在任何需要的地方都能運作。
簽署 PDF 文件,包括 PDF 檔案,涉及使用數位簽名,數位簽名是一種用於驗證和確保電子文件完整性的數學公式。
在本教程中,我們將向您展示如何使用iTextSharp和IronPDF庫實現數位簽名在 C# 中。
在我們深入了解程式碼之前,讓我們快速了解一下什麼是數位簽章以及它為什麼重要。
數位簽章是指用來驗證和確保電子文件完整性的一種數學公式。
它是用來數位簽署電子文件的電子簽名。 數位簽章提供高級別的安全性,而且在許多國家具有法律約束力。
當文件被數位簽署時,會創建一個與文件相關聯的唯一數位簽章。
此簽名是使用僅為簽署者所知的私鑰創建的。 簽章金鑰包含有關簽署者的信息,包括其姓名、電子郵件地址和其他詳細信息。
為了驗證數位簽名文件的真實性,接收者必須擁有簽署者的公鑰。 公鑰用於解密簽名並驗證其真實性。
數位簽章很重要,因為它們提供高水平的安全性並確保數位文件的完整性。
它們通常用於需要簽署文件的情況,例如合同、協議和其他法律文件。
數位簽名相比傳統簽名提供了多項優勢:
它們比傳統簽名更安全且防篡改。
它們可以電子驗證,這減少了人工驗證的需要。
他們可以用於在世界任何地方簽署文件。
既然我們已經了解數位簽章是什麼以及其重要性,讓我們來看看如何在 C# 中使用 iTextSharp 和 IronPDF 將數位簽章添加到 PDF 文件。
數位簽章用於驗證電子文件的真實性,而 PDF 是此類文件的常用數據格式。
本教程中,我們將比較如何使用兩個 C# 庫,iTextSharp 和 IronPDF,向 PDF 文件添加數字簽名。
iTextSharp 是一個受歡迎的開源庫,用於在 C# 中創建和操作 PDF 文件。
它包括對數位簽章的支持,並廣泛用於.NET專案。 另一方面,IronPDF 是一個商業庫,提供類似的 PDF 操作功能,包括數位簽章。
在本教程中,我們將演示如何使用這兩個庫為PDF文檔添加數位簽名,涵蓋創建數位證書、使用私鑰簽署PDF文檔以及驗證簽名等概念。 我們還將提供每個步驟的源代碼範例。
在我們開始之前,您應該對C#程式設計和.NET Framework有基本的了解。
此外,您需要在項目中安裝iTextSharp和IronPDF庫。
您可以從NuGet下載iTextSharp,並從IronPDF 網站.
IronPDF 是一個 .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
類別渲染 PDF 文件。 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
物件。
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
。
Cert 類別用於保存證書並提取簽名所需的信息。 MetaData
類別保存 PDF 元數據,而 PDFSigner
類別用於創建簽名並將其添加到 PDF 文件中。
processCert
方法用於讀取數位憑證並提取私鑰條目。 如果可用,它還會構建數位證書鏈。
Sign
方法用於使用 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)
在此範例中,我們使用名為「IronSignature.p12」的 PKCS#12 檔案簽署 PDF 檔案,該檔案位於「/assets」目錄中。 我們還提供 PKCS#12 檔案的密碼作為第二個參數。 第三個參數指定簽署 PDF 文件的原因,我們已將其留為 null。 第四個參數指定簽名的權限,我們已設置為僅允許填寫表單。
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 文件的檔案名稱儲存為當前目錄下的 "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 文件被簽署,驗證簽名以確保文件自簽署後未被篡改是很重要的。
若要使用 iTextSharp 在 C# 中驗證 PDF 數位簽章,請按照以下步驟操作:
首先,將 iTextSharp 程式庫添加到您的專案中。 您可以在 Visual Studio 中使用 NuGet 程式包管理器來完成此操作。 搜尋 iTextSharp 並安裝它。
定義一個函式,使用 iTextSharp 函式庫驗證 PDF 文件的數位簽章。
在函數中,通過傳遞您想要驗證的 PDF 文件的路徑來創建一個 PdfReader
對象。
接下來,使用 PdfReader
物件的 GetAcroFields
方法獲取 PDF 文件的 AcroFields。
使用 AcroFields
對象的 GetSignatureNames
方法獲取簽名名稱。
遍歷簽章名稱,並使用 AcroFields
物件的 GetSignature
方法取得每個簽章的 PdfPKCS7
物件。
使用 PdfPKCS7
物件的 Verify
方法驗證簽名。
如果簽名有效,則返回 true。 否則,返回 false。
以下是使用 iTextSharp 在 C# 中驗證 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),這是一種Copyleft授權條款,要求任何使用iTextSharp的軟體也必須在AGPL下授權。
然而,也有可供 iTextSharp 使用的商業許可證,允許開發人員在專有軟件中使用該庫,而無需公開其源代碼。
iTextSharp 商業授權的定價會根據開發人員數量和部署實例而有所不同。
另一方面,IronPDF 是一個需要付費授權才能使用的商業函式庫。 IronPDF 的定價基於開發人員和部署實例的數量,類似於 iTextSharp。
然而,IronPDF還為用戶提供一個免費試用版具有有限功能,可用於非商業專案。
就定價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提供了一個更現代且直觀的API,可能更容易讓開發人員使用。 此外,IronPDF 提供進階功能,如 HTML 到 PDF 的轉換和 PDF 編輯,這對於某些專案可能很有用。 然而,iTextSharp 提供更高級的功能,例如低層次的 PDF 操作以及對各種 PDF 標準的支持。
IronPDF可供用戶使用於免費試用並且可以授權供商業用途使用,其 Lite 套件起價僅 $749。
最後,IronPDF 提供一項特別促銷活動,開發人員可以以兩款產品的價格購買所有九款 Iron Software 產品. 這可以以實惠的價格為開發人員提供訪問眾多強大的.NET庫的機會。