電子簽名在文檔合規性與安全性保障中扮演着重要角色,基於 C# 開發 PDF 電子簽名功能是企業級文檔處理場景的常見需求。Free Spire.PDF for .NET 作為免費的 PDF 處理類庫,無需依賴 Adobe Acrobat 等第三方軟件,即可便捷實現 PDF 電子簽名添加。本文將介紹該類庫的使用方式、PDF 電子簽名的實現流程、解析關鍵代碼參數等。
一、前置準備
1. 安裝免費庫
通過 NuGet 包管理器快速安裝:
Install-Package FreeSpire.PDF
2. 核心依賴説明
實現電子簽名需依賴 .pfx 格式的數字證書(包含私鑰):
- 測試場景:可通過 OpenSSL、Windows 證書管理器生成自簽名證書;
- 生產場景:需使用 CA 機構頒發的合規證書(符合《電子簽名法》要求);
- 證書加載:通過
System.Security.Cryptography.X509Certificates.X509Certificate2類解析 .pfx 文件,是本次實現的核心依賴。
二、核心實現邏輯
PdfOrdinarySignatureMaker 是 Free Spire.PDF 中面向普通電子簽名的核心類,其核心流程為:
加載 PDF 文檔 → 解析 X.509 證書→ 初始化簽名器 → 執行簽名 → 保存文檔。
以下基於該類實現基礎簽名功能,並擴展添加可見簽名等進階示例。
1. 基礎版:添加基礎電子簽名(默認不可見)
適用於僅需驗籤、無需視覺標識的場景,核心代碼附帶詳細註釋:
using Spire.Pdf;
using Spire.Pdf.Interactive.DigitalSignatures;
using System;
using System.Security.Cryptography.X509Certificates;
namespace PdfDigitalSignature
{
class BasicSignatureDemo
{
static void Main(string[] args)
{
try
{
// 1. 加載待簽名的 PDF 文檔
using (PdfDocument pdfDoc = new PdfDocument())
{
pdfDoc.LoadFromFile("Input.pdf"); // 替換為實際文件路徑
// 2. 加載數字證書(指定密鑰存儲策略,適配服務器/客户端環境)
string certPath = "certificate.pfx"; // 替換為證書實際路徑
string certPassword = "abc123"; // 替換為證書密碼
X509Certificate2 cert = new X509Certificate2(
certPath,
certPassword,
// 關鍵標誌:適配服務器環境+避免密鑰持久化,提升安全性
X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.EphemeralKeySet
);
// 3. 初始化簽名器並執行簽名
PdfOrdinarySignatureMaker signMaker = new PdfOrdinarySignatureMaker(pdfDoc, cert);
// 簽名名稱:用於後續識別/驗證簽名,建議唯一
signMaker.MakeSignature("Basic_Signature_001");
// 4. 保存簽名後的文檔
pdfDoc.SaveToFile("Signed_Basic.pdf");
Console.WriteLine("不可見簽名添加成功!");
}
}
catch (Exception ex)
{
Console.WriteLine($"簽名失敗:{ex.Message}");
// 進階:記錄異常詳情(如堆棧)便於排查
Console.WriteLine($"異常詳情:{ex.StackTrace}");
}
}
}
}
2. 進階版:添加可見簽名
在基礎簽名上擴展視覺標識(含簽名圖片、文本信息),適用於需要直觀展示簽名的場景:
using Spire.Pdf;
using Spire.Pdf.Interactive.DigitalSignatures;
using System;
using System.Drawing;
using System.Security.Cryptography.X509Certificates;
namespace PdfDigitalSignature
{
class AdvancedSignatureDemo
{
static void Main(string[] args)
{
try
{
// 1. 加載 PDF 文檔(using 自動釋放資源)
using (PdfDocument pdfDoc = new PdfDocument())
{
pdfDoc.LoadFromFile("Input.pdf");
// 2. 加載數字證書
string certPath = "certificate.pfx";
string certPassword = "abc123";
X509Certificate2 cert = new X509Certificate2(
certPath,
certPassword,
X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.EphemeralKeySet
);
// 3. 初始化簽名器
PdfOrdinarySignatureMaker signMaker = new PdfOrdinarySignatureMaker(pdfDoc, cert);
PdfSignature signature = signMaker.Signature;
// 4. 配置簽名元信息(將顯示在簽名外觀中)
signature.Name = "XX科技有限公司"; // 簽名者名稱
signature.ContactInfo = "010-12345678"; // 聯繫信息
signature.Location = "中國·北京"; // 簽名地點
signature.Reason = "確認文檔內容合規有效";// 簽名原因
// 5. 配置簽名可視化外觀
PdfSignatureAppearance appearance = new PdfSignatureAppearance(signature);
// 自定義標籤文本
appearance.NameLabel = "簽名主體:";
appearance.ContactInfoLabel = "聯繫電話:";
appearance.LocationLabel = "簽署地點:";
appearance.ReasonLabel = "簽署原因:";
// 添加簽名圖片(支持 PNG/JPG 等格式)
PdfImage signImage = PdfImage.FromFile("signature.png"); // 替換為簽名圖片路徑
appearance.SignatureImage = signImage;
// 佈局模式:圖片 + 文本(可選:SignImageOnly/僅圖片;SignDetailOnly/僅文本)
appearance.GraphicMode = GraphicMode.SignImageAndSignDetail;
// 6. 綁定外觀並添加到指定位置
signMaker.SignatureAppearance = appearance;
// 獲取目標頁面(示例:最後一頁)
PdfPageBase targetPage = pdfDoc.Pages[pdfDoc.Pages.Count - 1];
// MakeSignature 參數説明:簽名名稱、目標頁面、X座標、Y座標、寬度、高度、外觀
signMaker.MakeSignature("Advanced_Signature_001", targetPage,
54.0f, 330.0f, 280.0f, 90.0f, appearance);
// 7. 保存文檔
pdfDoc.SaveToFile("Signed_Advanced.pdf");
Console.WriteLine("可視化簽名添加成功!");
}
}
catch (Exception ex)
{
Console.WriteLine($"簽名失敗:{ex.Message}");
Console.WriteLine($"異常詳情:{ex.StackTrace}");
}
}
}
}
三、關鍵參數與類説明
PdfOrdinarySignatureMaker:核心簽名器類,關聯PDF文檔與 X.509 證書,執行簽名操作。X509Certificate2:加載 .pfx 格式數字證書,解析私鑰與公鑰。X509KeyStorageFlags:密鑰存儲標誌,控制證書加載的存儲區與密鑰生命週期MachineKeySet適配服務器環境EphemeralKeySet提升安全性
PdfSignatureAppearance:配置可見簽名的外觀,包括簽名框位置、文本信息等。GraphicMode:可見簽名佈局樣式 (參數:SignImageOnly(僅圖片),SignDetailOnly(僅文本),SignImageAndSignDetail(圖片+文本))MakeSignature:執行簽名方法。
四、注意事項
- 證書安全:.pfx 證書包含私鑰,需加密存儲,避免硬編碼密碼,建議通過配置文件/密鑰管理服務管理;
- 權限適配:服務器環境下加載證書需賦予應用程序足夠的密鑰訪問權限,避免
CryptographicException; - 兼容性測試:簽名後的 PDF 需在 Adobe Acrobat、WPS、瀏覽器等主流閲讀器中驗證顯示與簽名有效性;
五、總結
基於 Free Spire.PDF for .NET 的 C# 實現方案,以 “輕量化、低門檻、易集成” 為核心優勢,僅需數十行代碼即可完成 PDF 電子簽名的基礎與進階功能。該方案適配 .NET Framework/.NET Core/.NET 5+ 全框架,能快速落地到企業級文檔處理系統中。如需更高的安全性與合規性,可結合 CA 證書、時間戳服務進一步擴展。