フッターコンテンツにスキップ
製品比較
ITextSharpを使用してC#でPDFにデジタル署名を追加する方法

C#でItextsharpを使用してPDFにデジタル署名を追加する

急速に変化する世界では、物理的な書類は急速に電子文書に置き換えられつつあります。 契約書への署名、請求書の承認、政府フォームの提出など、デジタル文書が標準となっています。 しかし、この利便性は、デジタル文書の真正性と完全性を確保するという新たな課題をもたらします。

電子署名が解決策を提供します。 デジタル署名は、単なるタッチスクリーン上の落書きではなく、暗号化技術を使用して署名者の身元を確認し、文書の内容が変更されていないことを確認します。 C# 開発者にとって、このレベルのセキュリティを PDF ワークフローに統合することが、特にIronPDFiTextSharpなどのツールを使用することで、これまで以上に容易になりました。 この記事では、 PDF にデジタル署名するプロセスを案内し、ライブラリを比較し、ベスト プラクティスを示し、次のプロジェクトに適したソリューションを選択できるようにします。

デジタル署名の理解

デジタル署名は、デジタルメッセージまたは文書の信頼性と完全性を検証するために使用される暗号技術です。 単純なイメージベースの署名や入力文字による署名とは異なり、デジタル署名はプライベートキーを使用して文書のハッシュを暗号化します。 この暗号化されたハッシュは、署名者の公開鍵を使用して誰でも検証できます。

なぜこれが重要なのでしょうか? それは二つのことを保証します:

1.認証– 署名は指定された送信者から送信された PDF ドキュメントを検証します。

  1. 完全性 – 文書は署名されてから改変されていないことを保証します。 わずかな変更でも署名は無効になってしまいます。

デジタル署名は多くの司法管轄区で法的に拘束力があり、金融、医療、法律、政府などの産業で不可欠です。

なぜPDFにデジタル署名を使用するのか?

PDFは、法的契約から公式報告書まで、プロフェッショナルな文書を配布する標準的な形式です。 PDFにデジタル署名を追加することは、以下の重要な目的を果たします:

-合法性とコンプライアンス:デジタル署名は、eIDAS (欧州)、ESIGN (米国) などの規制に準拠しており、法的に認められています。

-セキュリティ:署名を破らない限り、署名された文書を変更することはできないため、改ざんや詐欺から保護されます。

-効率性:印刷、署名、スキャンの必要はありません。 安全なデジタル承認により時間を節約し、ワークフローを簡素化します。

-信頼:クライアントとパートナーは、文書の出所と整合性を自信を持って検証できます。

簡単に言えば、デジタル署名はあなたの文書ワークフローに信頼と効率をもたらします。

iTextSharpとIronPDFの比較

C#でデジタル署名を実装する際、二つのライブラリが目立ちます:iTextSharpIronPDF。 どちらも強力なツールですが、異なる開発者やプロジェクト要件に合わせて対応しています。 実際の使用状況での比較を解説しましょう。

iTextSharp: 複雑さを伴った力

iTextSharpは、PDF操作の世界でよく知られた名前です。 iText 7エコシステムの一部であり、暗号化によるデジタル署名など、低レベルのPDF操作に関する広範なサポートを提供しています。

署名の外観、ハッシュアルゴリズム、証明書チェーン、およびカスタムバリデーションワークフローを詳細に制御する必要がある開発者は、iTextSharpが非常に有能であることがわかるでしょう。 それは非常に拡張可能で、複雑な企業ニーズを念頭にデザインされています。

しかし、その柔軟性には代償があります。学習曲線が急です。可視署名の追加、デフォルトでは複数のクラス、ストリーム、構成ステップが必要になります。 新しいユーザーにとっては、これが圧倒される原因になります。

さらに、iTextSharpはAGPLの下でライセンスされており、商用ライセンスを購入しない限り、あなたのアプリケーションはオープンソースである必要があります。これは、多くのクローズドソースやプロプライエタリープロジェクトにとって致命的な制約となります。

IronPDF: シンプルさとプロフェッショナリズムの融合

IronPDFは、それとは対照的に、現代的で開発者優先のアプローチをとっています。 そのAPIは、デジタル署名、生成、結合、編集といった一般的なPDFタスクを、最小限のセットアップで処理するように設計されており、.NETフレームワークプロジェクトに対する強力なPDFライブラリとなっています。

たとえば、IronPDFでPDFに署名するには、ストリームや暗号設定を直接操作する必要はありません。 単にPDFを読み込み、SignPdf()を呼び出し、証明書を渡すのみです。 署名者の場所、理由、連絡先情報といった追加のメタデータも1つのメソッド呼び出しでサポートされています。

