フッターコンテンツにスキップ
IRONPDFの使用

ASP.NET CoreでPDF電子署名を追加する方法

ASP.NET Coreで PDF にデジタル署名を追加すると、ドキュメントの整合性が保護され、署名者の ID が確認され、ほとんどの管轄区域でファイルが法的に防御可能になります。 IronPDFを使用すると、数行の C# コードで、証明書ファイルを使用してサーバー側で PDF に署名したり、目に見える署名画像を追加したり、インタラクティブな署名フォーム フィールドを埋め込んだりすることができます。

NuGetからライブラリをインストールし、.pfx 証明書を取得して、以下の例に従って、本番環境で使用可能な文書署名ワークフローを構築してください。

Install-Package IronPdf
dotnet add package IronPdf
Install-Package IronPdf
dotnet add package IronPdf
SHELL

Visual Studio 内のNuGetパッケージ マネージャーを使用してインストールすることも、 IronPDF製品ページから直接ダウンロードすることもできます。 無料トライアルを開始して、すべての署名機能を一切の義務なしにお試しください。

PDF デジタル署名とは何ですか? なぜ重要なのですか?

デジタル署名は、署名者の ID を文書の特定のバージョンに結び付ける暗号化メカニズムです。 これは、公開鍵暗号を使用して検証可能で改ざん防止機能のあるシールを作成するため、入力した名前やスキャンした画像などの単純な電子署名とは異なります。

誰かが PDF にデジタル署名すると、署名ソフトウェアはドキュメントの内容のハッシュを生成し、そのハッシュを署名者の秘密鍵で暗号化します。 生成された署名は、署名者の公開証明書とともに PDF に埋め込まれます。 Adobe Acrobat Reader や最近のブラウザに組み込まれている PDF ビューアなど、デジタル署名をサポートする PDF リーダーであれば、公開キーを使用してハッシュを復号化し、それを文書の新しく計算されたハッシュと比較することができます。 ハッシュが一致する場合、文書は本物であり、変更されていないことになります。

デジタル署名が法的に重要な理由

ほとんどの国では、デジタル署名された文書は手書きの紙の契約書と同じ法的効力を持ちます。 欧州連合のeIDAS 規制と米国のESIGN 法はどちらも、特定の条件が満たされた場合に電子署名を法的拘束力のあるものとして認めています。 証明書ベースのデジタル署名は、これらの要件の最も強力な層を満たします。

ASP.NET Coreにおけるデジタル署名の位置づけ

ASP.NET Coreアプリケーション内のサーバー側署名を使用すると、処理中にドキュメントに自動的に署名できます。クライアント ソフトウェアは必要ありません。 契約書、請求書、コンプライアンス レポート、NDA はすべて生成された瞬間に署名でき、署名されたファイルはユーザーに直接返したり、ドキュメント管理システムに保存したりできます。 IronPDF は、HTML から PDF へのレンダリングから暗号署名までのパイプライン全体を処理するため、低レベルの PDF 仕様の詳細に触れることなくワークフローを実装できます。

ASP.NET CoreプロジェクトにIronPDFをインストールするにはどうすればよいでしょうか?

動作する署名環境への最も速いパスは、 NuGetパッケージです。 Visual StudioでPackage Manager Consoleを開き、実行してください:

Install-Package IronPdf
dotnet add package IronPdf
Install-Package IronPdf
dotnet add package IronPdf
SHELL

または、ソリューションエクスプローラーでプロジェクトを右クリックし、" NuGetパッケージの管理"を選択して、"IronPdf"を検索し、"インストール"をクリックします。 インストール後、コントローラーまたはサービス クラスの先頭に次の using ディレクティブを追加してください。

using IronPdf;
using IronPdf.Signing;
using IronPdf;
using IronPdf.Signing;
Imports IronPdf
Imports IronPdf.Signing
$vbLabelText   $csharpLabel

IronPDF は.NET 8 および.NET 9/10 をターゲットにしているため、最新のASP.NET Coreプロジェクトに自然に適合します。 初回セットアップの詳細な手順については、 IronPDFクイックスタート ガイドを参照してください。

