數位簽署PDF文件

This article was translated from English: Does it need improvement?
Translated
View the article in English

重要說明:簽署 PDF

開發人員經常詢問如何使用 IronPDF 以程式方式向 PDF 文件添加簽名。通常,簽署對不同的開發人員來說意味著不同的事情:

  1. 使用證書數位簽署 PDF 文件以確保其不被篡改。

  2. 將手寫簽名圖片添加到來自圖像文件的現有 PDF。

  3. 要將憑證的圖片蓋章到PDF上。

  4. 在 PDF 中添加簽名表單欄位以便某些觀眾可以提示簽名。

C# NuGet 程式庫用于 PDF

安裝與 NuGet

Install-Package IronPdf
Java PDF JAR

下載 DLL

下載DLL

手動安裝到您的項目中

C# NuGet 程式庫用于 PDF

安裝與 NuGet

Install-Package IronPdf
Java PDF JAR

下載 DLL

下載DLL

手動安裝到您的項目中

立即開始在您的專案中使用IronPDF,並享受免費試用。

第一步:
green arrow pointer

查看 IronPDFNuget 快速安裝和部署。已被下載超過800萬次,它正用C#改變PDF。

C# NuGet 程式庫用于 PDF nuget.org/packages/IronPdf/
Install-Package IronPdf

請考慮安裝 IronPDF DLL 直接下載並手動安裝到您的專案或GAC表單: IronPdf.zip

手動安裝到您的項目中

下載DLL

使用數位證書簽署PDF

IronPDF支援多種方式使用 .pfx.p12 格式的數位簽名證書簽署PDF。在這份使用指南中,將會帶您了解使用數位簽名PDF文件的三種主要方法

簽署方式描述
簽名簽名 a PDF with a Pdf簽名ature object
簽名WithFile簽名 PDF with a digital signature certificate(.pfx or .p12) on disk
簽名WithStore簽名s the PDF with digital signature extracted from your computer's signature storage. 基於指紋 ID

支援的數位簽章憑證檔案

我們正式遵循 X509Certificate2 標準並支援 .pfx.p12 簽章。如果您的簽章無法直接應用於 IronPDF 的簽章方法,您將需要創建一個 X509Certificate2 憑證,其指示可以在找到。 Microsoft文檔.

簽名: 從 X509Certificate2 建立 PdfSignature

IronPDF 的簽名方法將接受 X509Certificate2 對象,其 X509KeyStorageFlags 設置為 Exportable

[{我(

  • IronPDF 只支援 X509KeyStorageFlags.Exportable。某些證書預設會將 KeyStorageFlags 設定為 Exportable。嘗試使用不同的 KeyStorageFlags 將導致例外 => Internal.Cryptography.CryptoThrowHelper.WindowsCryptographicException: '請求的操作不受支援。'

)}]

:path=/static-assets/pdf/content-code-examples/how-to/signing-X509Certificate2-with-privatekey.cs
using IronPdf;
using IronPdf.Signing;
using System.Security.Cryptography.X509Certificates;

ChromePdfRenderer renderer = new ChromePdfRenderer();
PdfDocument pdf = renderer.RenderHtmlAsPdf("<h1>foo</h1>");

// Create X509Certificate2 object with X509KeyStorageFlags set to Exportable
X509Certificate2 cert = new X509Certificate2("IronSoftware.pfx", "123456", X509KeyStorageFlags.Exportable);

// Create PdfSignature object
var sig = new PdfSignature(cert);

// Sign PDF document
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("<h1>foo</h1>")

' Create X509Certificate2 object with X509KeyStorageFlags set to Exportable
Private cert As New X509Certificate2("IronSoftware.pfx", "123456", X509KeyStorageFlags.Exportable)

' Create PdfSignature object
Private sig = New PdfSignature(cert)

' Sign PDF document
pdf.Sign(sig)

pdf.SaveAs("signed.pdf")
VB   C#

簽名:為 PdfSignature 添加更詳細的資訊

