博客 / 詳情

返回

通過 C# 為 PDF 文檔添加電子簽名

電子簽名在文檔合規性與安全性保障中扮演着重要角色,基於 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:執行簽名方法。

四、注意事項

  1. 證書安全:.pfx 證書包含私鑰,需加密存儲,避免硬編碼密碼,建議通過配置文件/密鑰管理服務管理;
  2. 權限適配:服務器環境下加載證書需賦予應用程序足夠的密鑰訪問權限,避免 CryptographicException
  3. 兼容性測試:簽名後的 PDF 需在 Adobe Acrobat、WPS、瀏覽器等主流閲讀器中驗證顯示與簽名有效性;

五、總結

基於 Free Spire.PDF for .NET 的 C# 實現方案,以 “輕量化、低門檻、易集成” 為核心優勢,僅需數十行代碼即可完成 PDF 電子簽名的基礎與進階功能。該方案適配 .NET Framework/.NET Core/.NET 5+ 全框架,能快速落地到企業級文檔處理系統中。如需更高的安全性與合規性,可結合 CA 證書、時間戳服務進一步擴展。

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.