もう一つの重要な利点はライセンスです。 IronPDFはAGPLの制約のない商用に優しいライセンスを提供しており、専門的および企業向けのアプリケーションに理想的です。 そしてこれは有料製品でありながらも、寛大な無料試用版が提供されているため、コミットする前に評価が容易です。

横並びの概要

機能iTextSharpIronPDF
使いやすさ学習曲線が急初心者向け、最小限のコード
ライセンスAGPL(あるいは有料商業ライセンス)オープンソースの義務のないコマーシャルライセンス
署名カスタマイズ暗号学的コントロールを活用した高度なカスタマイズオプションのメタデータフィールドを持つ簡略化されたAPI
ドキュメント詳細だが密集開発者向けドキュメントにクリアな例が付属
最適な用途深いカスタマイズを必要とする企業アプリケーション迅速な実装とサポートを必要とするチーム

iTextSharpとIronPDFの開始方法

デジタル署名の実装に取り掛かる前に、各ライブラリの使い始めとする方法を理解することが重要です。 企業グレードのソリューションを構築するにせよ、簡単な社内ツールを作成するにせよ、適切なセットアップが大きな違いを生み出します。

iTextSharpのセットアップ

iTextSharpは、強力なJavaベースのiText PDFライブラリの.NET移植版です。 始めるには、NuGetを介してインストールし、プロジェクト中に正しい名前空間を参照する必要があります。

インストール

iTextSharpライブラリをプロジェクトにスムーズにインストールするために、NuGetパッケージマネージャーコンソールを使用して簡単に行えます。 次のコマンドを実行するだけです:

Install-Package iTextSharp

iTextSharpのインストール

この簡単なインストールにより、このライブラリをC#プロジェクト内で迅速に実装できます。

基本セットアップ

インストール後、iTextSharpの名前空間をプロジェクトで使用し始めることができます:

using iTextSharp.text.pdf;
using iTextSharp.text.pdf.security;
using iTextSharp.text.pdf;
using iTextSharp.text.pdf.security;
$vbLabelText   $csharpLabel

iTextSharpはモジュール式であることを考慮してください。 高度な暗号機能やタイムスタンピングを使用する予定がある場合、BouncyCastle.Cryptographyのような追加のパッケージが必要になる可能性があります。 これも同様にiTextSharpと同じようにインストールでき、次の行を実行するだけです:

Install-Package BouncyCastle.Cryptography

注意すべきこと

-ライセンス: AGPL ライセンスでは、商用ライセンスを購入しない限り、iTextSharp を使用するソフトウェアはすべてオープンソースである必要があります。

-依存関係:暗号化操作では、多くの場合、証明書の処理にBouncyCastle が必要になります。

-学習曲線:基本的な署名でも、 PdfSignerIExternalSignature 、およびさまざまな暗号化プロバイダーを理解する必要があります。

これらの構成要素を設定し、署名プロセスの全貌(例えば外観の設定、検証レベル、またはタイムスタンピングサーバー)を制御することが快適でなければ、iTextSharpは堅実な選択肢です。

IronPDFのセットアップ

IronPDFは、開発者の生産性を念頭に置いて構築された商業的なPDFライブラリです。 これはPDFの生成、編集、署名を簡単にしたい.NET開発者のために設計されています。 IronPDFは、クリーンなAPIと迅速な結果を重視する人々にとって、はるかにスムーズなオンボーディング体験を提供します。

インストール

NuGetを通じて最新のIronPDFパッケージをインストールします:

Install-Package IronPdf

NuGetコンソールを通じたIronPDFのインストール

または.NET CLIを使用します:

Install-Package IronPdf

基本セットアップ

メインのIronPDFの名前空間をインポートすることで始めます:

using IronPdf;
using IronPdf;
$vbLabelText   $csharpLabel

これで完了です— PDFを読み込んでデジタル署名を開始する準備が整いました。

IronPDFはすべてを内部で管理します:証明書の読み込み、可視署名の位置設定、メタデータ、最終エクスポート。 PDFストリームや暗号化アルゴリズムの手作業による管理は不要であり、迅速な開発において大きな利点です。

初心者に対する主な利点

-オールインワン:追加の依存関係や暗号化ライブラリは必要ありません。

  • AGPL の心配はありません。IronPDFは永続ライセンスと充実した無料トライアルを提供します。

-ビジュアル レンダリング: IronPDF は PDF を印刷したときとまったく同じようにレンダリングするため、契約書や公式文書に最適です。

ステップバイステップ:デジタル署名の追加

1. 証明書を準備する

用意すべきものに、.pfxのデジタル証明書ファイルとパスワードがあります。 これらはデジタル署名を生成するために使用されます。 信頼できる証明書局(CA)から証明書を取得するか、OpenSSLなどのツールを使用して内部で使用するために生成することができます。

