數位簽署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 中添加簽名表單欄位以便某些觀眾可以提示簽名。

    開始使用 IronPDF

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

    第一步:
    green arrow pointer


使用數位證書簽署PDF文件

IronPDF 支援許多使用 .pfx.p12 格式的數字簽章證書來簽署 PDF 的方法。 在此操作指南中,將引導您了解用於數位簽署 PDF 文件的三種主要方法

簽署方式描述
簽名在 PDF 上簽名與 PdfSignature 對象
使用檔案簽名使用磁碟上的數位簽名憑證(.pfx 或 .p12)簽署PDF
使用存儲簽署使用從您電腦的簽名存儲中提取的數位簽名來簽署PDF。 基於指紋 ID

支援的數位簽章證書文件

我們正式遵循 X509Certificate2 標準並支援 .pfx.p12 簽名。 如果您的簽名無法直接應用於 IronPDF 的簽署方法,您將需要創建一個 X509Certificate2 憑證,具體說明可在Microsoft文檔.

標誌:從 X509Certificate2 創建 PdfSignature

IronPDF 的簽署方法將會接受 X509Certificate2 物件,其 X509KeyStorageFlags 設定為 Exportable

[{我(

  • IronPDF 只支持 X509KeyStorageFlags.Exportable。 一些證書的 KeyStorageFlags 預設設定為可匯出。 嘗試使用不同的 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 提交歷史。 您會在例如Adobe Acrobat這樣的進階PDF檢視器中看到這個功能。

處理PDF簽名時,了解這點非常重要,因為簽名PDF的行為適用於PDF的當前迭代。 您的 PDF 可能包含舊版本的簽名,或可能有一些未簽名的版本。 我們可以將範例如下:

PDF文件迭代證書A證書 B證書C證書 D
(第一次保存)

(僅限表單欄位編輯)

(僅限表單欄位編輯)
(僅編輯過的表單欄位)

不能再做任何編輯

不能再做任何編輯

不能再做任何編輯

以上是經過6個不同版本的文件。 這份文件可能正在公司各部門之間流傳,經過批准後在第三次迭代中被最終確定。在此迭代中,甲方和乙方在設置了「僅限表單字段編輯」權限的情況下簽署了該文件。 這意味著允許在PDF文件中填寫表格字段,但對文件的任何其他更改將使其簽名無效。

在上面的範例中,我們可以假設是 C 人填寫了表單,並將其發送回給 A、B 和 D 人,而這些人最後都以「不允許編輯」的權限簽署了文件。 由於此文件中沒有採取任何無效動作,當我們執行IronPDF的簽名方法時,我們將獲得

恢復到舊版本

要回滾到 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文件。 我將使用此示例發票:

我們將在PDF上應用一個以 .png 圖片形式存在的手寫簽名。 这可能是手写签名或用于创建证书文件时使用的图像。这是我们将使用的样本签名:

Signature related to 在 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

若要添加未簽章或空白的簽名表單欄位,首先必須透過實例化簽名物件來創建簽名表單欄位。 接下來,在目標 PDF 文件上,訪問 Form 屬性並將新創建的簽名對象傳遞給 Add 方法。 最後,匯出包含空白簽名表單的 PDF。

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

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

// Configure required parameters
string name = "cert";
uint pageIndex = 0;
double x = 100;
double y = 600;
double width = 300;
double height = 100;

// Create signature
SignatureFormField signature = new SignatureFormField(name, pageIndex, x, y, width, height);

// Add signature
pdf.Form.Add(signature);

pdf.SaveAs("signature.pdf");
Imports IronPdf
Imports IronSoftware.Forms

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

' Configure required parameters
Private name As String = "cert"
Private pageIndex As UInteger = 0
Private x As Double = 100
Private y As Double = 600
Private width As Double = 300
Private height As Double = 100

' Create signature
Private signature As New SignatureFormField(name, pageIndex, x, y, width, height)

' Add signature
pdf.Form.Add(signature)

pdf.SaveAs("signature.pdf")
VB   C#
未簽名的簽章

您可以在以下位置閱讀更多關於IronPDF以及它支援的表單類型的信息:如何建立 PDF 表單文章。