ASP.NET Coreで証明書ファイルを使用して PDF に署名するにはどうすればよいですか?

最も一般的な署名方法は、.pfx または .p12 という証明書ファイルを使用することです。これらのファイルには、秘密鍵と公開証明書チェーン1つのパスワードで保護されたアーカイブにまとめられています。DigiCertやGlobalSignなどの信頼できる認証局(CA)から入手することも、開発やテスト用に自己署名証明書を生成することもできます。

以下の例では、HTML から PDF を生成し、証明書ベースのデジタル署名を適用します。

using IronPdf;
using IronPdf.Signing;
using Microsoft.AspNetCore.Mvc;

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

app.MapPost("/sign-with-certificate", (IWebHostEnvironment env) =>
{
    // Generate a PDF from HTML content
    var renderer = new ChromePdfRenderer();
    var document = renderer.RenderHtmlAsPdf("<h1>Contract Agreement</h1><p>Terms and conditions...</p>");

    // Locate the PFX certificate on the server
    string certPath = Path.Combine(env.ContentRootPath, "Certificates", "certificate.pfx");

    // Build the signature object
    var signature = new PdfSignature(certPath, "yourPassword")
    {
        SigningContact = "legal@yourcompany.com",
        SigningLocation = "Chicago, IL, USA",
        SigningReason = "Document Approval"
    };

    // Apply the signature and save
    document.Sign(signature);
    string outputPath = Path.Combine(Path.GetTempPath(), "signed-contract.pdf");
    document.SaveAs(outputPath);

    return Results.File(outputPath, "application/pdf", "signed-contract.pdf");
});

app.Run();
using IronPdf;
using IronPdf.Signing;
using Microsoft.AspNetCore.Mvc;

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

app.MapPost("/sign-with-certificate", (IWebHostEnvironment env) =>
{
    // Generate a PDF from HTML content
    var renderer = new ChromePdfRenderer();
    var document = renderer.RenderHtmlAsPdf("<h1>Contract Agreement</h1><p>Terms and conditions...</p>");

    // Locate the PFX certificate on the server
    string certPath = Path.Combine(env.ContentRootPath, "Certificates", "certificate.pfx");

    // Build the signature object
    var signature = new PdfSignature(certPath, "yourPassword")
    {
        SigningContact = "legal@yourcompany.com",
        SigningLocation = "Chicago, IL, USA",
        SigningReason = "Document Approval"
    };

    // Apply the signature and save
    document.Sign(signature);
    string outputPath = Path.Combine(Path.GetTempPath(), "signed-contract.pdf");
    document.SaveAs(outputPath);

    return Results.File(outputPath, "application/pdf", "signed-contract.pdf");
});

app.Run();
Imports IronPdf
Imports IronPdf.Signing
Imports Microsoft.AspNetCore.Mvc

Dim builder = WebApplication.CreateBuilder(args)
Dim app = builder.Build()

app.MapPost("/sign-with-certificate", Function(env As IWebHostEnvironment)
    ' Generate a PDF from HTML content
    Dim renderer = New ChromePdfRenderer()
    Dim document = renderer.RenderHtmlAsPdf("<h1>Contract Agreement</h1><p>Terms and conditions...</p>")

    ' Locate the PFX certificate on the server
    Dim certPath As String = Path.Combine(env.ContentRootPath, "Certificates", "certificate.pfx")

    ' Build the signature object
    Dim signature = New PdfSignature(certPath, "yourPassword") With {
        .SigningContact = "legal@yourcompany.com",
        .SigningLocation = "Chicago, IL, USA",
        .SigningReason = "Document Approval"
    }

    ' Apply the signature and save
    document.Sign(signature)
    Dim outputPath As String = Path.Combine(Path.GetTempPath(), "signed-contract.pdf")
    document.SaveAs(outputPath)

    Return Results.File(outputPath, "application/pdf", "signed-contract.pdf")
End Function)

app.Run()
$vbLabelText   $csharpLabel