在實例化 PdfSignature 或實例化後,可以向 PdfSignature 物件添加有用的資訊,包括日期、簽署聯繫人、地點、簽署原因、時間戳記以及將圖像添加作為 PDF 文件的視覺外觀。

提示
支援需要 SHA256 和 SHA512 的時間戳伺服器

:path=/static-assets/pdf/content-code-examples/how-to/signing-add-granular-information.cs
using IronPdf;
using IronPdf.Signing;
using IronSoftware.Drawing;
using System;

ChromePdfRenderer renderer = new ChromePdfRenderer();
PdfDocument pdf = renderer.RenderHtmlAsPdf("<h1>foo</h1>");

pdf.SaveAs("signed.pdf");

// Create PdfSignature object
var sig = new PdfSignature("IronSoftware.pfx", "123456");

// Add granular information
sig.SignatureDate = new DateTime(2000, 12, 02);
sig.SigningContact = "IronSoftware";
sig.SigningLocation = "Chicago";
sig.SigningReason = "How to guide";
sig.TimestampHashAlgorithm = TimestampHashAlgorithms.SHA256;
sig.TimeStampUrl = "http://timestamp.digicert.com";
sig.SignatureImage = new PdfSignatureImage("IronSoftware.png", 0, new Rectangle(0, 600, 100, 100));

// Sign and save PDF document
sig.SignPdfFile("signed.pdf");
Imports IronPdf
Imports IronPdf.Signing
Imports IronSoftware.Drawing
Imports System

Private renderer As New ChromePdfRenderer()
Private pdf As PdfDocument = renderer.RenderHtmlAsPdf("<h1>foo</h1>")

pdf.SaveAs("signed.pdf")

' Create PdfSignature object
Dim sig = New PdfSignature("IronSoftware.pfx", "123456")

' Add granular information
sig.SignatureDate = New DateTime(2000, 12, 02)
sig.SigningContact = "IronSoftware"
sig.SigningLocation = "Chicago"
sig.SigningReason = "How to guide"
sig.TimestampHashAlgorithm = TimestampHashAlgorithms.SHA256
sig.TimeStampUrl = "http://timestamp.digicert.com"
sig.SignatureImage = New PdfSignatureImage("IronSoftware.png", 0, New Rectangle(0, 600, 100, 100))

' Sign and save PDF document
sig.SignPdfFile("signed.pdf")
VB   C#

演示

查看簽署人詳細資料

您可能會看到感嘆號或警告標誌,而不是勾號。這是因為 Adobe 無法確認文件的真實性和完整性,因為證書不存在。要得到勾號,請將證書添加到 Adobe 並重新打開文件。

不同的添加圖片方式

圖片可透過多種方式包含在內:

  • 設置 SignatureImage 屬性為新的 PdfSignatureImage 對象。
  • 使用 LoadSignatureImageFromFile 方法從文件中載入圖像。LoadSignatureImageFromFile 支持多種圖像格式。
  • 使用 LoadSignatureImageFromStream 方法從流中載入圖像。只要圖像流的格式是 TGA、PBM、TIFF、BMP、GIF、PNG、JPEG、Webp,就可以從其他庫生成圖像流。
:path=/static-assets/pdf/content-code-examples/how-to/signing-add-image.cs
using IronPdf.Signing;
using IronSoftware.Drawing;

// Create PdfSignature object
var sig = new PdfSignature("IronSoftware.pfx", "123456");

// Add image by property
sig.SignatureImage = new PdfSignatureImage("IronSoftware.png", 0, new Rectangle(0, 600, 100, 100));

// Add image by LoadSignatureImageFromFile method
sig.LoadSignatureImageFromFile("IronSoftware.png", 0, new Rectangle(0, 600, 100, 100));

// Import image using IronSoftware.Drawing
AnyBitmap image = AnyBitmap.FromFile("IronSoftware.png");

sig.LoadSignatureImageFromStream(image.ToStream(), 0, new Rectangle(0, 600, 100, 100));
Imports IronPdf.Signing
Imports IronSoftware.Drawing

