このページには自動翻訳されたテキストを含めることができます。

C# と VB.NET で PDF ドキュメントに署名する

デジタル署名は、ユーザーの身元と PDF ドキュメントの内容を認証するために使用されます。署名を使うと、次のことを証明できます。

  • 署名されてから変更されていない。
  • 特定の人物によってデジタル署名されている。

C# と VB.NET で PDF にデジタル署名を追加

PDF ドキュメントに署名する .NET ライブラリ

Docotic.Pdf ライブラリ を使用して、.NET Framework および .NET Core アプリケーションで PDF ドキュメントに署名します。C# .NET PDF ライブラリをダウンロード ページからライブラリと、期間限定の無料ライセンス キーを入手できます。

Docotic.Pdf は、さまざまなダイジェスト アルゴリズム (SHA-1, SHA-256, SHA-384, SHA-512, RIPEMD-160) とさまざまな署名形式 (adbe.pkcs7.detached、または ETSI.CAdES.detached) を使用してデジタル署名を作成できます。また、このライブラリは PDF 署名を検証 することもできます。

C# で PDF ドキュメントにデジタル署名を追加する

有効な認証局 (CA) によって発行されたデジタル PKCS#12 証明書 (.pfx または .p12 ファイル) が、PDF ドキュメントに署名するために必要です。以下は、C# で PDF ドキュメントに署名する方法を示す基本的なサンプルです:

using BitMiracle.Docotic.Pdf;

using var pdf = new PdfDocument("document_to_sign.pdf");
var options = new PdfSigningOptions("your_cert.p12", "your_cert_password")
{
    DigestAlgorithm = PdfDigestAlgorithm.Sha256,
    Format = PdfSignatureFormat.Pkcs7Detached,
    Reason = "Testing digital signatures",
    Location = "My workplace",
    ContactInfo = "support@example.com"
};

pdf.SignAndSave(options, "signed.pdf");

"your_cert.p12" と "your_cert_password" を、独自の .p12 または .pfx 証明書ファイルとパスワードに置き換えてください。GitHub では、完全な PDF ドキュメントに署名する サンプルを C# と VB.NET でダウンロードして試せます。

既に署名済みのドキュメントに署名する必要がある場合があります。または、複数の人が順番にフォームに署名する必要がある場合もあります。これも可能です。手順はほぼ同じです。増分的に署名して保存するようにしてください。許可された変更のみを適用する場合、増分更新によってデジタル署名が無効になることはありません。

これらのケースについては、C# と VB.NET で 既に署名された PDF ドキュメントに署名する複数人で PDF フォームに署名する サンプルがあります。

上記のコードは、PDF ドキュメントに不可視の署名フィールドを暗黙的に追加し、それを署名に使用します。次に、PDF で署名フィールドを追加およびカスタマイズする方法を見ていきます。

手書き署名画像を使って PDF ドキュメントに署名する

デジタル署名に加えて、PDF に手書き署名画像を追加する必要がよくあります。このサンプルは、C# で関連付けられた画像付きのデジタル署名を追加する方法を示します:

using var pdf = new PdfDocument("document_to_sign.pdf");
var options = new PdfSigningOptions("your_cert.p12", "your_cert_password")
{
    DigestAlgorithm = PdfDigestAlgorithm.Sha256,
    Format = PdfSignatureFormat.Pkcs7Detached,
};

PdfSignatureField field = pdf.Pages[0].AddSignatureField(20, 20, 100, 50);
options.Field = field;

PdfImage image = pdf.CreateImage("your_signature.jpg");
options.Appearance.Image = image;
options.Appearance.HideAllText();

pdf.SignAndSave(options, "signed.pdf");

このコードは、署名フィールドを追加し、そのフィールドを署名オプションに関連付け、フィールドの外観をカスタマイズします。署名フィールドでは、テキスト、画像、またはその両方を表示できます。詳細は PdfSignatureAppearanceOptions クラスカスタム スタイルを使用して署名フィールドに署名する サンプルを参照してください。

署名フィールドで PDF フォーム フィールドをロックする

署名フィールドは、署名後に PDF フォーム フィールドをロックするために使用できます。このサンプルは、C# で署名後に特定のフォーム フィールドをロックする方法を示します:

var first = page.AddSignatureField("first", 100, 100, 200, 50);

// 最初のフィールドが署名されると、"some_text_field" と
// "some_checkbox" という名前のフィールドは編集できなくなります
first.Lock = PdfSignatureFieldLock.CreateLockFields("some_text_field", "some_checkbox");

次のコードは、署名後にすべてのフォーム フィールドをロックする方法を示します:

var second = page.AddSignatureField("second", 100, 200, 200, 50);

// 2 番目のフィールドが署名されると、すべてのフィールドは編集できなくなります
second.Lock = PdfSignatureFieldLock.CreateLockAll();

PDF ドキュメント内のすべてのフォーム フィールドを、特定のフィールドを除いてロックすることもできます。そのためには PdfSignatureFieldLock.CreateLockAllExceptFields メソッド を使用します。

GitHub から、完全な ロック付きの署名フィールド サンプルを C# と VB.NET でダウンロードして試せます。

デジタル署名にタイムスタンプを埋め込む

タイムスタンプを埋め込むことで、デジタル署名に追加のセキュリティを加えることができます。これには、署名オプションの 1 つとして Timestamp Authority の URL を指定します。必要に応じて、ユーザー名とパスワードも指定できます。

署名時に、ライブラリは Timestamp Authority からタイムスタンプを取得し、署名に埋め込みます。

互換性のため、タイムスタンプ付き署名では SHA ダイジェスト アルゴリズムのいずれかを使用することを推奨します。

// 次のテスト URL を Timestamp Authority URL に置き換えます
options.Timestamp.AuthorityUrl = new Uri("http://tsa.starfieldtech.com/");

// Timestamp Authority に認証が必要な場合は、ユーザー名とパスワードを指定します
options.Timestamp.Username = null;
options.Timestamp.Password = null;