ChromePdfRenderer は、有効な HTML 文字列または URL を PDF に変換します。 PdfSignature コンストラクタは証明書のパスとパスワードを受け入れ、オプションのプロパティ(SigningReason)は、PDF ビューアが署名パネルに表示するメタデータを追加します。 Sign メソッドは暗号署名を埋め込み、SaveAs は署名されたファイルをディスクに書き込みます。

署名されたファイルをメモリから返す

一時ファイルをディスクに書き込みたくない場合は、PDF を MemoryStream に保存し、コントローラーアクションから直接返します。

var stream = new MemoryStream();
document.SaveAs(stream);
stream.Position = 0;
return Results.File(stream, "application/pdf", "signed-contract.pdf");
var stream = new MemoryStream();
document.SaveAs(stream);
stream.Position = 0;
return Results.File(stream, "application/pdf", "signed-contract.pdf");
Dim stream As New MemoryStream()
document.SaveAs(stream)
stream.Position = 0
Return Results.File(stream, "application/pdf", "signed-contract.pdf")
$vbLabelText   $csharpLabel

このアプローチは、一時ファイルの管理によって不要なオーバーヘッドが追加される高スループット API に適しています。

プロパティの詳細については、 PdfSignature API ドキュメントを参照してください。

PDF に目に見える署名画像を追加するにはどうすればよいですか?

暗号署名はドキュメントの整合性を保護しますが、レンダリングされた PDF では表示されません。 多くのワークフロー、特に契約書や手紙が関係するものでは、スキャンした手書きの署名や会社の印鑑をページに印刷されたものなど、目に見える形で表現する必要もあります。

IronPDF は、LoadSignatureImageFromFile メソッドを通じてこれをサポートしています。 このメソッドは、画像パス、ページインデックス、および可視署名の位置と寸法を定義する IronSoftware.Drawing.Rectangle を受け取ります。

using IronPdf;
using IronPdf.Signing;
using IronSoftware.Drawing;
using Microsoft.AspNetCore.Mvc;

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

app.MapPost("/sign-with-visible-image", (IWebHostEnvironment env) =>
{
    // Load an existing PDF (for example, an invoice template)
    string pdfPath = Path.Combine(env.ContentRootPath, "Documents", "invoice.pdf");
    var document = PdfDocument.FromFile(pdfPath);

    // Paths to the certificate and the signature image
    string certPath = Path.Combine(env.ContentRootPath, "Certificates", "certificate.pfx");
    string imagePath = Path.Combine(env.ContentRootPath, "Images", "signature.png");

    // Define where the visible signature appears (x, y, width, height in points)
    var signatureArea = new Rectangle(50, 680, 200, 80);

    var signature = new PdfSignature(certPath, "yourPassword");
    signature.LoadSignatureImageFromFile(imagePath, pageIndex: 0, signatureArea);

    document.Sign(signature);
    string outputPath = Path.Combine(Path.GetTempPath(), "signed-invoice.pdf");
    document.SaveAs(outputPath);

    return Results.File(outputPath, "application/pdf", "signed-invoice.pdf");
});

app.Run();
using IronPdf;
using IronPdf.Signing;
using IronSoftware.Drawing;
using Microsoft.AspNetCore.Mvc;

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

app.MapPost("/sign-with-visible-image", (IWebHostEnvironment env) =>
{
    // Load an existing PDF (for example, an invoice template)
    string pdfPath = Path.Combine(env.ContentRootPath, "Documents", "invoice.pdf");
    var document = PdfDocument.FromFile(pdfPath);

    // Paths to the certificate and the signature image
    string certPath = Path.Combine(env.ContentRootPath, "Certificates", "certificate.pfx");
    string imagePath = Path.Combine(env.ContentRootPath, "Images", "signature.png");

    // Define where the visible signature appears (x, y, width, height in points)
    var signatureArea = new Rectangle(50, 680, 200, 80);

    var signature = new PdfSignature(certPath, "yourPassword");
    signature.LoadSignatureImageFromFile(imagePath, pageIndex: 0, signatureArea);

    document.Sign(signature);
    string outputPath = Path.Combine(Path.GetTempPath(), "signed-invoice.pdf");
    document.SaveAs(outputPath);

    return Results.File(outputPath, "application/pdf", "signed-invoice.pdf");
});

