C# 獲取PDF中的數字簽名證書

iceblue發表於2021-11-15

PDF中的加數字簽名是對文件權威性的有效證明。我們在向PDF文件新增簽名時,需要準備可信任的簽名證書。同時,對已有的簽名,可驗證簽名是否有效,也可以獲取文件中的簽名證書資訊。下面,以C#程式碼示例展示如何來獲取PDF中的數字簽名證書資訊。

環境準備

需要在程式中匯入Spire.Pdf.dll。這裡以一個控制檯應用程式為例,引用dll可選擇以下兩種方法中的任意一種即可:

方法1:開啟“解決方案資源管理器”,滑鼠右鍵點選“引用”,“新增引用”:

選擇“瀏覽”,“瀏覽”,並找到本地路徑BIN資料夾下的Spire.Pdf.dll檔案:

 

 

新增到引用列表後,勾選,點選“OK”完成引用:

 

方法2:通過NuGet安裝。

在VS程式中開啟“解決方案資源管理器”,滑鼠右鍵點選“引用”,“管理NuGet包”:

 

點選“搜尋”,在搜尋框中輸入,點選包,安裝:

 

或者通過PM控制檯安裝:

Install-Package Spire.PDF -Version 7.11.1

 

程式碼示例

 實現讀取簽名的證書,本次程式碼主要分為以下步驟:

1. 例項化PdfDocument類的物件,並通過PdfDocument. LoadFromFile(string filename)方法載入PDF文件。

2. 通過PdfFormWidget. FieldsWidget屬性獲取PdfFormFieldWidgetCollection類的域集合

3. 通過for迴圈遍歷所有域,並判斷集合中的域是否為PdfSignatureFieldWidget類的簽名域。

4. 獲取PdfSignatureFieldWidget類的簽名域後,通過其提供的PdfSignatureFieldWidget. Signature.Certificate屬性獲取簽名證書,以及該屬性下列舉的20餘種方法(如下圖)來獲取證書的詳細資訊。

(本次程式碼中僅簡單列舉使用了2種方法獲取證書資訊。)

5. 最後通過控制檯輸出獲取的證書資訊。

C#

using Spire.Pdf;
using Spire.Pdf.Widget;
using System;

namespace GetCertificateInfo
{
    class Program
    {
        static void Main(string[] args)
        {
            //例項化PdfDocument類的物件,並載入PDF文件
            PdfDocument pdf = new PdfDocument();
            pdf.LoadFromFile("test.pdf");

            //獲取域集合
            PdfFormWidget pdfFormWidget = (PdfFormWidget)pdf.Form;
            PdfFormFieldWidgetCollection pdfFormFieldWidgetCollection = pdfFormWidget.FieldsWidget;

            //遍歷域
            for (int i = 0; i < pdfFormFieldWidgetCollection.Count; i++)
            {
                //判定是否為簽名域
                if (pdfFormFieldWidgetCollection[i] is PdfSignatureFieldWidget)
                {
                    //獲取簽名域
                    PdfSignatureFieldWidget signatureFieldWidget = (PdfSignatureFieldWidget)pdfFormFieldWidgetCollection[i];

                    //獲取簽名證書
                    string certificateInfo = signatureFieldWidget.Signature.Certificate.ToString();
                    
                    //獲取證書格式
                    string format = signatureFieldWidget.Signature.Certificate.GetFormat();

                    Console.WriteLine(certificateInfo+ "\n"+ "[CertificateFormat]\n " + format );
                }
            }
            Console.ReadKey();          
        }
    }
}

VB.NET

Imports Spire.Pdf
Imports Spire.Pdf.Widget

Namespace GetCertificateInfo
    Class Program
        Private Shared Sub Main(args As String())
            '例項化PdfDocument類的物件,並載入PDF文件
            Dim pdf As New PdfDocument()
            pdf.LoadFromFile("test.pdf")

            '獲取域集合
            Dim pdfFormWidget As PdfFormWidget = DirectCast(pdf.Form, PdfFormWidget)
            Dim pdfFormFieldWidgetCollection As PdfFormFieldWidgetCollection = pdfFormWidget.FieldsWidget

            '遍歷域
            For i As Integer = 0 To pdfFormFieldWidgetCollection.Count - 1
                '判定是否為簽名域
                If TypeOf pdfFormFieldWidgetCollection(i) Is PdfSignatureFieldWidget Then
                    '獲取簽名域
                    Dim signatureFieldWidget As PdfSignatureFieldWidget = DirectCast(pdfFormFieldWidgetCollection(i), PdfSignatureFieldWidget)

                    '獲取簽名證書
                    Dim certificateInfo As String = signatureFieldWidget.Signature.Certificate.ToString()

                    '獲取證書格式
                    Dim format As String = signatureFieldWidget.Signature.Certificate.GetFormat()

                    Console.WriteLine(Convert.ToString((certificateInfo & Convert.ToString(vbLf)) + "[CertificateFormat]" & vbLf & " ") & format)
                End If
            Next
            Console.ReadKey()
        End Sub
    End Class
End Namespace

讀取結果:

 

 —End—

相關文章