' Create PdfSignature object
Private sig = New PdfSignature("IronSoftware.pfx", "123456")

' Add image by property
sig.SignatureImage = New PdfSignatureImage("IronSoftware.png", 0, New Rectangle(0, 600, 100, 100))

' Add image by LoadSignatureImageFromFile method
sig.LoadSignatureImageFromFile("IronSoftware.png", 0, New Rectangle(0, 600, 100, 100))

' Import image using IronSoftware.Drawing
Dim image As AnyBitmap = AnyBitmap.FromFile("IronSoftware.png")

sig.LoadSignatureImageFromStream(image.ToStream(), 0, New Rectangle(0, 600, 100, 100))
VB   C#

簽名權限

您可以明確指定證書的條件,以保持其有效性。如果您希望在進行任何變更時使簽名失效,或只允許表單欄位變更等,請參考以下表格查看選項:

PdfDocument.SignaturePermissions定義
不允許更改不允許進行更改
允許填表允許更改表單欄位值
允許填寫和註釋允許更改表單欄位值和修改註釋

此參數是可選的,若未設置它,將應用一個簽名,該簽名證明特定修訂,且無法撤銷。

保存並簽署 PDF 修訂迭代

在以下範例中,我們會打開一個 PDF 檔案,進行各種編輯,然後在保存之前簽署它。對於簽名許可,我們只允許未來的表單填寫編輯,否則簽名將因任何其他編輯而失效。

我們稍後會調用 SaveAsRevision 將修訂保存到歷史記錄,然後將我們的新文件保存到磁碟。

:path=/static-assets/pdf/content-code-examples/how-to/signing-revision.cs
using IronPdf;
using IronPdf.Rendering;

// Import PDF and enable TrackChanges
PdfDocument pdf = PdfDocument.FromFile("annual_census.pdf", TrackChanges: ChangeTrackingModes.EnableChangeTracking);
// ... various edits ...
pdf.SignWithFile("/assets/IronSignature.p12", "password", null, IronPdf.Signing.SignaturePermissions.AdditionalSignaturesAndFormFillingAllowed);

PdfDocument pdfWithRevision = pdf.SaveAsRevision();

pdfWithRevision.SaveAs("annual_census_2.pdf");
Imports IronPdf
Imports IronPdf.Rendering

' Import PDF and enable TrackChanges
Private pdf As PdfDocument = PdfDocument.FromFile("annual_census.pdf", TrackChanges:= ChangeTrackingModes.EnableChangeTracking)
' ... various edits ...
pdf.SignWithFile("/assets/IronSignature.p12", "password", Nothing, IronPdf.Signing.SignaturePermissions.AdditionalSignaturesAndFormFillingAllowed)

Dim pdfWithRevision As PdfDocument = pdf.SaveAsRevision()

pdfWithRevision.SaveAs("annual_census_2.pdf")
VB   C#

理解增量保存簽名

雖然一些瀏覽器如 Chrome 瀏覽器僅顯示一個版本,但 PDF 文件具備儲存先前版本的能力,類似於 Git 提交歷史。在更先進的 PDF 檢視器(如 Adobe Acrobat)中,您將看到這一點。

在處理 PDF 簽名時,了解這一點非常重要,因為簽署 PDF 的動作適用於當前的 PDF 版本。您的 PDF 可能有舊版的簽名,或者有一些未簽名的版本。我們可以可視化一個如下示例:

PDF文件迭代證書A證書 B證書C證書 D
0(第一次保存)
1
2
3
(僅限表單欄位編輯)

(僅限表單欄位編輯)
4(僅編輯過的表單欄位)
5
不能再做任何編輯

不能再做任何編輯

不能再做任何編輯

上方我們有一份經過了6次不同版本的文件。該文件可能會在公司的各個部門之間傳遞並獲得批准,直到第3次版本才最終定稿。在這個版本中,Person A 和 Person B 都在文件上簽了名,並設置了“僅允許編輯表單字段”的權限。這意味著可以在 PDF 文件中填寫表單字段,但對文件的任何其他更改都會使他們的簽名失效。