2. iTextSharpとBouncyCastleを使ったPDF署名

必要な名前空間を含める

まず、デジタル署名を持つPDFに署名するために必要なさまざまなクラスやメソッドにアクセスするために、コードの上部に適切なusing文を確保する必要があります。

using System;
using System.IO;
using System.Linq;
using iTextSharp.text.pdf;
using iTextSharp.text.pdf.security;
using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Pkcs;
using System;
using System.IO;
using System.Linq;
using iTextSharp.text.pdf;
using iTextSharp.text.pdf.security;
using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Pkcs;
$vbLabelText   $csharpLabel

入力PDFを定義し、PdfReaderにロードする

次に、既存のPDFのパスを指定し、PdfReaderにロードします。 後でコード内で使用される文字列変数も割り当てます。

// Path to the unsigned PDF you want to sign
string filename = "example.pdf";

// Load the existing PDF into a reader
PdfReader pdfReader = new PdfReader(filename);

string reason = "Digital Signature Reason";
string location = "Digital Signature Location";
// Path to the unsigned PDF you want to sign
string filename = "example.pdf";

// Load the existing PDF into a reader
PdfReader pdfReader = new PdfReader(filename);

string reason = "Digital Signature Reason";
string location = "Digital Signature Location";
$vbLabelText   $csharpLabel

証明書パスとパスワードを定義する

次に、.pfx証明書ファイルを指し示し、それを保護するために使用されるパスワードを提供します。

// Path to your .pfx certificate file (must contain private key)
string pfxFilePath = "certificate-file.pfx";

// Password for the certificate (make sure to protect this securely!)
string pfxPassword = "Password";
// Path to your .pfx certificate file (must contain private key)
string pfxFilePath = "certificate-file.pfx";

// Password for the certificate (make sure to protect this securely!)
string pfxPassword = "Password";
$vbLabelText   $csharpLabel

PFX証明書をPkcs12Storeを使ってロードする

BouncyCastleを使用して、証明書と秘密鍵を安全なストアにロードします。

// Initialize a new PKCS#12 key store (used for handling the PFX certificate)
Pkcs12StoreBuilder pkcs12StoreBuilder = new Pkcs12StoreBuilder();
Pkcs12Store pfxKeyStore = pkcs12StoreBuilder.Build();

// Load the certificate and private key from the PFX file
using (FileStream pfxStream = new FileStream(pfxFilePath, FileMode.Open, FileAccess.Read))
{
    // Load into the key store using the provided password
    pfxKeyStore.Load(pfxStream, pfxPassword.ToCharArray());
}
// Initialize a new PKCS#12 key store (used for handling the PFX certificate)
Pkcs12StoreBuilder pkcs12StoreBuilder = new Pkcs12StoreBuilder();
Pkcs12Store pfxKeyStore = pkcs12StoreBuilder.Build();

// Load the certificate and private key from the PFX file
using (FileStream pfxStream = new FileStream(pfxFilePath, FileMode.Open, FileAccess.Read))
{
    // Load into the key store using the provided password
    pfxKeyStore.Load(pfxStream, pfxPassword.ToCharArray());
}
$vbLabelText   $csharpLabel

署名を追加するためにPdfStamperを準備する

PdfStamperを使用することで、元のコンテンツを保持しながらデジタル署名を適用できます。

// Create a PdfStamper that enables signing and appends the signature to the document
PdfStamper pdfStamper = PdfStamper.CreateSignature(
    pdfReader,
    new FileStream("MyPDF_Signed.pdf", FileMode.Create), // Output path
    '\0',                                                // PDF version (unchanged)
    null,                                                // Temp file path (optional)
    true                                                 // Append mode (preserves original content)
);
// Create a PdfStamper that enables signing and appends the signature to the document
PdfStamper pdfStamper = PdfStamper.CreateSignature(
    pdfReader,
    new FileStream("MyPDF_Signed.pdf", FileMode.Create), // Output path
    '\0',                                                // PDF version (unchanged)
    null,                                                // Temp file path (optional)
    true                                                 // Append mode (preserves original content)
);
$vbLabelText   $csharpLabel

署名の外観をカスタマイズする

ここで、文書内での署名の視覚的な表示場所と方法を定義します。

// Access the signature appearance settings
PdfSignatureAppearance signatureAppearance = pdfStamper.SignatureAppearance;

// Add optional metadata (shows up in PDF signature details)
signatureAppearance.Reason = reason;
signatureAppearance.Location = location;