app.Run();
Imports IronPdf
Imports IronPdf.Signing
Imports IronSoftware.Drawing
Imports Microsoft.AspNetCore.Mvc

Dim builder = WebApplication.CreateBuilder(args)
Dim app = builder.Build()

app.MapPost("/sign-with-visible-image", Function(env As IWebHostEnvironment)
    ' Load an existing PDF (for example, an invoice template)
    Dim pdfPath As String = Path.Combine(env.ContentRootPath, "Documents", "invoice.pdf")
    Dim document = PdfDocument.FromFile(pdfPath)

    ' Paths to the certificate and the signature image
    Dim certPath As String = Path.Combine(env.ContentRootPath, "Certificates", "certificate.pfx")
    Dim imagePath As String = Path.Combine(env.ContentRootPath, "Images", "signature.png")

    ' Define where the visible signature appears (x, y, width, height in points)
    Dim signatureArea As New Rectangle(50, 680, 200, 80)

    Dim signature As New PdfSignature(certPath, "yourPassword")
    signature.LoadSignatureImageFromFile(imagePath, pageIndex:=0, signatureArea)

    document.Sign(signature)
    Dim outputPath As String = Path.Combine(Path.GetTempPath(), "signed-invoice.pdf")
    document.SaveAs(outputPath)

    Return Results.File(outputPath, "application/pdf", "signed-invoice.pdf")
End Function)

app.Run()
$vbLabelText   $csharpLabel

可視署名画像は、指定されたページの指定された座標に合成されます。暗号署名は文書全体に同時に適用されるため、セキュリティと視覚的な確認の両方を1回の操作で実現できます。

画像がメモリ上に存在する場合(たとえば、データベースやクラウドストレージから取得した場合)、代わりに LoadSignatureImageFromStream を使用してください。 ビジュアル署名オプションの詳細については、 PDF 署名ガイドを参照してください。

外部署名者用の署名フォーム フィールドを作成するにはどうすればよいですか?

一部のワークフローでは、ドキュメントはシステムによって作成されますが、顧客、パートナー、または規制機関などの外部の当事者による署名が必要です。 事前に相手から証明書を収集するのではなく、専用の署名フォーム フィールドを PDF に埋め込み、文書を相手に送信します。 受信者は、Adobe Acrobat Reader またはその他の互換性のあるビューアで PDF を開き、署名フィールドをクリックして、独自の証明書または電子署名を適用します。

using IronPdf;
using IronPdf.Forms;

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

