利用C#在PDF文檔中添加電子簽名的實(shí)現(xiàn)流程
引言
電子簽名在文檔合規(guī)性與安全性保障中扮演著重要角色,基于 C# 開發(fā) PDF 電子簽名功能是企業(yè)級文檔處理場景的常見需求。Spire.PDF for .NET 作為國產(chǎn) PDF 處理類庫,無需依賴 Adobe Acrobat 等第三方軟件,即可便捷實(shí)現(xiàn) PDF 電子簽名添加。本文將介紹該類庫的使用方式、PDF 電子簽名的實(shí)現(xiàn)流程、解析關(guān)鍵代碼參數(shù)等。
一、前置準(zhǔn)備
1. 安裝 .NET 庫
通過 NuGet 包管理器快速安裝:
Install-Package Spire.PDF
2. 核心依賴說明
實(shí)現(xiàn)電子簽名需依賴 .pfx 格式的數(shù)字證書(包含私鑰):
- 測試場景:可通過 OpenSSL、Windows 證書管理器生成自簽名證書;
- 生產(chǎn)場景:需使用 CA 機(jī)構(gòu)頒發(fā)的合規(guī)證書(符合《電子簽名法》要求);
- 證書加載:通過
System.Security.Cryptography.X509Certificates.X509Certificate2類解析 .pfx 文件,是本次實(shí)現(xiàn)的核心依賴。
二、核心實(shí)現(xiàn)邏輯
PdfOrdinarySignatureMaker 是 Spire.PDF 中面向普通電子簽名的核心類,其核心流程為:
加載 PDF 文檔 → 解析 X.509 證書→ 初始化簽名器 → 執(zhí)行簽名 → 保存文檔。
以下基于該類實(shí)現(xiàn)基礎(chǔ)簽名功能,并擴(kuò)展添加可見簽名等進(jìn)階示例。
1. 基礎(chǔ)版:添加基礎(chǔ)電子簽名(默認(rèn)不可見)
適用于僅需驗(yàn)簽、無需視覺標(biāo)識的場景,核心代碼附帶詳細(xì)注釋:
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"); // 替換為實(shí)際文件路徑
// 2. 加載數(shù)字證書(指定密鑰存儲策略,適配服務(wù)器/客戶端環(huán)境)
string certPath = "certificate.pfx"; // 替換為證書實(shí)際路徑
string certPassword = "abc123"; // 替換為證書密碼
X509Certificate2 cert = new X509Certificate2(
certPath,
certPassword,
// 關(guān)鍵標(biāo)志:適配服務(wù)器環(huán)境+避免密鑰持久化,提升安全性
X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.EphemeralKeySet
);
// 3. 初始化簽名器并執(zhí)行簽名
PdfOrdinarySignatureMaker signMaker = new PdfOrdinarySignatureMaker(pdfDoc, cert);
// 簽名名稱:用于后續(xù)識別/驗(yàn)證簽名,建議唯一
signMaker.MakeSignature("Basic_Signature_001");
// 4. 保存簽名后的文檔
pdfDoc.SaveToFile("Signed_Basic.pdf");
Console.WriteLine("不可見簽名添加成功!");
}
}
catch (Exception ex)
{
Console.WriteLine($"簽名失?。簕ex.Message}");
// 進(jìn)階:記錄異常詳情(如堆棧)便于排查
Console.WriteLine($"異常詳情:{ex.StackTrace}");
}
}
}
}
2. 進(jìn)階版:添加可見簽名
在基礎(chǔ)簽名上擴(kuò)展視覺標(biāo)識(含簽名圖片、文本信息),適用于需要直觀展示簽名的場景:
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. 加載數(shù)字證書
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"; // 聯(lián)系信息
signature.Location = "中國·北京"; // 簽名地點(diǎn)
signature.Reason = "確認(rèn)文檔內(nèi)容合規(guī)有效";// 簽名原因
// 5. 配置簽名可視化外觀
PdfSignatureAppearance appearance = new PdfSignatureAppearance(signature);
// 自定義標(biāo)簽文本
appearance.NameLabel = "簽名主體:";
appearance.ContactInfoLabel = "聯(lián)系電話:";
appearance.LocationLabel = "簽署地點(diǎn):";
appearance.ReasonLabel = "簽署原因:";
// 添加簽名圖片(支持 PNG/JPG 等格式)
PdfImage signImage = PdfImage.FromFile("signature.png"); // 替換為簽名圖片路徑
appearance.SignatureImage = signImage;
// 布局模式:圖片 + 文本(可選:SignImageOnly/僅圖片;SignDetailOnly/僅文本)
appearance.GraphicMode = GraphicMode.SignImageAndSignDetail;
// 6. 綁定外觀并添加到指定位置
signMaker.SignatureAppearance = appearance;
// 獲取目標(biāo)頁面(示例:最后一頁)
PdfPageBase targetPage = pdfDoc.Pages[pdfDoc.Pages.Count - 1];
// MakeSignature 參數(shù)說明:簽名名稱、目標(biāo)頁面、X坐標(biāo)、Y坐標(biāo)、寬度、高度、外觀
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}");
}
}
}
}
三、關(guān)鍵參數(shù)與類說明
PdfOrdinarySignatureMaker:核心簽名器類,關(guān)聯(lián)PDF文檔與 X.509 證書,執(zhí)行簽名操作。X509Certificate2:加載 .pfx 格式數(shù)字證書,解析私鑰與公鑰。X509KeyStorageFlags:密鑰存儲標(biāo)志,控制證書加載的存儲區(qū)與密鑰生命周期MachineKeySet適配服務(wù)器環(huán)境EphemeralKeySet提升安全性
PdfSignatureAppearance:配置可見簽名的外觀,包括簽名框位置、文本信息等。GraphicMode:可見簽名布局樣式 (參數(shù):SignImageOnly(僅圖片),SignDetailOnly(僅文本),SignImageAndSignDetail(圖片+文本))MakeSignature:執(zhí)行簽名方法。
四、注意事項(xiàng)
- 證書安全:.pfx 證書包含私鑰,需加密存儲,避免硬編碼密碼,建議通過配置文件/密鑰管理服務(wù)管理;
- 權(quán)限適配:服務(wù)器環(huán)境下加載證書需賦予應(yīng)用程序足夠的密鑰訪問權(quán)限,避免
CryptographicException; - 兼容性測試:簽名后的 PDF 需在 Adobe Acrobat、WPS、瀏覽器等主流閱讀器中驗(yàn)證顯示與簽名有效性;
五、總結(jié)
基于 Spire.PDF for .NET 的 C# 實(shí)現(xiàn)方案,以 “輕量化、低門檻、易集成” 為核心優(yōu)勢,僅需數(shù)十行代碼即可完成 PDF 電子簽名的基礎(chǔ)與進(jìn)階功能。該方案適配 .NET Framework/.NET Core/.NET 5+ 全框架,能快速落地到企業(yè)級文檔處理系統(tǒng)中。如需更高的安全性與合規(guī)性,可結(jié)合 CA 證書、時(shí)間戳服務(wù)進(jìn)一步擴(kuò)展。
以上就是利用C#在PDF文檔中添加電子簽名的實(shí)現(xiàn)流程的詳細(xì)內(nèi)容,更多關(guān)于C# PDF文檔添加電子簽名的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C#ComboBox控件“設(shè)置 DataSource 屬性后無法修改項(xiàng)集合”的解決方法
這篇文章主要介紹了C#ComboBox控件“設(shè)置 DataSource 屬性后無法修改項(xiàng)集合”的解決方法 ,需要的朋友可以參考下2019-04-04
C#實(shí)現(xiàn)對二維數(shù)組排序的方法
這篇文章主要介紹了C#實(shí)現(xiàn)對二維數(shù)組排序的方法,實(shí)例分析了C#數(shù)組遍歷與排序的相關(guān)技巧,需要的朋友可以參考下2015-06-06
C#創(chuàng)建及訪問網(wǎng)絡(luò)硬盤的實(shí)現(xiàn)
本文主要介紹了C#創(chuàng)建及訪問網(wǎng)絡(luò)硬盤的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03