// Position the visible signature on the page (x, y, width, height in points)
float x = 360;
float y = 130;
signatureAppearance.Acro6Layers = false;              // Use compact signature appearance
signatureAppearance.Layer4Text = PdfSignatureAppearance.QuestionMark; // Custom label text
signatureAppearance.SetVisibleSignature(
    new iTextSharp.text.Rectangle(x, y, x + 150, y + 50), // Rectangle position
    1,                                                    // Page number
    "signature"                                           // Field name
);
// Access the signature appearance settings
PdfSignatureAppearance signatureAppearance = pdfStamper.SignatureAppearance;

// Add optional metadata (shows up in PDF signature details)
signatureAppearance.Reason = reason;
signatureAppearance.Location = location;

// Position the visible signature on the page (x, y, width, height in points)
float x = 360;
float y = 130;
signatureAppearance.Acro6Layers = false;              // Use compact signature appearance
signatureAppearance.Layer4Text = PdfSignatureAppearance.QuestionMark; // Custom label text
signatureAppearance.SetVisibleSignature(
    new iTextSharp.text.Rectangle(x, y, x + 150, y + 50), // Rectangle position
    1,                                                    // Page number
    "signature"                                           // Field name
);
$vbLabelText   $csharpLabel

秘密鍵を抽出し、PDFに署名する

秘密鍵を含む証明書エントリのエイリアス(名前)を取得します。 エイリアスが存在する場合、SHA-256を使用してデジタル署名を生成し組み込みます。

// Find the first alias in the PFX that has a private key entry
string alias = pfxKeyStore.Aliases.Cast<string>().FirstOrDefault(
    entryAlias => pfxKeyStore.IsKeyEntry(entryAlias)
);

// Ensure a valid alias (certificate) was found
if (alias != null)
{
    // Retrieve the private key for signing
    ICipherParameters privateKey = pfxKeyStore.GetKey(alias).Key;

    // Create a signer using SHA-256 and the private key
    IExternalSignature pks = new PrivateKeySignature(privateKey, DigestAlgorithms.SHA256);

    // Perform the digital signing operation using CMS format
    MakeSignature.SignDetached(
        signatureAppearance,     // Signature appearance
        pks,                     // External signature handler
        new Org.BouncyCastle.X509.X509Certificate[] {
            pfxKeyStore.GetCertificate(alias).Certificate
        },                       // Certificate chain (basic single-cert example)
        null, null, null,        // Optional CRL, OCSP, TSA
        0,                       // Estimated size for the signature (0 = auto)
        CryptoStandard.CMS       // Signature standard (CMS vs CAdES)
    );
}
else
{
    Console.WriteLine("Private key not found in the PFX certificate.");
}
// Find the first alias in the PFX that has a private key entry
string alias = pfxKeyStore.Aliases.Cast<string>().FirstOrDefault(
    entryAlias => pfxKeyStore.IsKeyEntry(entryAlias)
);

// Ensure a valid alias (certificate) was found
if (alias != null)
{
    // Retrieve the private key for signing
    ICipherParameters privateKey = pfxKeyStore.GetKey(alias).Key;

    // Create a signer using SHA-256 and the private key
    IExternalSignature pks = new PrivateKeySignature(privateKey, DigestAlgorithms.SHA256);

    // Perform the digital signing operation using CMS format
    MakeSignature.SignDetached(
        signatureAppearance,     // Signature appearance
        pks,                     // External signature handler
        new Org.BouncyCastle.X509.X509Certificate[] {
            pfxKeyStore.GetCertificate(alias).Certificate
        },                       // Certificate chain (basic single-cert example)
        null, null, null,        // Optional CRL, OCSP, TSA
        0,                       // Estimated size for the signature (0 = auto)
        CryptoStandard.CMS       // Signature standard (CMS vs CAdES)
    );
}
else
{
    Console.WriteLine("Private key not found in the PFX certificate.");
}
$vbLabelText   $csharpLabel

文書を最終化する

最後に、スタンパーを閉じて、署名のプロセスを完了し、署名されたPDFをディスクに保存します。

// Close the stamper to save and finalize the signed PDF
pdfStamper.Close();
// Close the stamper to save and finalize the signed PDF
pdfStamper.Close();
$vbLabelText   $csharpLabel

出力

iTextSharpを使用したPDF署名

ブートストラップセキュリティ構成フォーム

プロフェッショナルなPDFセキュリティには直観的な構成インターフェースが必要です。 このBootstrap 5の例は、IronPDFが検証状態と進捗追跡を伴う多段階セキュリティ構成フォームをレンダリングする能力を示します。

using IronPdf;

var renderer = new ChromePdfRenderer();