在上面的例子中,我們可以假設 Person C 填寫了表單並將其反饋給 Person A、B 和 D,他們最終再次簽署了文件,並設置了“禁止編輯”的權限。由於在該文件中沒有進行任何使簽名失效的操作,當我們運行 IronPDF 的簽名方法時,我們會得到 true

回滚到旧版本

要回滚到 PDF 的先前版本,您可以使用 GetRevision 方法。這將忘記從此版本以來所做的任何更改,包括較新的簽名。要執行此操作,請使用:

:path=/static-assets/pdf/content-code-examples/how-to/signing-revert-revision.cs
using IronPdf;

PdfDocument pdf = PdfDocument.FromFile("report.pdf");

int versions = pdf.RevisionCount; // total revisions

PdfDocument rolledBackPdf = pdf.GetRevision(2);
rolledBackPdf.SaveAs("report-draft.pdf");
Imports IronPdf

Private pdf As PdfDocument = PdfDocument.FromFile("report.pdf")

Private versions As Integer = pdf.RevisionCount ' total revisions

Private rolledBackPdf As PdfDocument = pdf.GetRevision(2)
rolledBackPdf.SaveAs("report-draft.pdf")
VB   C#

移除簽名

IronPDF 有一個方法 RemoveSignatures,可以移除 PDF 文件中每個版本的所有簽名。用法如下:

:path=/static-assets/pdf/content-code-examples/how-to/signing-remove-signature.cs
using IronPdf;

PdfDocument pdf = PdfDocument.FromFile("invoice.pdf");
pdf.RemoveSignatures();
Imports IronPdf

Private pdf As PdfDocument = PdfDocument.FromFile("invoice.pdf")
pdf.RemoveSignatures()
VB   C#

驗證 PDF 中的所有簽名

調用 PDF 文件上的驗證簽名方法將檢查所有文件迭代中的所有簽名並驗證它們是否仍然有效。如果它們都有效,這將返回 bool 型的 true 值。

:path=/static-assets/pdf/content-code-examples/how-to/signing-verify-signatures.cs
using IronPdf;

PdfDocument pdf = PdfDocument.FromFile("annual_census.pdf");
bool isValid = pdf.VerifyPdfSignatures();
Imports IronPdf

Private pdf As PdfDocument = PdfDocument.FromFile("annual_census.pdf")
Private isValid As Boolean = pdf.VerifyPdfSignatures()
VB   C#

在 PDF 上添加簽名

首先,我將從我要簽名的 PDF 開始。我會使用這個發票範例:

我們將把一個 .png 圖片格式的手寫簽名應用到我們的 PDF 中。這可能是手寫簽名或用於創建證書文件的圖片。這是我們將使用的樣本簽名:

程式碼

我們將使用以下程式碼將手寫簽名作為浮水印加到 PDF 中:

:path=/static-assets/pdf/content-code-examples/how-to/signing-handwritten.cs
using IronPdf;
using IronPdf.Editing;

var pdf = PdfDocument.FromFile("invoice.pdf");

pdf.ApplyWatermark("<img src='signature.png'/>", 90, VerticalAlignment.Bottom, HorizontalAlignment.Right);

pdf.SaveAs("official_invoice.pdf");
Imports IronPdf
Imports IronPdf.Editing

Private pdf = PdfDocument.FromFile("invoice.pdf")

pdf.ApplyWatermark("<img src='signature.png'/>", 90, VerticalAlignment.Bottom, HorizontalAlignment.Right)

pdf.SaveAs("official_invoice.pdf")
VB   C#

輸出結果

此程式碼執行後,我們會得到這個輸出檔案,並在右下角有我們的簽名:

向 PDF 添加未簽名的簽名欄位

目前尚不支援此功能。您可以在中閱讀更多關於 IronPDF 和它所支援的表單信息 以程式填寫 PDF 表單 (C#) 文章。