製品比較 C#でItextsharpを使用してPDFにデジタル署名を追加する カーティス・チャウ 更新日:7月 28, 2025 IronPDF をダウンロード NuGet ダウンロード DLL ダウンロード Windows 版 無料トライアル LLM向けのコピー LLM向けのコピー LLM 用の Markdown としてページをコピーする ChatGPTで開く このページについてChatGPTに質問する ジェミニで開く このページについてGeminiに問い合わせる ジェミニで開く このページについてGeminiに問い合わせる 困惑の中で開く このページについてPerplexityに問い合わせる 共有する Facebook で共有 Xでシェア(Twitter) LinkedIn で共有 URLをコピー 記事をメールで送る 今日の急速に進むデジタル世界では、物理的な書類は急速に電子文書に取って代わられています。 契約書の署名、請求書の承認、政府のフォームの提出など、デジタル文書が新しい常態となっています。 しかし、便利さには新たな懸念が伴います。それらのデジタル文書の信頼性と完全性をどのように保証しますか? 電子署名の登場です。 タッチスクリーンへの落書き以上のものであるデジタル署名は、暗号技術を使用して署名者の身元を確認し、文書の内容が改変されていないことを保証します。 C#開発者にとっては、IronPDFやiTextSharpのようなツールでPDFのワークフローにこのレベルのセキュリティを統合することがこれまで以上に簡単になりました。 この記事では、PDFにデジタル署名をする方法を解説し、ライブラリを比較してベストプラクティスを提供し、次のプロジェクトに最適なソリューションを選択する手助けをします。 デジタル署名の理解 デジタル署名は、デジタルメッセージまたは文書の信頼性と完全性を検証するために使用される暗号技術です。 単純なイメージベースの署名や入力文字による署名とは異なり、デジタル署名はプライベートキーを使用して文書のハッシュを暗号化します。 この暗号化されたハッシュは、署名者の公開鍵を使用して誰でも検証できます。 なぜこれは重要でしょうか? それは二つのことを保証します: 認証 – 署名は、所定の送信者から来たことを示すPDF文書の保証に使用されます。 完全性 – 文書は署名されてから改変されていないことを保証します。 わずかな変更でも署名は無効になってしまいます。 デジタル署名は多くの司法管轄区で法的に拘束力があり、金融、医療、法律、政府などの産業で不可欠です。 なぜPDFにデジタル署名を使用するのか? PDFは、法的契約から公式報告書まで、プロフェッショナルな文書を配布する標準的な形式です。 PDFにデジタル署名を追加することは、以下の重要な目的を果たします: 法的性とコンプライアンス: デジタル署名は、eIDAS(ヨーロッパ)やESIGN(米国)などの規制に準拠しており、法的に認められています。 セキュリティ: 署名された文書は、署名を壊さずに変更できず、改ざんや詐欺から保護します。 効率: 印刷や署名、スキャンの必要がありません。 時間を節約し、安全なデジタル承認でワークフローを効率化します。 信頼: クライアントやパートナーは文書の出所と完全性を自信を持って検証できます。 簡単に言えば、デジタル署名はあなたの文書ワークフローに信頼と効率をもたらします。 iTextSharpとIronPDFの比較 C#でデジタル署名を実装する際、二つのライブラリが目立ちます:iTextSharpとIronPDF。 どちらも強力なツールですが、異なる開発者やプロジェクト要件に合わせて対応しています。 実際の使用状況での比較を解説しましょう。 iTextSharp: 複雑さを伴った力 iTextSharpは、PDF操作の世界でよく知られた名前です。 iText 7エコシステムの一部であり、暗号化によるデジタル署名など、低レベルのPDF操作に関する広範なサポートを提供しています。 署名の外観、ハッシュアルゴリズム、証明書チェーン、およびカスタムバリデーションワークフローを詳細に制御する必要がある開発者は、iTextSharpが非常に有能であることがわかるでしょう。 それは非常に拡張可能で、複雑な企業ニーズを念頭にデザインされています。 しかし、その柔軟性には代償があります。学習曲線が急です。可視署名の追加、デフォルトでは複数のクラス、ストリーム、構成ステップが必要になります。 新しいユーザーにとっては、これが圧倒される原因になります。 さらに、iTextSharpはAGPLの下でライセンスされており、商用ライセンスを購入しない限り、あなたのアプリケーションはオープンソースである必要があります。これは、多くのクローズドソースやプロプライエタリープロジェクトにとって致命的な制約となります。 IronPDF: シンプルさとプロフェッショナリズムの融合 IronPDFは、それとは対照的に、現代的で開発者優先のアプローチをとっています。 そのAPIは、デジタル署名、生成、結合、編集といった一般的なPDFタスクを、最小限のセットアップで処理するように設計されており、.NETフレームワークプロジェクトに対する強力なPDFライブラリとなっています。 たとえば、IronPDFでPDFに署名するには、ストリームや暗号設定を直接操作する必要はありません。 単にPDFを読み込み、SignPdf()を呼び出し、証明書を渡すのみです。 署名者の場所、理由、連絡先情報といった追加のメタデータも1つのメソッド呼び出しでサポートされています。 もう一つの重要な利点はライセンスです。 IronPDFはAGPLの制約のない商用に優しいライセンスを提供しており、専門的および企業向けのアプリケーションに理想的です。 そしてこれは有料製品でありながらも、寛大な無料試用版が提供されているため、コミットする前に評価が容易です。 横並びの概要 Feature iTextSharp IronPDF 使いやすさ 学習曲線が急 初心者向け、最小限のコード License AGPL(あるいは有料商業ライセンス) オープンソースの義務のないコマーシャルライセンス 署名カスタマイズ 暗号学的コントロールを活用した高度なカスタマイズ オプションのメタデータフィールドを持つ簡略化されたAPI ドキュメント 詳細だが密集 開発者向けドキュメントにクリアな例が付属 Best For 深いカスタマイズを必要とする企業アプリケーション 迅速な実装とサポートを必要とするチーム iTextSharpとIronPDFの開始方法 デジタル署名の実装に取り掛かる前に、各ライブラリの使い始めとする方法を理解することが重要です。 企業グレードのソリューションを構築するにせよ、簡単な社内ツールを作成するにせよ、適切なセットアップが大きな違いを生み出します。 iTextSharpのセットアップ iTextSharpは、強力なJavaベースのiText PDFライブラリの.NET移植版です。 始めるには、NuGetを介してインストールし、プロジェクト中に正しい名前空間を参照する必要があります。 インストール iTextSharpライブラリをプロジェクトにスムーズにインストールするために、NuGetパッケージマネージャーコンソールを使用して簡単に行えます。 次のコマンドを実行するだけです: Install-Package iTextSharp この簡単なインストールにより、このライブラリをC#プロジェクト内で迅速に実装できます。 基本セットアップ インストール後、iTextSharpの名前空間をプロジェクトで使用し始めることができます: using iTextSharp.text.pdf; using iTextSharp.text.pdf.security; using iTextSharp.text.pdf; using iTextSharp.text.pdf.security; Imports iTextSharp.text.pdf Imports iTextSharp.text.pdf.security $vbLabelText $csharpLabel iTextSharpはモジュール式であることを考慮してください。 高度な暗号機能やタイムスタンピングを使用する予定がある場合、BouncyCastle.Cryptographyのような追加のパッケージが必要になる可能性があります。 これも同様にiTextSharpと同じようにインストールでき、次の行を実行するだけです: Install-Package BouncyCastle.Cryptography 注意すべきこと ライセンス: AGPLライセンスは、iTextSharpを使用するソフトウェアが商業ライセンスを購入しない限りオープンソースであることを必要とします。 依存関係: 暗号プロセスは、証明書処理にBouncyCastleをしばしば必要とします。 学習曲線: 基本的な署名を行うには、PdfSigner、IExternalSignature、およびさまざまな暗号プロバイダーを理解する必要があります。 これらの構成要素を設定し、署名プロセスの全貌(例えば外観の設定、検証レベル、またはタイムスタンピングサーバー)を制御することが快適でなければ、iTextSharpは堅実な選択肢です。 IronPDFのセットアップ IronPDFは、開発者の生産性を念頭に置いて構築された商業的なPDFライブラリです。 これはPDFの生成、編集、署名を簡単にしたい.NET開発者のために設計されています。 IronPDFは、クリーンなAPIと迅速な結果を重視する人々にとって、はるかにスムーズなオンボーディング体験を提供します。 インストール NuGetを通じて最新のIronPDFパッケージをインストールします: Install-Package IronPdf または.NET CLIを使用します: Install-Package IronPdf 基本セットアップ メインのIronPDFの名前空間をインポートすることで始めます: using IronPdf; using IronPdf; Imports 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; Imports System Imports System.IO Imports System.Linq Imports iTextSharp.text.pdf Imports iTextSharp.text.pdf.security Imports Org.BouncyCastle.Crypto Imports 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"; ' Path to the unsigned PDF you want to sign Dim filename As String = "example.pdf" ' Load the existing PDF into a reader Dim pdfReader As New PdfReader(filename) Dim reason As String = "Digital Signature Reason" Dim location As String = "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"; ' Path to your .pfx certificate file (must contain private key) Dim pfxFilePath As String = "certificate-file.pfx" ' Password for the certificate (make sure to protect this securely!) Dim pfxPassword As String = "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()); } ' Initialize a new PKCS#12 key store (used for handling the PFX certificate) Dim pkcs12StoreBuilder As New Pkcs12StoreBuilder() Dim pfxKeyStore As Pkcs12Store = pkcs12StoreBuilder.Build() ' Load the certificate and private key from the PFX file Using pfxStream As New FileStream(pfxFilePath, FileMode.Open, FileAccess.Read) ' Load into the key store using the provided password pfxKeyStore.Load(pfxStream, pfxPassword.ToCharArray()) End Using $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) ); Imports Microsoft.VisualBasic ' Create a PdfStamper that enables signing and appends the signature to the document Dim pdfStamper As PdfStamper = PdfStamper.CreateSignature(pdfReader, New FileStream("MyPDF_Signed.pdf", FileMode.Create), ControlChars.NullChar, Nothing, True) $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 ); ' Access the signature appearance settings Dim signatureAppearance As PdfSignatureAppearance = 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) Dim x As Single = 360 Dim y As Single = 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), 1, "signature") $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."); } ' Find the first alias in the PFX that has a private key entry Dim [alias] As String = pfxKeyStore.Aliases.Cast(Of String)().FirstOrDefault(Function(entryAlias) pfxKeyStore.IsKeyEntry(entryAlias)) ' Ensure a valid alias (certificate) was found If [alias] IsNot Nothing Then ' Retrieve the private key for signing Dim privateKey As ICipherParameters = pfxKeyStore.GetKey([alias]).Key ' Create a signer using SHA-256 and the private key Dim pks As IExternalSignature = New PrivateKeySignature(privateKey, DigestAlgorithms.SHA256) ' Perform the digital signing operation using CMS format MakeSignature.SignDetached(signatureAppearance, pks, New Org.BouncyCastle.X509.X509Certificate() { pfxKeyStore.GetCertificate([alias]).Certificate }, Nothing, Nothing, Nothing, 0, CryptoStandard.CMS) Else Console.WriteLine("Private key not found in the PFX certificate.") End If $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(); ' Close the stamper to save and finalize the signed PDF pdfStamper.Close() $vbLabelText $csharpLabel 出力 ブートストラップセキュリティ構成フォーム プロフェッショナルな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"); IRON VB CONVERTER ERROR developers@ironsoftware.com $vbLabelText $csharpLabel 出力: ブートストラップ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; Imports IronPdf Imports IronPdf.Signing Imports IronSoftware.Drawing Imports System.Security.Cryptography.X509Certificates $vbLabelText $csharpLabel 署名するPDFを読み込む IronPDFのシンプルなPdfDocument APIを使用してディスクから既存のPDFファイルを読み込みます。 このタスクのために新しいPDF文書を作成することもできます。 var pdf = PdfDocument.FromFile("example.pdf"); var pdf = PdfDocument.FromFile("example.pdf"); Dim 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 ); Dim cert As New X509Certificate2("IronSoftware.pfx", "Password", X509KeyStorageFlags.Exportable) $vbLabelText $csharpLabel 証明書を使って新しいPdfSignatureを作成する ロードした証明書から新しいPdfSignatureオブジェクトを作成します。 var sig = new PdfSignature(cert); var sig = new PdfSignature(cert); Dim sig = New PdfSignature(cert) $vbLabelText $csharpLabel 署名を適用して出力を保存する PDFにデジタル署名を適用し、新しいファイルとして署名されたPDF文書を保存します。 pdf.Sign(sig); pdf.SaveAs("signed.pdf"); pdf.Sign(sig); pdf.SaveAs("signed.pdf"); pdf.Sign(sig) pdf.SaveAs("signed.pdf") $vbLabelText $csharpLabel Output 4. コードの説明 IronPDFは、署名プロセスをシンプルで読みやすいものにしています。 PDFを読み込み、証明書を提供し、SignPdf()を呼び出すだけです。 オプションのメタデータ(連絡先、場所、理由)がプロフェッショナルさを添えます。 iTextSharpは、より多くのコントロールを提供しますが、ハッシュアルゴリズム、ストリーム、および証明書チェーンの詳細なセットアップが必要です。 要約:わずかなコード行でIronPDFはデジタル署名を標準の.pfx証明書を使用して非常に簡単に適用できるようにします - 低レベルの暗号化は必要ありません。 これにより、iTextSharpのようなライブラリによって同じタスクを処理するために必要なより長いコードと比較して、実装が容易になります。 5. 実世界での使用例 法律チーム: テンプレートから生成された契約書に自動的に署名します。 金融: 改ざん防止のために請求書やレポートにデジタル署名をします。 政府ポータル: 提出前に規制基準を満たすためにフォームに署名します。 デジタル署名のベストプラクティス デジタル署名実装から最大限の利益を享受するために: 強力な証明書を使用する: 2048ビットのRSAキーまたはそれ以上を選択します。 秘密鍵を安全に保つ: 証明書を安全に保管し、理想的にはハードウェアセキュリティモジュール(HSM)に保管します。 署名にタイムスタンプを追加する: 証明書の期限が切れても署名が有効であることを保証する信頼できるタイムスタンプを追加します。 署名を検証する: 改ざんや期限切れの証明書を検出するために、アプリケーションに検証を含めます。 自動化: 展開パイプラインで署名操作をスケジュールし、文書の整合性を一貫して保つ。 結論 PDF文書にデジタル署名を追加することはもはや贅沢ではなく、今日の安全性を重視するデジタル環境では必要とされています。 契約、請求書、報告書、または法的文書を保護するために、信頼できる証明書で支持された改ざん防止署名を保持することで、ファイルの信頼性と完全性を保証します。 この記事では、C#でのPDF署名に対する二つの強力なアプローチを探りました: 低レベルの暗号化制御と柔軟性を提供しますが、ボイラープレートが多く、BouncyCastleの知識が必要なiTextSharp。 セキュアな署名の適用プロセスをシームレスかつ開発者に優しいモダンで高レベルのAPIを提供するIronPDF。 どちらのツールもセキュアな.pfx証明書をサポートしますが、IronPDFはワークフローを明らかに簡単にし、暗号のプリミティブを扱う時間を減らし、より多くのビジネス価値を提供することに集中したい.NET開発者には理想的です。 次のステップ まだダウンロードしていない場合は、IronPDFの無料トライアルをダウンロードして、わずか数行のコードで自分のPDFに署名してみてください。 生産性の向上だけでも、時間に敏感なプロジェクトで作業する際にはスイッチする価値があります。 BRACKET-i-OPEN--iTextSharpは各所有者の登録商標です。 このサイトはiTextSharpと関係がない、または推奨、スポンサーされていません。すべての製品名、ロゴ、およびブランドは、それぞれの所有者の財産です。 比較は情報提供のみを目的としており、執筆時点で公開されている情報を反映しています。 よくある質問 デジタル署名は、PDFドキュメントの信頼性をどのようにして保証しますか? デジタル署名は、暗号技術を使い署名者の認証および文書の不正改ざん防止を実現します。これにより、文書の信頼性と整合性が確保されます。 電子文書に対してなぜデジタル署名が重要なのですか? デジタル署名は電子文書の信頼性を維持します。規制の遵守、改ざん防止、文書の効率化を促進し、出所と整合性を確認します。 C#でPDFにデジタル署名を追加するにはどうすればよいですか? C#では、IronPDFを使ってPDFにデジタル署名を追加できます。このプロセスには、PDF読み込み、X509Certificate2を用いた.pfx証明書の提供、サインメソッドの呼び出しが含まれます。 デジタル署名のためのiTextSharpと他のPDFライブラリの主な違いは何ですか? iTextSharpは多機能で詳細なPDF操作をサポートし、ライセンスが必要です。一方、IronPDFは使いやすいAPIを提供し、迅速な実装が可能です。 C#で文書に署名するためのPDFライブラリをどのようにインストールしますか? IronPDFはNuGetを通じて、コマンドInstall-Package IronPdfや.NET CLIのdotnet add package IronPdfでインストールできます。 iTextSharpを使用してPDFにデジタル署名をするにはどのステップが必要ですか? iTextSharpで署名するには、PdfStamperの設定、署名のカスタマイズ、BouncyCastleによる.pfx証明書の読み込み、PdfSignerとIExternalSignatureの使用が必要です。 PDFにおけるデジタル署名の実装におけるベストプラクティスは何ですか? 強力な証明書の使用、秘密鍵の保護、タイムスタンプの適用、署名の自動化による文書の信頼性維持が重要です。 PDF文書におけるデジタル署名の現実世界での用途にはどのようなものがありますか? デジタル署名は、契約書や請求書の承認、政府機関での文書処理保証など、さまざまな場面で使用されます。 迅速なデジタル署名の実装を必要とする開発者にとって、どのPDFライブラリが優れていますか? IronPDFが、簡潔で明確なAPIによる簡素化された署名プロセスを提供し、迅速な実装に適しています。 IronPDF は、デジタル署名の追加と検証に関して .NET 10 と互換性がありますか? はい — IronPDF は .NET 10 と互換性があります。デジタル署名機能は .NET 10 ランタイムで使用可能です。 カーティス・チャウ 今すぐエンジニアリングチームとチャット テクニカルライター Curtis Chauは、カールトン大学でコンピュータサイエンスの学士号を取得し、Node.js、TypeScript、JavaScript、およびReactに精通したフロントエンド開発を専門としています。直感的で美しいユーザーインターフェースを作成することに情熱を持ち、Curtisは現代のフレームワークを用いた開発や、構造の良い視覚的に魅力的なマニュアルの作成を楽しんでいます。開発以外にも、CurtisはIoT(Internet of Things)への強い関心を持ち、ハードウェアとソフトウェアの統合方法を模索しています。余暇には、ゲームをしたりDiscordボットを作成したりして、技術に対する愛情と創造性を組み合わせています。 関連する記事 公開日 12月 18, 2025 .NET Core開発で最大の価値を提供するASP PDFライブラリは? ASP.NET Core アプリケーションに最適な PDF ライブラリを発見しよう。IronPDF の Chrome エンジンを Aspose および Syncfusion の代替案と比較します。 詳しく読む 公開日 12月 3, 2025 IronPDF vs iTextSharp PDFドキュメントのヘッダーとフッター付きHTML to PDF PDFにヘッダーとフッターを追加するためのiTextSharpとIronPDFを比較します。コード例、ページ番号、HTMLヘッダーの実装。 詳しく読む 公開日 12月 3, 2025 iTextSharp HTML to PDFの "Document Has No Pages "エラーをIronPDFで解決 iTextSharp HTML to PDFでは、解析に失敗したときにページエラーが発生しません。XMLWorkerが同じ問題を抱えている理由を知り、HTML変換のためのIronPDFの信頼できるソリューションを発見してください。 詳しく読む WindowsでのWkhtmltopdfとIronPDFの比較IronPDFとExpertPDF for .NETの比較
公開日 12月 18, 2025 .NET Core開発で最大の価値を提供するASP PDFライブラリは? ASP.NET Core アプリケーションに最適な PDF ライブラリを発見しよう。IronPDF の Chrome エンジンを Aspose および Syncfusion の代替案と比較します。 詳しく読む
公開日 12月 3, 2025 IronPDF vs iTextSharp PDFドキュメントのヘッダーとフッター付きHTML to PDF PDFにヘッダーとフッターを追加するためのiTextSharpとIronPDFを比較します。コード例、ページ番号、HTMLヘッダーの実装。 詳しく読む
公開日 12月 3, 2025 iTextSharp HTML to PDFの "Document Has No Pages "エラーをIronPDFで解決 iTextSharp HTML to PDFでは、解析に失敗したときにページエラーが発生しません。XMLWorkerが同じ問題を抱えている理由を知り、HTML変換のためのIronPDFの信頼できるソリューションを発見してください。 詳しく読む