string securityConfigForm = @"
<!DOCTYPE html>
<html>
<head>
    <meta charset='utf-8'>
    <link href='https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css' rel='stylesheet'>
    <style>
        .step-indicator { display: flex; justify-content: space-between; margin-bottom: 30px; }
        .step { flex: 1; text-align: center; position: relative; }
        .step-number { width: 40px; height: 40px; border-radius: 50%; background: #e9ecef;
            display: inline-flex; align-items: center; justify-content: center; font-weight: 700; }
        .step.completed .step-number { background: #198754; color: white; }
        .step.active .step-number { background: #0d6efd; color: white; }
        @media print { .form-section { page-break-inside: avoid; } }
    </style>
</head>
<body class='bg-light'>
    <div class='container py-4'>
        <div class='row justify-content-center'>
            <div class='col-lg-8'>
                <h2 class='text-center mb-4'>PDF Security Configuration</h2>

                <div class='step-indicator mb-4'>
                    <div class='step completed'>
                        <div class='step-number'>✓</div>
                        <div class='small mt-2'>Certificate</div>
                    </div>
                    <div class='step completed'>
                        <div class='step-number'>✓</div>
                        <div class='small mt-2'>Signature</div>
                    </div>
                    <div class='step active'>
                        <div class='step-number'>3</div>
                        <div class='small mt-2'>Encryption</div>
                    </div>
                    <div class='step'>
                        <div class='step-number'>4</div>
                        <div class='small mt-2'>Finalize</div>
                    </div>
                </div>

                <div class='card shadow-sm form-section'>
                    <div class='card-header bg-primary text-white'>
                        <h5 class='mb-0'>Step 3: Encryption & Permissions</h5>
                    </div>
                    <div class='card-body'>
                        <div class='mb-3'>
                            <label class='form-label'><strong>Encryption Level</strong></label>
                            <select class='form-select'>
                                <option>AES 128-bit</option>
                                <option selected>AES 256-bit (Recommended)</option>
                                <option>RC4 128-bit (Legacy)</option>
                            </select>
                            <small class='text-muted'>AES-256 provides enterprise-grade security</small>
                        </div>

                        <div class='mb-3'>
                            <label class='form-label'><strong>Document Permissions</strong></label>
                            <div class='form-check form-switch'>
                                <input class='form-check-input' type='checkbox' id='allowPrint' checked>
                                <label class='form-check-label' for='allowPrint'>Allow Printing</label>
                            </div>
                            <div class='form-check form-switch'>
                                <input class='form-check-input' type='checkbox' id='allowCopy'>
                                <label class='form-check-label' for='allowCopy'>Allow Content Copying</label>
                            </div>
                            <div class='form-check form-switch'>
                                <input class='form-check-input' type='checkbox' id='allowModify'>
                                <label class='form-check-label' for='allowModify'>Allow Document Modification</label>
                            </div>
                            <div class='form-check form-switch'>
                                <input class='form-check-input' type='checkbox' id='allowAnnotate' checked>
                                <label class='form-check-label' for='allowAnnotate'>Allow Annotations</label>
                            </div>
                        </div>

                        <div class='mb-3'>
                            <label class='form-label'><strong>Password Protection</strong></label>
                            <input type='password' class='form-control mb-2' placeholder='Owner Password' value='••••••••'>
                            <input type='password' class='form-control' placeholder='User Password (Optional)'>
                            <small class='text-muted'>Owner password controls document permissions</small>
                        </div>

                        <div class='alert alert-success'>
                            <strong>✓ Configuration Valid</strong><br>
                            <small>Security settings meet compliance requirements</small>
                        </div>
                    </div>
                    <div class='card-footer'>
                        <div class='d-flex justify-content-between'>
                            <button class='btn btn-outline-secondary'>← Previous</button>
                            <button class='btn btn-primary'>Continue →</button>
                        </div>
                    </div>
                </div>

                <div class='card mt-3 shadow-sm'>
                    <div class='card-body'>
                        <h6 class='text-primary'>Security Comparison</h6>
                        <div class='row g-2'>
                            <div class='col-6'>
                                <div class='text-center p-2 bg-success text-white rounded'>
                                    <strong>IronPDF</strong><br>
                                    <small>AES-256 Native</small>
                                </div>
                            </div>
                            <div class='col-6'>
                                <div class='text-center p-2 bg-warning text-dark rounded'>
                                    <strong>iTextSharp</strong><br>
                                    <small>Complex Setup</small>
                                </div>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</body>
</html>";

var pdf = renderer.RenderHtmlAsPdf(securityConfigForm);
pdf.SaveAs("security-configuration.pdf");
using IronPdf;

var renderer = new ChromePdfRenderer();

string securityConfigForm = @"
<!DOCTYPE html>
<html>
<head>
    <meta charset='utf-8'>
    <link href='https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css' rel='stylesheet'>
    <style>
        .step-indicator { display: flex; justify-content: space-between; margin-bottom: 30px; }
        .step { flex: 1; text-align: center; position: relative; }
        .step-number { width: 40px; height: 40px; border-radius: 50%; background: #e9ecef;
            display: inline-flex; align-items: center; justify-content: center; font-weight: 700; }
        .step.completed .step-number { background: #198754; color: white; }
        .step.active .step-number { background: #0d6efd; color: white; }
        @media print { .form-section { page-break-inside: avoid; } }
    </style>
</head>
<body class='bg-light'>
    <div class='container py-4'>
        <div class='row justify-content-center'>
            <div class='col-lg-8'>
                <h2 class='text-center mb-4'>PDF Security Configuration</h2>

                <div class='step-indicator mb-4'>
                    <div class='step completed'>
                        <div class='step-number'>✓</div>
                        <div class='small mt-2'>Certificate</div>
                    </div>
                    <div class='step completed'>
                        <div class='step-number'>✓</div>
                        <div class='small mt-2'>Signature</div>
                    </div>
                    <div class='step active'>
                        <div class='step-number'>3</div>
                        <div class='small mt-2'>Encryption</div>
                    </div>
                    <div class='step'>
                        <div class='step-number'>4</div>
                        <div class='small mt-2'>Finalize</div>
                    </div>
                </div>

                <div class='card shadow-sm form-section'>
                    <div class='card-header bg-primary text-white'>
                        <h5 class='mb-0'>Step 3: Encryption & Permissions</h5>
                    </div>
                    <div class='card-body'>
                        <div class='mb-3'>
                            <label class='form-label'><strong>Encryption Level</strong></label>
                            <select class='form-select'>
                                <option>AES 128-bit</option>
                                <option selected>AES 256-bit (Recommended)</option>
                                <option>RC4 128-bit (Legacy)</option>
                            </select>
                            <small class='text-muted'>AES-256 provides enterprise-grade security</small>
                        </div>

                        <div class='mb-3'>
                            <label class='form-label'><strong>Document Permissions</strong></label>
                            <div class='form-check form-switch'>
                                <input class='form-check-input' type='checkbox' id='allowPrint' checked>
                                <label class='form-check-label' for='allowPrint'>Allow Printing</label>
                            </div>
                            <div class='form-check form-switch'>
                                <input class='form-check-input' type='checkbox' id='allowCopy'>
                                <label class='form-check-label' for='allowCopy'>Allow Content Copying</label>
                            </div>
                            <div class='form-check form-switch'>
                                <input class='form-check-input' type='checkbox' id='allowModify'>
                                <label class='form-check-label' for='allowModify'>Allow Document Modification</label>
                            </div>
                            <div class='form-check form-switch'>
                                <input class='form-check-input' type='checkbox' id='allowAnnotate' checked>
                                <label class='form-check-label' for='allowAnnotate'>Allow Annotations</label>
                            </div>
                        </div>

                        <div class='mb-3'>
                            <label class='form-label'><strong>Password Protection</strong></label>
                            <input type='password' class='form-control mb-2' placeholder='Owner Password' value='••••••••'>
                            <input type='password' class='form-control' placeholder='User Password (Optional)'>
                            <small class='text-muted'>Owner password controls document permissions</small>
                        </div>

                        <div class='alert alert-success'>
                            <strong>✓ Configuration Valid</strong><br>
                            <small>Security settings meet compliance requirements</small>
                        </div>
                    </div>
                    <div class='card-footer'>
                        <div class='d-flex justify-content-between'>
                            <button class='btn btn-outline-secondary'>← Previous</button>
                            <button class='btn btn-primary'>Continue →</button>
                        </div>
                    </div>
                </div>

                <div class='card mt-3 shadow-sm'>
                    <div class='card-body'>
                        <h6 class='text-primary'>Security Comparison</h6>
                        <div class='row g-2'>
                            <div class='col-6'>
                                <div class='text-center p-2 bg-success text-white rounded'>
                                    <strong>IronPDF</strong><br>
                                    <small>AES-256 Native</small>
                                </div>
                            </div>
                            <div class='col-6'>
                                <div class='text-center p-2 bg-warning text-dark rounded'>
                                    <strong>iTextSharp</strong><br>
                                    <small>Complex Setup</small>
                                </div>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</body>
</html>";

var pdf = renderer.RenderHtmlAsPdf(securityConfigForm);
pdf.SaveAs("security-configuration.pdf");
$vbLabelText   $csharpLabel

出力: Bootstrap 5 ステップ インジケーター、フォーム コントロール、スイッチ、検証アラートを備えたプロフェッショナルなセキュリティ構成フォーム PDF。 IronPDFは、フォームスタイリング、ユーティリティクラス、およびインタラクティブな要素を完璧な忠実度でレンダリングし、iTextSharpのプログラマティックなアプローチと比較してデザイン能力を示しています。

Bootstrapフォームサポートの詳細については、Bootstrap & Flexbox CSSガイドをご覧ください。

3. C#でIronPDFを使用してPDFに署名

必要な名前空間を含める

PDF署名、証明書の取り扱い、および画像の配置を行うための必要な名前空間をインポートすることで始めます。

using IronPdf;
using IronPdf.Signing;
using IronSoftware.Drawing;
using System.Security.Cryptography.X509Certificates;
using IronPdf;
using IronPdf.Signing;
using IronSoftware.Drawing;
using System.Security.Cryptography.X509Certificates;
$vbLabelText   $csharpLabel

署名するPDFを読み込む

IronPDFのシンプルなPdfDocument APIを使用してディスクから既存のPDFファイルを読み込みます。 このタスクのために新しいPDF文書を作成することもできます。

var pdf = PdfDocument.FromFile("example.pdf");
var pdf = PdfDocument.FromFile("example.pdf");
$vbLabelText   $csharpLabel

PFX証明書を読み込んで署名に使用する

秘密鍵を含む.pfx証明書をロードします。 エクスポータブルフラグは、署名キーにアクセスできるようにするために必要です。

X509Certificate2 cert = new X509Certificate2(
    "IronSoftware.pfx",
    "Password",
    X509KeyStorageFlags.Exportable
);
X509Certificate2 cert = new X509Certificate2(
    "IronSoftware.pfx",
    "Password",
    X509KeyStorageFlags.Exportable
);
$vbLabelText   $csharpLabel

証明書を使って新しいPdfSignatureを作成する

ロードした証明書から新しいPdfSignatureオブジェクトを作成します。

var sig = new PdfSignature(cert);
var sig = new PdfSignature(cert);
$vbLabelText   $csharpLabel

署名を適用して出力を保存する

PDFにデジタル署名を適用し、新しいファイルとして署名されたPDF文書を保存します。

pdf.Sign(sig);
pdf.SaveAs("signed.pdf");
pdf.Sign(sig);
pdf.SaveAs("signed.pdf");
$vbLabelText   $csharpLabel

出力

IronPDFを使用して署名されたPDF

4. コードの説明

  • IronPDFは、署名プロセスをシンプルで読みやすいものにしています。 PDFを読み込み、証明書を提供し、SignPdf()を呼び出すだけです。 オプションのメタデータ(連絡先、場所、理由)がプロフェッショナルさを添えます。

  • iTextSharpは、より多くのコントロールを提供しますが、ハッシュアルゴリズム、ストリーム、および証明書チェーンの詳細なセットアップが必要です。

要約:わずかなコード行でIronPDFはデジタル署名を標準の.pfx証明書を使用して非常に簡単に適用できるようにします - 低レベルの暗号化は必要ありません。 これにより、iTextSharpのようなライブラリによって同じタスクを処理するために必要なより長いコードと比較して、実装が容易になります。

5. 実世界での使用例

-法務チーム:テンプレートから契約書が生成されると、自動的に署名します。

-財務:請求書やレポートにデジタル署名して改ざんを防止します。

-政府ポータル:規制基準を満たすために、提出前にフォームに署名します。

デジタル署名のベストプラクティス

デジタル署名実装から最大限の利益を享受するために:

-強力な証明書を使用する: 2048 ビット以上の RSA キーを選択します。

-秘密キーを安全に保管する:証明書を安全に保存します。理想的にはハードウェア セキュリティ モジュール (HSM) に保存します。

-署名にタイムスタンプを追加する:信頼できるタイムスタンプを追加して、証明書の有効期限が切れた後でも署名の有効性を維持できるようにします。

-署名の検証:改ざんや期限切れの証明書を検出するために、アプリケーションに検証を組み込みます。

-自動化:ドキュメントの整合性の一貫性を保つために、展開パイプラインで署名操作をスケジュールします。

結論

PDF文書にデジタル署名を追加することはもはや贅沢ではなく、今日の安全性を重視するデジタル環境では必要とされています。 契約、請求書、報告書、または法的文書を保護するために、信頼できる証明書で支持された改ざん防止署名を保持することで、ファイルの信頼性と完全性を保証します。

この記事では、C#でのPDF署名に対する二つの強力なアプローチを探りました:

  • 低レベルの暗号化制御と柔軟性を提供しますが、ボイラープレートが多く、BouncyCastleの知識が必要なiTextSharp

  • IronPDFは、安全な署名を適用するプロセスをスムーズかつ開発者にとって使いやすいものにする最新の高レベル API を提供します。

どちらのツールもセキュアな.pfx証明書をサポートしますが、IronPDFはワークフローを明らかに簡単にし、暗号のプリミティブを扱う時間を減らし、より多くのビジネス価値を提供することに集中したい.NET開発者には理想的です。

iTextSharpとIronPDFの比較チャート

次のステップ

まだダウンロードしていない場合は、IronPDFの無料トライアルをダウンロードして、わずか数行のコードで自分のPDFに署名してみてください。 生産性の向上だけでも、時間に敏感なプロジェクトで作業する際にはスイッチする価値があります。

BRACKET-i-OPEN--iTextSharpは各所有者の登録商標です。 このサイトはiTextSharpと関係がない、または推奨、スポンサーされていません。すべての製品名、ロゴ、およびブランドは、それぞれの所有者の財産です。 比較は情報提供のみを目的としており、執筆時点で公開されている情報を反映しています。

よくある質問

デジタル署名は、PDFドキュメントの信頼性をどのようにして保証しますか?

デジタル署名は、署名者の身元を確認し、文書が改ざんされていないことを保証するために、暗号技術を使用します。これは、文書のハッシュを秘密鍵で暗号化することによって達成され、認証と完全性の両方を提供します。

電子文書に対してなぜデジタル署名が重要なのですか?

デジタル署名は、電子文書の合法性、安全性、効率性、信頼性を維持するために不可欠です。規制の遵守を確保し、改ざんを防ぎ、文書のワークフローを合理化し、文書の出所と完全性を確認します。

C#でPDFにデジタル署名を追加するにはどうすればよいですか?

C#では、IronPDFを使用してPDFにデジタル署名を追加できます。このプロセスは、PDFを読み込み、X509Certificate2を使用して.pfx証明書を提供し、Signメソッドを呼び出して署名を適用することを含みます。

デジタル署名のためのiTextSharpと他のPDFライブラリの主な違いは何ですか?

iTextSharpは、詳細なPDF操作に対する広範なサポートを提供し、学習曲線が急であり特定のライセンスを必要とします。IronPDFは、その一方で、初心者に優しい簡易化されたAPIがあり、すばやい実装を可能にし、オープンソースライセンスを必要としません。

C#で文書に署名するためのPDFライブラリをどのようにインストールしますか?

IronPDFはNuGetを介して、コマンドInstall-Package IronPdfを使用して、または.NET CLIでdotnet add package IronPdfを使用してインストールできます。

iTextSharpを使用してPDFにデジタル署名をするにはどのステップが必要ですか?

iTextSharpでPDFにデジタル署名をするには、PdfStamperを設定し、署名の外観をカスタマイズし、BouncyCastleを使用して.pfx証明書を読み込み、PdfSignerIExternalSignatureを暗号操作のために使用する必要があります。

PDFにおけるデジタル署名の実装におけるベストプラクティスは何ですか?

ベストプラクティスには、強力な証明書の使用、秘密鍵の保護、署名へのタイムスタンプの適用、定期的な署名の確認、署名プロセスの自動化によって文書の完全性を維持することが含まれます。

PDF文書におけるデジタル署名の現実世界での用途にはどのようなものがありますか?

デジタル署名は、契約書の署名のために法務部門で、請求書や報告書の承認のために金融で、そして規制基準に準拠させるために政府機関で処理フォームを保証するために一般的に使用されます。

迅速なデジタル署名の実装を必要とする開発者にとって、どのPDFライブラリが優れていますか?

デジタル署名の迅速な実装を求める開発者には、その簡潔で明確なAPIが署名プロセスを簡素化し、最小限のコードで済むため、IronPDFが推奨されます。

IronPDF は、デジタル署名の追加と検証に関して .NET 10 と互換性がありますか?

はい — IronPDF は .NET 10 と完全に互換性があります。.NET 10 (.NET 9、8、7 などと併せて) をサポートし、デジタル署名機能 (例: PdfSignatureX509Certificate2の使用、署名と検証) は .NET 10 ランタイムですぐに使用できます。

カーティス・チャウ
テクニカルライター

Curtis Chauは、カールトン大学でコンピュータサイエンスの学士号を取得し、Node.js、TypeScript、JavaScript、およびReactに精通したフロントエンド開発を専門としています。直感的で美しいユーザーインターフェースを作成することに情熱を持ち、Curtisは現代のフレームワークを用いた開発や、構造の良い視覚的に魅力的なマニュアルの作成を楽しんでいます。

開発以外にも、CurtisはIoT(Internet of Things)への強い関心を持ち、ハードウェアとソフトウェアの統合方法を模索しています。余暇には、ゲームをしたりDiscordボットを作成したりして、技術に対する愛情と創造性を組み合わせています。