app.MapGet("/generate-signable-form", (IWebHostEnvironment env) =>
{
    // Render the document that requires a client signature
    var renderer = new ChromePdfRenderer();
    var pdf = renderer.RenderHtmlAsPdf(@"
        <h1>Client Service Agreement</h1>
        <p>Please review the terms below and sign in the field provided.</p>
        <p>By signing, you confirm acceptance of all listed terms and conditions.</p>
    ");

    // Define the signature field: name, page, x, y, width, height (in points)
    var signatureField = new SignatureFormField(
        "ClientSignature",
        pageIndex: 0,
        x: 50,
        y: 600,
        width: 300,
        height: 100
    );

    pdf.Form.Add(signatureField);

    string outputPath = Path.Combine(Path.GetTempPath(), "client-agreement.pdf");
    pdf.SaveAs(outputPath);

    return Results.File(outputPath, "application/pdf", "client-agreement.pdf");
});

app.Run();
using IronPdf;
using IronPdf.Forms;

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

app.MapGet("/generate-signable-form", (IWebHostEnvironment env) =>
{
    // Render the document that requires a client signature
    var renderer = new ChromePdfRenderer();
    var pdf = renderer.RenderHtmlAsPdf(@"
        <h1>Client Service Agreement</h1>
        <p>Please review the terms below and sign in the field provided.</p>
        <p>By signing, you confirm acceptance of all listed terms and conditions.</p>
    ");

    // Define the signature field: name, page, x, y, width, height (in points)
    var signatureField = new SignatureFormField(
        "ClientSignature",
        pageIndex: 0,
        x: 50,
        y: 600,
        width: 300,
        height: 100
    );

    pdf.Form.Add(signatureField);

    string outputPath = Path.Combine(Path.GetTempPath(), "client-agreement.pdf");
    pdf.SaveAs(outputPath);

    return Results.File(outputPath, "application/pdf", "client-agreement.pdf");
});

app.Run();
Imports IronPdf
Imports IronPdf.Forms
Imports Microsoft.AspNetCore.Builder
Imports Microsoft.AspNetCore.Hosting
Imports Microsoft.Extensions.Hosting

Dim builder = WebApplication.CreateBuilder(args)
Dim app = builder.Build()

app.MapGet("/generate-signable-form", Function(env As IWebHostEnvironment)
    ' Render the document that requires a client signature
    Dim renderer = New ChromePdfRenderer()
    Dim pdf = renderer.RenderHtmlAsPdf("
        <h1>Client Service Agreement</h1>
        <p>Please review the terms below and sign in the field provided.</p>
        <p>By signing, you confirm acceptance of all listed terms and conditions.</p>
    ")

    ' Define the signature field: name, page, x, y, width, height (in points)
    Dim signatureField = New SignatureFormField(
        "ClientSignature",
        pageIndex:=0,
        x:=50,
        y:=600,
        width:=300,
        height:=100
    )

    pdf.Form.Add(signatureField)

    Dim outputPath As String = Path.Combine(Path.GetTempPath(), "client-agreement.pdf")
    pdf.SaveAs(outputPath)

    Return Results.File(outputPath, "application/pdf", "client-agreement.pdf")
End Function)

app.Run()
$vbLabelText   $csharpLabel

SignatureFormField コンストラクタのパラメータは、ページ上のフィールドの位置に直接対応します。 受信者が PDF を開くと、署名を記入する場所が明確に区切られたボックスが表示されます。 完了したフォームはシステムに戻され、そこでロードして埋め込まれた署名を検証し、アーカイブすることができます。

PDF フォームの処理 (送信されたフォーム データの読み取りを含む) の詳細については、 PDF フォーム編集ガイドを参照してください。

デジタル署名をプログラムで検証するにはどうすればよいですか?

文書に署名して返送した後、署名がまだ有効であり、文書が変更されていないことを確認する必要がある場合があります。 IronPDFは、PdfDocumentオブジェクトを介して署名検証を公開します。

using IronPdf;

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

app.MapGet("/verify-signature", (IWebHostEnvironment env) =>
{
    string signedPath = Path.Combine(env.ContentRootPath, "Documents", "signed-contract.pdf");
    var document = PdfDocument.FromFile(signedPath);

    // Retrieve all embedded signatures
    var signatures = document.GetSignatures();

    foreach (var sig in signatures)
    {
        bool isValid = sig.VerifySignature();
        string status = isValid
            ? $"Valid -- signed by {sig.SignerName} on {sig.SigningTime:D}"
            : "INVALID -- document may have been tampered with";

        Console.WriteLine(status);
    }

    return Results.Ok(new { SignatureCount = signatures.Count });
});

app.Run();
using IronPdf;

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

app.MapGet("/verify-signature", (IWebHostEnvironment env) =>
{
    string signedPath = Path.Combine(env.ContentRootPath, "Documents", "signed-contract.pdf");
    var document = PdfDocument.FromFile(signedPath);

    // Retrieve all embedded signatures
    var signatures = document.GetSignatures();

    foreach (var sig in signatures)
    {
        bool isValid = sig.VerifySignature();
        string status = isValid
            ? $"Valid -- signed by {sig.SignerName} on {sig.SigningTime:D}"
            : "INVALID -- document may have been tampered with";

        Console.WriteLine(status);
    }

    return Results.Ok(new { SignatureCount = signatures.Count });
});

app.Run();
Imports IronPdf
Imports Microsoft.AspNetCore.Builder
Imports Microsoft.AspNetCore.Hosting
Imports Microsoft.Extensions.Hosting

Dim builder = WebApplication.CreateBuilder(args)
Dim app = builder.Build()

app.MapGet("/verify-signature", Function(env As IWebHostEnvironment)
                                    Dim signedPath As String = Path.Combine(env.ContentRootPath, "Documents", "signed-contract.pdf")
                                    Dim document = PdfDocument.FromFile(signedPath)

                                    ' Retrieve all embedded signatures
                                    Dim signatures = document.GetSignatures()

                                    For Each sig In signatures
                                        Dim isValid As Boolean = sig.VerifySignature()
                                        Dim status As String = If(isValid,
                                            $"Valid -- signed by {sig.SignerName} on {sig.SigningTime:D}",
                                            "INVALID -- document may have been tampered with")

                                        Console.WriteLine(status)
                                    Next

                                    Return Results.Ok(New With {.SignatureCount = signatures.Count})
                                End Function)

app.Run()
$vbLabelText   $csharpLabel

GetSignatures() は、PDF に埋め込まれたすべてのデジタル署名のリストを返します。 各 PdfDigitalSignature オブジェクトは、VerifySignature()、署名者の名前、署名タイムスタンプ、および証明書チェーンを公開します。 この情報は、署名が破損しているか期限切れである PDF にフラグを立てる監査証跡やドキュメント管理ダッシュボードを構築するのに十分です。

運用環境で証明書管理をどのように処理しますか?

.pfx ファイルをファイルシステムに保存することは開発中は機能しますが、本番環境には適していません。 証明書ファイルには秘密鍵が含まれており、ファイルが侵害されると、その鍵で署名されたすべての文書が危険にさらされます。

Azure Key Vault の使用

Azure Key Vault を使用すると、秘密キーを保管庫から出さずに証明書を保存して使用できます。 .NET SDK は、公開証明書情報をダウンロードする CertificateClient を提供します。 Key Vault 内に秘密キーを保持する実際の署名操作では、 Azure.Security.KeyVault.Keysパッケージを使用してサーバー側で暗号化操作を実行できます。

環境変数とシークレットの使用

小規模なプロジェクトの場合は、証明書を Base64 でエンコードされた文字列として環境変数またはASP.NET Core Secrets Managerに保存し、実行時にデコードします。

string certBase64 = Environment.GetEnvironmentVariable("PDF_SIGNING_CERT")
    ?? throw new InvalidOperationException("PDF_SIGNING_CERT environment variable is not set.");

byte[] certBytes = Convert.FromBase64String(certBase64);
string certPassword = Environment.GetEnvironmentVariable("PDF_SIGNING_CERT_PASSWORD")
    ?? throw new InvalidOperationException("PDF_SIGNING_CERT_PASSWORD environment variable is not set.");

var signature = new PdfSignature(certBytes, certPassword);
string certBase64 = Environment.GetEnvironmentVariable("PDF_SIGNING_CERT")
    ?? throw new InvalidOperationException("PDF_SIGNING_CERT environment variable is not set.");

byte[] certBytes = Convert.FromBase64String(certBase64);
string certPassword = Environment.GetEnvironmentVariable("PDF_SIGNING_CERT_PASSWORD")
    ?? throw new InvalidOperationException("PDF_SIGNING_CERT_PASSWORD environment variable is not set.");

var signature = new PdfSignature(certBytes, certPassword);
Imports System

Dim certBase64 As String = Environment.GetEnvironmentVariable("PDF_SIGNING_CERT")
If certBase64 Is Nothing Then
    Throw New InvalidOperationException("PDF_SIGNING_CERT environment variable is not set.")
End If

Dim certBytes As Byte() = Convert.FromBase64String(certBase64)
Dim certPassword As String = Environment.GetEnvironmentVariable("PDF_SIGNING_CERT_PASSWORD")
If certPassword Is Nothing Then
    Throw New InvalidOperationException("PDF_SIGNING_CERT_PASSWORD environment variable is not set.")
End If

Dim signature = New PdfSignature(certBytes, certPassword)
$vbLabelText   $csharpLabel

このパターンは、資格情報をソース管理から切り離し、環境変数を更新してサービスを再起動するだけでローテーションを簡単に行えるようにします。

複数の PDF に効率的に一括署名するにはどうすればよいでしょうか?

1回の操作で数十または数百の文書に署名する必要がある場合(たとえば、月末に請求書のバッチ全体に署名する場合)、証明書を一度読み込み、PdfSignature オブジェクトをすべての文書で再利用することで、オーバーヘッドを削減できます。

using IronPdf;
using IronPdf.Signing;

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

app.MapPost("/batch-sign", (IWebHostEnvironment env) =>
{
    string certPath = Path.Combine(env.ContentRootPath, "Certificates", "certificate.pfx");
    var signature = new PdfSignature(certPath, "yourPassword")
    {
        SigningReason = "Batch Invoice Approval"
    };

    string[] invoicePaths = Directory.GetFiles(
        Path.Combine(env.ContentRootPath, "Invoices"),
        "*.pdf"
    );

    string outputDir = Path.Combine(env.ContentRootPath, "Signed");
    Directory.CreateDirectory(outputDir);

    foreach (string invoicePath in invoicePaths)
    {
        var doc = PdfDocument.FromFile(invoicePath);
        doc.Sign(signature);
        string outputFile = Path.Combine(outputDir, Path.GetFileName(invoicePath));
        doc.SaveAs(outputFile);
    }

    return Results.Ok(new { SignedCount = invoicePaths.Length });
});

app.Run();
using IronPdf;
using IronPdf.Signing;

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

app.MapPost("/batch-sign", (IWebHostEnvironment env) =>
{
    string certPath = Path.Combine(env.ContentRootPath, "Certificates", "certificate.pfx");
    var signature = new PdfSignature(certPath, "yourPassword")
    {
        SigningReason = "Batch Invoice Approval"
    };

    string[] invoicePaths = Directory.GetFiles(
        Path.Combine(env.ContentRootPath, "Invoices"),
        "*.pdf"
    );

    string outputDir = Path.Combine(env.ContentRootPath, "Signed");
    Directory.CreateDirectory(outputDir);

    foreach (string invoicePath in invoicePaths)
    {
        var doc = PdfDocument.FromFile(invoicePath);
        doc.Sign(signature);
        string outputFile = Path.Combine(outputDir, Path.GetFileName(invoicePath));
        doc.SaveAs(outputFile);
    }

    return Results.Ok(new { SignedCount = invoicePaths.Length });
});

app.Run();
Imports IronPdf
Imports IronPdf.Signing

Dim builder = WebApplication.CreateBuilder(args)
Dim app = builder.Build()

app.MapPost("/batch-sign", Function(env As IWebHostEnvironment)
    Dim certPath As String = Path.Combine(env.ContentRootPath, "Certificates", "certificate.pfx")
    Dim signature As New PdfSignature(certPath, "yourPassword") With {
        .SigningReason = "Batch Invoice Approval"
    }

    Dim invoicePaths As String() = Directory.GetFiles(
        Path.Combine(env.ContentRootPath, "Invoices"),
        "*.pdf"
    )

    Dim outputDir As String = Path.Combine(env.ContentRootPath, "Signed")
    Directory.CreateDirectory(outputDir)

    For Each invoicePath As String In invoicePaths
        Dim doc = PdfDocument.FromFile(invoicePath)
        doc.Sign(signature)
        Dim outputFile As String = Path.Combine(outputDir, Path.GetFileName(invoicePath))
        doc.SaveAs(outputFile)
    Next

    Return Results.Ok(New With {.SignedCount = invoicePaths.Length})
End Function)

app.Run()
$vbLabelText   $csharpLabel

ループの外で PdfSignature オブジェクトを一度作成すると、証明書ファイルは一度だけ読み込まれて解析されます。 各反復では、個別の PDF が読み込まれ、署名され、保存されます。 非常に大きなバッチの場合は、各インスタンスが単一のスレッドに分離されている場合、IronPDF の署名操作はスレッドセーフであるため、ドキュメントを並列処理することを検討してください。

一般的な署名エラーをトラブルシューティングするにはどうすればよいですか?

"証明書が見つかりません"または"パスワードが無効です"

File.Exists(certPath) を使用して証明書のパスを再確認してから、PdfSignature に渡してください。 証明書のパスワードは大文字と小文字が区別され、完全に一致する必要があります。 開発では、単純なパスワードを使用して自己署名証明書を生成するのが一般的です。 本番環境では、パスワードをシークレットとして扱い、シークレット マネージャーから読み込みます。

PDFビューアで"署名が無効です"と表示される

Adobe Acrobat の"無効な署名"警告は、通常、次の 3 つのいずれかを意味します: (1) 証明書がビューアの証明書ストアによって信頼されていない、(2) 文書が署名後に変更された、(3) 署名証明書の有効期限が切れている。 実稼働環境で使用する場合は、信頼できる CA から証明書を取得し、システム クロックが同期されていることを確認します。 開発の場合、Adobe は自己署名証明書を一時的に信頼するための手順を提供します。

Sign() を呼び出した後、"ドキュメントは署名されていません"というメッセージが表示される

document.Sign(signature) を呼び出すと文書が署名対象としてマークされますが、署名が確定するのは SaveAs を呼び出すか、ストリームに保存したときのみです。 Sign の後に save メソッドが呼び出されていることを確認し、出力ファイルのパスが書き込み可能であることを確認してください。

完全な API の詳細とトラブルシューティング リソースについては、 IronPDFドキュメント ハブIronPDFオブジェクト リファレンスをご覧ください。 サポートが必要な場合は、 IronPDFサポート ページからエンジニアリング チームに連絡できます。

次のステップは何ですか?

ASP.NET Coreでのデジタル PDF 署名は、証明書の読み込み、Sign の呼び出し、結果の保存という 3 つのコア操作を理解すれば簡単になります。 IronPDF は暗号化に関する面倒な作業を処理するため、アプリケーションのビジネス ロジックに集中できます。

ドキュメント ワークフローの構築を続けるには、次の関連トピックを参照してください。

IronPDFの無料トライアルから始めて、1時間以内に最初の署名付きPDFを作成しましょう。 ご質問がある場合や特殊なケースに遭遇した場合は、 Iron Softwareサポート チームが、信頼性が高く法的に準拠したドキュメント署名ワークフローの実現をお手伝いします。

よくある質問

.NET Coreのデジタル署名とは何ですか?

.NET Coreのデジタル署名は、PDF文書の真正性と完全性を確認するために使用されるデジタル封蝋のようなものです。文書が法的に有効で、改ざんされていないことを保証します。

IronPDFを使ってPDFドキュメントに電子署名を追加するにはどうすればいいですか?

IronPDFを使用してPDF文書に電子署名を追加することができます。証明書を含め、文書に署名するように設定することで、安全性と検証可能性を確保することができます。

なぜビジネス文書にデジタル署名が重要なのですか?

デジタル署名は、契約書や請求書などの文書が本物であり、変更されていないことを証明するため、ビジネスを潜在的な法的リスクから保護する上で非常に重要です。

IronPDFでPDFにインタラクティブなフォームフィールドを作成できますか?

はい、IronPDFはPDFにインタラクティブなフォームフィールドを作成することができ、ASP.NET Coreアプリケーションでユーザーとのインタラクションを強化し、ドキュメントプロセスを合理化します。

PDF文書に目に見える署名を追加することは可能ですか?

IronPDFを使用すると、PDF文書に目に見える署名を追加することができます。

PDFの電子署名にはどのような種類の証明書を使用できますか?

PDF の電子署名には、必要なセキュリティと信頼のレベルに応じて、自己署名証明書や信頼できる認証局から発行された証明書など、さまざまな種類の証明書を使用することができます。

IronPDFはどのようにしてPDF文書が改ざんされていないことを保証するのですか?

IronPDFは、文書の完全性と真正性を検証するデジタル署名を使用することで、PDF文書が改ざんされていないことを保証し、署名後に変更が加えられた場合は受信者に警告を発します。

.NET Coreアプリケーションでデジタル署名プロセスを自動化できますか?

バッチ処理と既存のワークフローへの統合を可能にするIronPDFを使用して、ASP.NET Coreアプリケーションでデジタル署名プロセスを自動化することができます。

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

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

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

アイアンサポートチーム

私たちは週5日、24時間オンラインで対応しています。
チャット
メール
電話してね