PDF文書にデジタル署名をする

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

重要な注意事項:PDFに署名する

Explanation: When we refer to signing a PDF, it can imply two distinct actions. The first is digitally signing a PDF to assure its authenticity and integrity. The second is adding an image or text signature to a PDF document.

説明:「PDFに署名する」と言う場合、2つの異なる操作を示すことがあります。一つ目は、PDFの信ぴょう性と整合性を保証するためのデジタル署名です。二つ目は、PDF文書に画像またはテキストの署名を追加することです。

開発者は、IronPDFを使用してPDFドキュメントに電子署名をプログラムで追加する方法についてよく質問します。 一般的に、署名は異なる開発者にとって異なる意味を持ちます。

  1. PDF 文書に証明書を使用してデジタル署名を行い、改ざんできないようにすること。

  2. 画像ファイルから既存のPDFにグラフィックの手書き署名画像を追加する。

  3. 証明書の画像をPDFにスタンプする。

  4. 一部のビューアでサインを求める署名フォームフィールドをPDFに追加する。

    IronPDFを始めましょう

    今日から無料トライアルでIronPDFをあなたのプロジェクトで使い始めましょう。

    最初のステップ:
    green arrow pointer


デジタル証明書を使用してPDFに署名する

IronPDFは、.pfxおよび.p12形式のデジタル署名証明書でPDFに署名する多くの方法をサポートしています。 このHow-Toガイドでは、PDF文書に電子署名するために使用される3つの主な方法をすべて説明します:

署名方法 説明
サイン PDFに署名する PdfSignatureオブジェクト
SignWithFile(署名ファイル) ディスク上のデジタル署名証明書(.pfx または .p12)でPDFに署名
SignWithStore (注: 「SignWithStore」は特定のブランド用語であり、日本語に翻訳せずそのまま使用します。) PDFをコンピューターの署名ストレージから抽出されたデジタル署名で署名します。 拇印IDに基づいて

サポートされているデジタル署名証明書ファイル

弊社は公式に X509Certificate2 標準に準拠し、.pfx.p12 署名をサポートします。 もしあなたの署名がIronPDFの署名メソッドで直接適用できない場合は、X509Certificate2証明書を作成する必要があります。マイクロソフトのドキュメント.

署名: X509Certificate2からPdfSignatureを作成

IronPDFの署名メソッドは、X509KeyStorageFlagsExportableに設定されたX509Certificate2オブジェクトを受け入れます。

次の内容にご注意ください。

  • 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 をインスタンス化する際、またはインスタンス化した後に、日付、署名者、場所、署名理由、タイムスタンプ、PDF 文書上の外観としての画像の追加など、有用な情報を PdfSignature オブジェクトに追加することができます。

ヒント
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ブラウザのように、1つのバージョンしか表示しないビューアもありますが、PDFファイルには、Gitのコミット履歴のように、ドキュメントの過去のバージョンを保存する機能があります。 これは、Adobe Acrobatのような高度なPDFビューアで確認できます。

PDF署名を扱う際、これは重要なポイントです。というのも、PDFに署名する行為は現在のPDFバージョンに適用されるからです。 お客様のPDFには、古いバージョンの署名が含まれている場合や、署名されていないバージョンがいくつか含まれている場合があります。 例を以下に示します:

PDFドキュメントの繰り返し 証明書A 証明書 B 証明書C 証明書 D
最初の保存

フィールド編集のみ

フィールド編集のみ
(編集されたフォームフィールドのみ)

(これ以上の編集はできません)

(これ以上の編集はできません)

(これ以上の編集はできません)

上記には、6回の反復を経た文書があります。 この文書は、承認を得て最終的な第3版まで会社の各部署で回覧される場合があります。この版では、Person A と Person B が「フォームフィールドの編集のみ」の権限を設定して文書に署名しました。 この意味は、PDFドキュメントのフォームフィールドの記入が許可されていますが、それ以外の変更を行うと署名が無効になることを意味します。

上記の例では、C#がフォームに必要事項を記入し、A、B、Dに送り返した後、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には、PDFドキュメント内のすべての改訂のすべての署名を削除するRemoveSignaturesメソッドがあります。 使用方法は次の通りです:

: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ドキュメントの署名検証メソッドを呼び出すと、すべてのドキュメントの反復からすべての署名が確認され、すべてがまだ有効であることが検証されます。 これは、すべてが有効である場合に truebool を返します。

: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 に適用します。 これは手書きの署名や証明書ファイルの作成に使用された画像である可能性があります。これが使用するサンプル署名です:

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に未署名の署名フィールドを追加する

これは現在サポートされていません。 IronPDFがサポートするフォームについての詳細は、以下をお読みくださいIronPDF フォームと機能の記事.