跳至頁尾內容
使用IRONPDF

如何使用 IronPDF 的 PDF API .NET 解決方案

在ASP.NET Core中將數位簽章新增到PDF可保護文件完整性,確認簽署者身份,並使文件在大多數司法管轄區具有法律效力。 使用IronPDF,您可以在伺服器端使用證書文件簽署PDF,新增可見簽章圖像,並嵌入互動簽章表單字段──所有這些都在幾行C#程式碼中完成。

從NuGet安裝程式庫,獲取您的.pfx證書,然後按照下面的範例構建一個適合生產的文件簽署工作流。

Install-Package IronPdf

您也可以通過Visual Studio中的NuGet Package Manager安裝它,或直接從IronPDF產品頁面下載。 開始免費試用以測試所有簽署功能,無需承諾。

什麼是PDF數位簽章,為什麼這很重要?

數位簽章是一種加密機制,將簽署者的身份與文件的特定版本綁定在一起。 它不同於簡單的電子簽名──例如輸入的名字或掃描的圖片──因為它使用公鑰加密來建立可驗證且防篡改的印記。

當某人數位簽署PDF時,簽署軟體會生成文件內容的雜湊,並用簽署者的私鑰加密該雜湊。 生成的簽章嵌入在PDF中,並附上簽署者的公證書。 任何支持數位簽章的PDF閱讀器──包括Adobe Acrobat Reader和現代瀏覽器內建的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

或者,在Solution Explorer中右鍵點選專案,選擇"管理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?

最常見的簽署方法是使用.p12證書文件。這些文件將私鑰和公證書鏈合併成一個受密碼保護的檔案。您可以從信任的證書授權機構(CA)如DigiCertGlobalSign獲得,或生成自簽名證書以用於開發和測試。

下面的範例從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。 SigningReason)新增PDF查看器在簽名面板中顯示的元資料。 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

可見簽章圖像被合成到您提供的座標上的指定頁面上。加密簽章同時應用於整個文件,因此您可以在一個操作中獲得安全性和視覺確認。

如果圖像位於記憶體中(例如從資料庫或雲端儲存提取),請改用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中的所有數位簽章的列表。 每個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?

當您需要在一次操作中簽署數十或數百個文件時──例如,在月底簽署整批發票──一次載入證書並在所有文件中重用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。 對於非常大的批次,考慮使用PdfDocument實例隔離到單個執行緒時。

如何排除常見的簽署錯誤?

"找不到證書"或"密碼無效"

在將證書路徑傳遞給File.Exists(certPath)仔細檢查。 證書密碼對大小寫敏感,必須完全匹配。 在開發過程中,通常會生成帶有簡單密碼的自簽名證書; 在生產中,將密碼視為秘密,並從機密管理器中載入。

"簽章無效"在PDF查看器中

在Adobe Acrobat中"簽章無效"警告通常意味著三種情況之一:(1)證書不被查看器的證書儲存信任,(2)文件在簽署後被修改,或(3)簽署證書已經過期。 對於生產使用,從信任的CA獲取證書,並確保系統時鐘同步。 對於開發,Adobe提供了暫時信任自簽名證書的指導。

"呼叫Sign()後文件未簽署"

呼叫SaveAs或保存到流時簽章才會完成。 確保您在Sign後呼叫保存方法,並確認輸出文件路徑是可寫的。

如需完整的API詳情和故障排除資源,請存取IronPDF文件中心IronPDF物件參考。 如果您需要支援,IronPDF支援頁面可以讓您與工程團隊聯繫。

您的下一步是什麼?

在了解三個核心操作後,為ASP.NET Core中的數位PDF簽署會變得簡單:載入證書、呼叫Sign,並保存結果。 IronPDF處理加密的繁重工作,因此您可以專注於應用程式的業務邏輯。

要繼續構建您的文件工作流程,請探索這些相關主題:

免費IronPDF試用開始,並在一小時內讓您首個簽署的PDF運行。 如果您有問題或遇到邊界情況,Iron Software支援團隊將隨時為您提供幫助,保證您發送可靠且合法合規的文件簽署工作流程。

常見問題

什麼是ASP.NET Core中的數位簽章?

ASP.NET Core中的數位簽章類似於數位封蠟,用於驗證PDF文件的真偽和完整性。它確保文件具有法律效力且未經篡改。

如何使用IronPDF為PDF文件新增數位簽章?

您可以通過包含證書並設置簽署文件來使用IronPDF為PDF文件新增數位簽章,確保其既安全又可驗證。

為什麼數位簽章對我的商業文件很重要?

數位簽章至關重要,因為它驗證合約或發票等文件的真偽和未變更,從而保護您的業務免受潛在法律風險。

我可以使用IronPDF在PDF中建立互動式表單欄位嗎?

是的,IronPDF允許您在PDF中建立互動式表單欄位,可以提升使用者互動並簡化在ASP.NET Core應用中的文件流程。

是否可以將可見的簽名新增到我的PDF文件中?

是的,使用IronPDF,您可以將可見的簽名新增到您的PDF文件中,使接收方清楚文件已安全簽署並驗證。

在PDF中用於數位簽章的證書型別有哪些?

您可以在PDF中使用多種型別的證書進行數位簽章,包括自簽名證書和由受信任證書頒發機構簽發的證書,具體取決於所需的安全級別和信任度。

IronPDF如何確保PDF文件未被篡改?

IronPDF通過使用驗證文件完整性和真實性的數位簽章,來確保PDF文件未被篡改,如果在簽署後進行了更改,則會提醒接收者。

我可以在ASP.NET Core應用中自動化數位簽署過程嗎?

是的,您可以在ASP.NET Core應用中使用IronPDF自動化數位簽署過程,這允許批量處理並整合到現有的工作流程中。

Curtis Chau
技術作家

Curtis Chau擁有Carleton大學的電腦科學學士學位,專精於前端開發,擁有Node.js、TypeScript、JavaScript和React的專業知識。Curtis熱衷於建立直觀且美觀的使用者介面,喜愛使用現代框架並建立結構良好、視覺吸引力的手冊。

除了開發,Curtis對物聯網(IoT)有濃厚的興趣,探索創新的方法來整合硬體和軟體。在空閒時間,他喜歡玩遊戲和建立Discord機器人,結合他對技術的熱愛與創造力。

Iron 支援團隊

我們線上24小時,每週5天。
聊天
電子郵件
給我打電話