Ir para o conteúdo do rodapé
USANDO O IRONPDF

Como adicionar assinaturas digitais em PDF no ASP.NET Core

Adicionar uma assinatura digital a um PDF no ASP.NET Core protege a integridade do documento, confirma a identidade do signatário e torna o arquivo legalmente defensável na maioria das jurisdições. Com o IronPDF, você pode assinar PDFs no servidor usando arquivos de certificado, adicionar imagens de assinatura visíveis e incorporar campos de formulário de assinatura interativos — tudo com apenas algumas linhas de código C#.

Instale a biblioteca a partir do NuGet, pegue seu .pfx certificado, e siga os exemplos abaixo para construir um fluxo de trabalho de assinatura de documentos pronto para produção.

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

Você também pode instalá-lo através do Gerenciador de Pacotes NuGet dentro do Visual Studio ou baixá-lo diretamente da página do produto IronPDF . Inicie uma avaliação gratuita para testar todos os recursos de assinatura sem compromisso.

O que é uma assinatura digital em PDF e por que ela é importante?

Uma assinatura digital é um mecanismo criptográfico que vincula a identidade do signatário a uma versão específica de um documento. Diferencia-se de uma simples assinatura eletrônica — como um nome digitado ou uma imagem digitalizada — porque utiliza criptografia de chave pública para criar um selo verificável e inviolável.

Quando alguém assina digitalmente um PDF, o software de assinatura gera um hash do conteúdo do documento e criptografa esse hash com a chave privada do signatário. A assinatura resultante é incorporada ao PDF juntamente com o certificado público do signatário. Qualquer leitor de PDF que suporte assinaturas digitais — incluindo o Adobe Acrobat Reader e os visualizadores de PDF integrados em navegadores modernos — pode descriptografar o hash com a chave pública e compará-lo com um hash recém-calculado do documento. Se os hashes coincidirem, o documento é autêntico e não foi modificado.

Na maioria dos países, documentos assinados digitalmente têm o mesmo peso legal que contratos em papel assinados à mão. O regulamento eIDAS na União Europeia e a Lei ESIGN nos Estados Unidos reconhecem as assinaturas eletrônicas como juridicamente vinculativas quando determinadas condições são atendidas. As assinaturas digitais baseadas em certificados atendem ao nível mais rigoroso desses requisitos.

Onde as assinaturas digitais se encaixam no ASP.NET Core

A assinatura no servidor, dentro de uma aplicação ASP.NET Core, permite assinar documentos automaticamente durante o processamento — nenhum software cliente é necessário. Contratos, faturas, relatórios de conformidade e acordos de confidencialidade podem ser assinados no momento em que são gerados, e o arquivo assinado pode ser devolvido diretamente ao usuário ou armazenado em um sistema de gerenciamento de documentos. O IronPDF gerencia todo o processo, desde a renderização de HTML para PDF até a assinatura criptográfica, permitindo que você implemente o fluxo de trabalho sem precisar se preocupar com detalhes de baixo nível das especificações do PDF.

Como instalar o IronPDF em um projeto ASP.NET Core ?

O caminho mais rápido para um ambiente de assinatura funcional é o pacote NuGet . Abra o Console do Gerenciador de Pacotes no Visual Studio e execute:

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

Alternativamente, clique com o botão direito no projeto no Solution Explorer, escolha "Manage NuGet Packages," procure por IronPdf, e clique em Install. Após a instalação, adicione as seguintes diretivas using no topo da sua classe de controlador ou serviço:

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

O IronPDF é compatível com .NET 8 e .NET 9/10, integrando-se naturalmente a projetos ASP.NET Core modernos. Para obter instruções detalhadas sobre a configuração inicial, consulte o guia de início rápido do IronPDF .

Como assinar um PDF com um arquivo de certificado no ASP.NET Core?

A abordagem de assinatura mais comum usa um arquivo de certificado .pfx ou .p12. Esses arquivos combinam a chave privada e a cadeia de certificados públicos em um único arquivo protegido por senha. Você pode obter um de uma autoridade certificadora (CA) confiável, como DigiCert ou GlobalSign, ou gerar um certificado auto-assinado para desenvolvimento e teste.

O exemplo abaixo gera um PDF a partir de HTML e aplica uma assinatura digital baseada em certificado:

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 converte qualquer string HTML ou URL válida em um PDF. O construtor PdfSignature aceita o caminho do certificado e a senha, e as propriedades opcionais (SigningContact, SigningLocation, SigningReason) adicionam metadados que os visualizadores de PDF exibem no painel de assinatura. O método Sign incorpora a assinatura criptográfica, e SaveAs grava o arquivo assinado no disco.

Recuperando o arquivo assinado da memória

Quando você não quer escrever um arquivo temporário no disco, salve o PDF para um MemoryStream e retorne-o diretamente da ação do controlador:

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

Essa abordagem é adequada para APIs de alto desempenho, onde o gerenciamento de arquivos temporários adicionaria uma sobrecarga desnecessária.

Para uma referência completa de propriedades, veja a documentação da API PdfSignature.

Como adicionar uma imagem de assinatura visível a um PDF?

As assinaturas criptográficas protegem a integridade do documento, mas são invisíveis no PDF renderizado. Muitos fluxos de trabalho — especialmente aqueles que envolvem contratos ou cartas — também exigem uma representação visual, como uma assinatura manuscrita digitalizada ou um carimbo da empresa impresso na página.

IronPDF suporta isso através do método LoadSignatureImageFromFile. O método aceita um caminho de imagem, um índice de página, e um IronSoftware.Drawing.Rectangle que define a posição e as dimensões da assinatura visível:

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

A imagem da assinatura visível é sobreposta na página especificada, nas coordenadas fornecidas. A assinatura criptográfica é aplicada a todo o documento simultaneamente, proporcionando segurança e confirmação visual em uma única operação.

Se a imagem estiver em memória (obtida de um banco de dados ou armazenamento em nuvem, por exemplo), use LoadSignatureImageFromStream em vez disso. Para uma análise mais aprofundada das opções de linguagem gestual visual, consulte o guia prático de linguagem gestual em PDF .

Como criar campos de formulário de assinatura para signatários externos?

Em alguns fluxos de trabalho, o documento é criado pelo seu sistema, mas precisa ser assinado por uma parte externa — um cliente, um parceiro ou um órgão regulador. Em vez de coletar um certificado dessa parte antecipadamente, você incorpora um campo de formulário de assinatura específico no PDF e envia o documento para ela. Os destinatários abrem o PDF no Adobe Acrobat Reader ou em outro visualizador compatível, clicam no campo de assinatura e inserem seu próprio certificado ou assinatura eletrônica.

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

Os parâmetros do construtor SignatureFormField mapeiam diretamente para a posição do campo na página. Quando o destinatário abre o PDF, ele vê uma caixa claramente demarcada onde sua assinatura deve ser inserida. O formulário preenchido pode então ser devolvido ao seu sistema, onde você poderá carregá-lo, validar a assinatura incorporada e arquivá-lo.

Para mais informações sobre o manuseio de formulários PDF — incluindo a leitura dos dados enviados pelo formulário — consulte o guia de edição de formulários PDF .

Como verificar uma assinatura digital programaticamente?

Após um documento ser assinado e devolvido, pode ser necessário verificar se a assinatura ainda é válida e se o documento não foi alterado. IronPDF expõe a verificação de assinaturas através do objeto 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() retorna uma lista de todas as assinaturas digitais incorporadas no PDF. Cada objeto PdfDigitalSignature expõe VerifySignature(), o nome do signatário, o carimbo de tempo da assinatura e a cadeia de certificação. Essas informações são suficientes para criar um registro de auditoria ou um painel de gerenciamento de documentos que sinalize quaisquer PDFs com assinaturas corrompidas ou expiradas.

Como gerenciar certificados em produção?

Armazenar um arquivo .pfx no sistema de arquivos funciona durante o desenvolvimento, mas não é adequado para produção. Os arquivos de certificado contêm chaves privadas e, se o arquivo for comprometido, todos os documentos assinados com essa chave ficarão em risco.

Usando o Azure Key Vault

O Azure Key Vault permite armazenar e usar certificados sem que a chave privada saia do cofre. O SDK do .NET fornece um CertificateClient que baixa as informações do certificado público. Para operações de assinatura reais que mantêm a chave privada dentro do Key Vault, você pode usar o pacote Azure.Security.KeyVault.Keys para executar a operação criptográfica no lado do servidor.

Utilizando variáveis ​​de ambiente e segredos

Para projetos menores, armazene o certificado como uma string codificada em Base64 em uma variável de ambiente ou no Gerenciador de Segredos do ASP.NET Core e decodifique-o em tempo de execução:

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

Esse padrão mantém as credenciais fora do controle de versão e simplifica a rotação — basta atualizar a variável de ambiente e reiniciar o serviço.

Como assinar vários PDFs em lote de forma eficiente?

Quando você precisa assinar dezenas ou centenas de documentos em uma única operação -- por exemplo, assinando todo um lote de faturas no final do mês -- carregar o certificado uma vez e reutilizar o objeto PdfSignature em todos os documentos reduz a sobrecarga:

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

Criar o objeto PdfSignature uma vez fora do loop significa que o arquivo de certificado é lido e analisado apenas uma vez. Cada iteração carrega, assina e salva um PDF individual. Para lotes muito grandes, considere processar documentos em paralelo usando Parallel.ForEach -- as operações de assinatura do IronPDF são seguras para threads quando cada instância de PdfDocument é isolada em um único thread.

Como solucionar erros comuns de assinatura?

"Certificado não encontrado" ou "Senha inválida"

Verifique novamente o caminho do certificado usando File.Exists(certPath) antes de passá-lo para PdfSignature. As senhas dos certificados diferenciam maiúsculas de minúsculas e devem ser exatamente iguais. Em desenvolvimento, é comum gerar um certificado autoassinado com uma senha simples; Em produção, trate a senha como um segredo e carregue-a a partir de um gerenciador de segredos.

A mensagem "Assinatura inválida" aparece no visualizador de PDF.

Um aviso de "assinatura inválida" no Adobe Acrobat geralmente significa uma das três coisas: (1) o certificado não é confiável pelo repositório de certificados do visualizador, (2) o documento foi modificado após a assinatura ou (3) o certificado de assinatura expirou. Para uso em produção, obtenha um certificado de uma Autoridade Certificadora (CA) confiável e assegure-se de que o relógio do sistema esteja sincronizado. Para fins de desenvolvimento, a Adobe fornece instruções para confiar temporariamente em certificados autoassinados.

"O documento não está assinado" após chamar Sign()

Chamar document.Sign(signature) marca o documento para assinatura, mas a assinatura só se finaliza quando você chama SaveAs ou salva para um stream. Certifique-se de chamar o método de salvar após Sign, e verifique se o caminho do arquivo de saída pode ser escrito.

Para obter detalhes completos da API e recursos de solução de problemas, visite a central de documentação do IronPDF e a referência de objetos do IronPDF . Se precisar de ajuda, a página de suporte do IronPDF conecta você à equipe de engenharia.

Quais são os seus próximos passos?

A assinatura digital de PDFs no ASP.NET Core torna-se simples uma vez que você entende as três operações principais: carregar um certificado, chamar Sign, e salvar o resultado. O IronPDF cuida das tarefas criptográficas mais complexas para que você possa se concentrar na lógica de negócios do seu aplicativo.

Para continuar aprimorando seu fluxo de trabalho de documentos, explore estes tópicos relacionados:

Comece com uma licença de teste gratuita do IronPDF e tenha seu primeiro PDF assinado funcionando em menos de uma hora. Caso tenha dúvidas ou se depare com situações atípicas, a equipe de suporte da Iron Software está disponível para ajudá-lo a implementar um fluxo de trabalho de assinatura de documentos confiável e em conformidade com a legislação.

Perguntas frequentes

O que é uma assinatura digital no ASP.NET Core?

Uma assinatura digital em ASP.NET Core funciona como um selo digital usado para verificar a autenticidade e a integridade de documentos PDF. Ela garante que os documentos sejam legalmente válidos e não tenham sido adulterados.

Como posso adicionar uma assinatura digital a um documento PDF usando o IronPDF?

Você pode adicionar uma assinatura digital a um documento PDF usando o IronPDF, incluindo um certificado e configurando-o para assinar o documento, garantindo que seja seguro e verificável.

Por que as assinaturas digitais são importantes para os documentos da minha empresa?

As assinaturas digitais são cruciais porque verificam se documentos como contratos ou faturas são autênticos e não foram alterados, protegendo assim sua empresa de potenciais riscos legais.

Posso criar campos de formulário interativos em PDFs com o IronPDF?

Sim, o IronPDF permite criar campos de formulário interativos em PDFs, o que pode melhorar a interação do usuário e agilizar os processos de documentos em aplicativos ASP.NET Core.

É possível adicionar assinaturas visíveis aos meus documentos PDF?

Sim, com o IronPDF, você pode adicionar assinaturas visíveis aos seus documentos PDF, deixando claro para os destinatários que o documento está assinado e verificado de forma segura.

Que tipos de certificados podem ser usados para assinaturas digitais em PDFs?

Você pode usar vários tipos de certificados para assinaturas digitais em PDFs, incluindo certificados autoassinados e aqueles emitidos por uma Autoridade Certificadora confiável, dependendo do nível de segurança e confiança exigido.

Como o IronPDF garante que um documento PDF não foi adulterado?

O IronPDF garante que um documento PDF não foi adulterado, utilizando assinaturas digitais que validam a integridade e a autenticidade do documento, alertando os destinatários caso tenham sido feitas alterações após a assinatura.

Posso automatizar o processo de assinatura digital em aplicações ASP.NET Core?

Sim, você pode automatizar o processo de assinatura digital em aplicações ASP.NET Core usando o IronPDF, que permite o processamento em lote e a integração em fluxos de trabalho existentes.

Curtis Chau
Redator Técnico

Curtis Chau é bacharel em Ciência da Computação (Universidade Carleton) e se especializa em desenvolvimento front-end, com experiência em Node.js, TypeScript, JavaScript e React. Apaixonado por criar interfaces de usuário intuitivas e esteticamente agradáveis, Curtis gosta de trabalhar com frameworks modernos e criar manuais ...

Leia mais

Equipe de suporte de ferro

Estamos online 24 horas por dia, 5 dias por semana.
Bater papo
E-mail
Liga para mim