Como gerar arquivos PDF no .NET Core

Converter HTML para PDF em .NET Core usando C# com IronPDF

This article was translated from English: Does it need improvement?
Translated
View the article in English

Gerar PDFs de alta fidelidade diretamente a partir de HTML é um requisito rotineiro em aplicações .NET modernas — relatórios, faturas e ingressos precisam de uma saída com qualidade impecável que corresponda à interface web. O IronPDF simplifica esse fluxo de trabalho ao expor uma única API C# para renderizar HTML, visualizações Razor e sites completos em documentos PDF compatíveis com os padrões. Ao final deste guia, o desenvolvedor será capaz de converter URLs, HTML bruto ou visualizações MVC em um projeto ASP.NET Core e implantar o mesmo código em ambientes Windows, Linux, Docker ou sem servidor.

PontasPara problemas de layout, o IronPDF fornece um depurador independente de Chrome que ajuda a diagnosticar peculiaridades de CSS, JavaScript e media-query antes que o PDF seja renderizado. Consulte o guia dedicado de conversão de HTML para PDF com perfeição de pixels para obter técnicas detalhadas.

Início rápido: Criar um PDF a partir de HTML no .NET Core

Converta HTML para PDF sem esforço em .NET Core usando a biblioteca IronPDF . Este guia fornece um exemplo simples para você começar rapidamente, renderizando conteúdo HTML em um PDF de alta qualidade com o mínimo de código. Ideal para desenvolvedores que desejam integrar a criação de PDFs em seus aplicativos com facilidade.

  1. Instale IronPDF com o Gerenciador de Pacotes NuGet

    PM > Install-Package IronPdf
  2. Copie e execute este trecho de código.

    var pdf = new IronPdf.ChromePdfRenderer().RenderHtmlAsPdf("<h1>Hello World</h1>");
  3. Implante para testar em seu ambiente de produção.

    Comece a usar IronPDF em seu projeto hoje com uma avaliação gratuita

    arrow pointer

Lista de verificação de início rápido

  1. InstallInstall-Package IronPdf
  2. Render a URLChromePdfRenderer.RenderUrlAsPdf()
  3. Render raw HTMLChromePdfRenderer.RenderHtmlAsPdf()
  4. Exportar uma visão RazorChromePdfRenderer.RenderHtmlAsPdfAsync()
  5. Ajustar saída – aproveite ChromePdfRenderer.RenderingOptions

O que este tutorial aborda

  • Conversão de URL, string HTML e visão Razor
  • Configuração de papel, margem e tipo de mídia
  • Implantação multiplataforma (Windows, Linux, Docker)
  • Pós-processamento: mesclar, adicionar marca d'água, proteger com senha e assinar digitalmente PDFs
  • Exemplo completo: aplicativo MVC de reserva de ingressos

Como faço para instalar a biblioteca PDF no .NET Core?

A instalação da biblioteca é feita com apenas uma linha de comando em qualquer projeto .NET 8 e permanece compatível com versões futuras do .NET 9 (prévia) e com o lançamento do .NET 10. Utilize o Console do Gerenciador de Pacotes do NuGet e o gerenciador de pacotes resolverá automaticamente todas as dependências para Windows, Linux, Docker e ambientes sem servidor.

PM> Install-Package IronPdf             # .NET 8 LTS and higher
PM> Install-Package IronPdf             # .NET 8 LTS and higher
SHELL

ObservePrecisa de CLI? O mesmo comando funciona com dotnet add package IronPdf dentro da pasta do seu projeto.

Após a instalação, confirme se tudo está conectado convertendo qualquerURLpública:

:path=/static-assets/pdf/content-code-examples/tutorials/dotnet-core-pdf-generating-3.cs
public class ClientModel
{
    [Required]
    public string Name { get; set; }
    [Required]
    public string Phone { get; set; }
    [Required]
    public string Email { get; set; }
}
Public Class ClientModel
	<Required>
	Public Property Name() As String
	<Required>
	Public Property Phone() As String
	<Required>
	Public Property Email() As String
End Class
$vbLabelText   $csharpLabel

Como funciona

  • ChromePdfRenderer inicia uma instância do Chromium em sandbox por trás dos bastidores—nenhuma instalação separada do Chrome é necessária.
  • RenderUrlAsPdf captura o DOM totalmente renderizado, incluindo conteúdo impulsionado por JavaScript, media queries de CSS e fontes.
  • O PdfDocument resultante expõe métodos auxiliares para mesclar, proteger com senha ou assinar digitalmente a saída—capacidades cobertas mais adiante neste tutorial.

Para obter mais detalhes sobre as nuances de implantação (Azure App Service, AWS Lambda, Linux local), consulte o guia de instalação específico e as páginas de configuração avançada do NuGet . Dicas internas de CI/CD para clusters Docker e K8s são abordadas nas melhores práticas de implantação do Docker .


Como um serviço .NET Core pode converter umURLde um site ativo em PDF?

Uma única chamada para RenderUrlAsPdf é suficiente: passe qualquerURLpublicamente acessível e o IronPDF retorna um PDF totalmente renderizado e compatível com os padrões. O código abaixo é direcionado ao .NET 8 LTS e compila sem alterações no .NET 9 Preview, bem como na futura versão do .NET 10, prevista para 2025.

Exemplo passo a passo

:path=/static-assets/pdf/content-code-examples/tutorials/dotnet-core-pdf-generating-4.cs
public class ClientServices
{
    private static ClientModel _clientModel;
    public static void AddClient(ClientModel clientModel)
    {
        _clientModel = clientModel;
    }
    public static ClientModel GetClient()
    {
        return _clientModel;
    }
}
Public Class ClientServices
	Private Shared _clientModel As ClientModel
	Public Shared Sub AddClient(ByVal clientModel As ClientModel)
		_clientModel = clientModel
	End Sub
	Public Shared Function GetClient() As ClientModel
		Return _clientModel
	End Function
End Class
$vbLabelText   $csharpLabel

Por que funciona

  • ChromePdfRenderer inicia uma instância do Chromium em sandbox—sem dependência do Chrome do sistema, mantendo as imagens Docker leves.
  • RenderUrlAsPdf espera que o DOM e o JavaScript terminem antes de fazer a captura, para que apps de página única renderizem corretamente.
  • Ao configurar CssMediaType para Print, o motor é instruído a usar regras específicas de impressão, correspondendo à saída de Print → Save as PDF de um navegador.
  • O PdfDocument resultante pode ser criptografado, assinado digitalmente, mesclado ou rasterizado—capacidades cobertas em seções posteriores.

PontasDepuração pixel-perfeita: habilite renderer.LoggingOptions.DebugMode = true e siga o guia de depuração do Headless Chrome para inspecionar ferramentas de desenvolvimento ao vivo durante a renderização.

Recursos relacionados


Como faço para converter HTML bruto em PDF no .NET Core?

Passando uma string HTML—ou a marcação renderizada de uma visão Razor—para ChromePdfRenderer.RenderHtmlAsPdf produz instantaneamente um PDF compatível com os padrões. O método inicia o mecanismo Chromium integrado do IronPDF, portanto, não é necessária a instalação de um navegador externo nem a dependência do WebView. O mesmo código mostrado abaixo compila no .NET 8 LTS atualmente e permanece compatível com o .NET 9 e com o lançamento previsto do .NET 10 em novembro de 2025.

Exemplo — gerar um PDF a partir de um fragmento HTML

:path=/static-assets/pdf/content-code-examples/tutorials/dotnet-core-pdf-generating-5.cs
@model IronPdfMVCHelloWorld.Models.ClientModel
@{
  ViewBag.Title = "Book Ticket";
}
<h2>Index</h2>
@using (Html.BeginForm())
{
  <div class="form-horizontal">
    @Html.ValidationSummary(true, "", new { @class = "text-danger" })
    <div class="form-group">
      @Html.LabelFor(model => model.Name, htmlAttributes: new { @class = "control-label col-md-2" })
      <div class="col-md-10">
        @Html.EditorFor(model => model.Name, new { htmlAttributes = new { @class = "form-control" } })
        @Html.ValidationMessageFor(model => model.Name, "", new { @class = "text-danger" })
      </div>
    </div>
    <div class="form-group">
      @Html.LabelFor(model => model.Phone, htmlAttributes: new { @class = "control-label col-md-2" })
      <div class="col-md-10">
        @Html.EditorFor(model => model.Phone, new { htmlAttributes = new { @class = "form-control" } })
        @Html.ValidationMessageFor(model => model.Phone, "", new { @class = "text-danger" })
      </div>
    </div>
    <div class="form-group">
      @Html.LabelFor(model => model.Email, htmlAttributes: new { @class = "control-label col-md-2" })
      <div class="col-md-10">
        @Html.EditorFor(model => model.Email, new { htmlAttributes = new { @class = "form-control" } })
        @Html.ValidationMessageFor(model => model.Email, "", new { @class = "text-danger" })
      </div>
    </div>
    <div class="form-group">
      <div class="col-md-10 pull-right">
        <button type="submit" value="Save" class="btn btn-sm">
          <i class="fa fa-plus"></i>
          <span>
            Save
          </span>
        </button>
      </div>
    </div>
  </div>
}
model ReadOnly Property () As IronPdfMVCHelloWorld.Models.ClientModel
  ViewBag.Title = "Book Ticket"
End Property
'INSTANT VB TODO TASK: The following line could not be converted:
(Of h2) Index</h2> [using](Html.BeginForm())
If True Then
'INSTANT VB TODO TASK: The following line uses invalid syntax:
'  <div class="form-horizontal"> @Html.ValidationSummary(True, "", New { @class = "text-danger" }) <div class="form-group"> @Html.LabelFor(model => model.Name, htmlAttributes: New { @class = "control-label col-md-2" }) <div class="col-md-10"> @Html.EditorFor(model => model.Name, New { htmlAttributes = New { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.Name, "", New { @class = "text-danger" }) </div> </div> <div class="form-group"> @Html.LabelFor(model => model.Phone, htmlAttributes: New { @class = "control-label col-md-2" }) <div class="col-md-10"> @Html.EditorFor(model => model.Phone, New { htmlAttributes = New { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.Phone, "", New { @class = "text-danger" }) </div> </div> <div class="form-group"> @Html.LabelFor(model => model.Email, htmlAttributes: New { @class = "control-label col-md-2" }) <div class="col-md-10"> @Html.EditorFor(model => model.Email, New { htmlAttributes = New { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.Email, "", New { @class = "text-danger" }) </div> </div> <div class="form-group"> <div class="col-md-10 pull-right"> <button type="submit" value="Save" class="btn btn-sm"> <i class="fa fa-plus"></i> <span> Save </span> </button> </div> </div> </div> }
$vbLabelText   $csharpLabel

O que o código demonstra

  • Chromium Embutido — IronPDF vem com o motor Chromium, garantindo paridade HTML5, CSS3 e JavaScript com navegadores modernos.
  • Dependência única — Uma instalação leve do NuGet cobre Windows, Linux, Docker e Azure/AWS sem bibliotecas de sistema adicionais.
  • Opções de renderizaçãoPaperSize, CssMediaType e RenderDelay espelham as configurações de impressão do navegador para que os PDFs correspondam aos layouts na tela.
  • Alvo preparado para o futuro — A superfície da API é a mesma no .NET 8, .NET 9 STS e no próximo .NET 10, portanto, a manutenção de longo prazo é mínima.
  • Ganchos de pós-processamentoPdfDocument expõe auxiliares para mesclagem, proteção por senha e assinaturas digitais—cada uma coberta mais adiante neste guia.

Leitura adicional: veja o tutorial passo a passo de HTML-string-to-PDF e a documentação completa da API ChromePdfRenderer.


Como exportar uma view do .NET Core MVC para PDF?

IronPDF renderiza uma visão Razor totalmente processada ( .cshtml ) da mesma forma que um navegador faria e transmite o resultado como um PdfDocument. O fluxo de trabalho abaixo mantém a lógica do controlador limpa, não requer plugins de navegador e funciona no .NET 8 LTS, no .NET 9 Preview e na versão .NET 10, com lançamento previsto para novembro de 2025.

Exemplo de controlador de ponta a ponta

// TicketsController.cs — .NET 8 LTS / MVC
using IronPdf;
using Microsoft.AspNetCore.Mvc;
using YourApp.Models;           // TicketViewModel

public class TicketsController : Controller
{
    private readonly ChromePdfRenderer _renderer;

    public TicketsController()
    {
        _renderer = new ChromePdfRenderer
        {
            RenderingOptions =
            {
                PaperSize        = PdfPaperSize.A5,            // Compact ticket size
                PaperOrientation = PdfPdfOrientation.Portrait,
                FitToPaperWidth  = true,
                CssMediaType     = PdfCssMediaType.Print,
                Margins = new PdfMargins(5, 10, 5, 10)         // mm
            }
        };
    }

    // GET /Tickets/Print/42
    public async Task<IActionResult> Print(int id)
    {
        TicketViewModel vm = await _service.GetTicketAsync(id);

        // 1. Render the Razor view to an HTML string
        string html  = await RazorTemplateEngine.RenderViewAsync(
                           HttpContext, "~/Views/Tickets/Print.cshtml", vm);

        // 2. Convert HTML → PDF
        using PdfDocument pdf = _renderer.RenderHtmlAsPdf(html);

        // 3. Stream back as a file
        return File(pdf.BinaryData, "application/pdf",
                    $"ticket-{id}.pdf");
    }
}
// TicketsController.cs — .NET 8 LTS / MVC
using IronPdf;
using Microsoft.AspNetCore.Mvc;
using YourApp.Models;           // TicketViewModel

public class TicketsController : Controller
{
    private readonly ChromePdfRenderer _renderer;

    public TicketsController()
    {
        _renderer = new ChromePdfRenderer
        {
            RenderingOptions =
            {
                PaperSize        = PdfPaperSize.A5,            // Compact ticket size
                PaperOrientation = PdfPdfOrientation.Portrait,
                FitToPaperWidth  = true,
                CssMediaType     = PdfCssMediaType.Print,
                Margins = new PdfMargins(5, 10, 5, 10)         // mm
            }
        };
    }

    // GET /Tickets/Print/42
    public async Task<IActionResult> Print(int id)
    {
        TicketViewModel vm = await _service.GetTicketAsync(id);

        // 1. Render the Razor view to an HTML string
        string html  = await RazorTemplateEngine.RenderViewAsync(
                           HttpContext, "~/Views/Tickets/Print.cshtml", vm);

        // 2. Convert HTML → PDF
        using PdfDocument pdf = _renderer.RenderHtmlAsPdf(html);

        // 3. Stream back as a file
        return File(pdf.BinaryData, "application/pdf",
                    $"ticket-{id}.pdf");
    }
}
Imports IronPdf
Imports Microsoft.AspNetCore.Mvc
Imports YourApp.Models ' TicketViewModel

Public Class TicketsController
    Inherits Controller

    Private ReadOnly _renderer As ChromePdfRenderer

    Public Sub New()
        _renderer = New ChromePdfRenderer With {
            .RenderingOptions = New PdfRenderingOptions With {
                .PaperSize = PdfPaperSize.A5, ' Compact ticket size
                .PaperOrientation = PdfPdfOrientation.Portrait,
                .FitToPaperWidth = True,
                .CssMediaType = PdfCssMediaType.Print,
                .Margins = New PdfMargins(5, 10, 5, 10) ' mm
            }
        }
    End Sub

    ' GET /Tickets/Print/42
    Public Async Function Print(id As Integer) As Task(Of IActionResult)
        Dim vm As TicketViewModel = Await _service.GetTicketAsync(id)

        ' 1. Render the Razor view to an HTML string
        Dim html As String = Await RazorTemplateEngine.RenderViewAsync(
            HttpContext, "~/Views/Tickets/Print.cshtml", vm)

        ' 2. Convert HTML → PDF
        Using pdf As PdfDocument = _renderer.RenderHtmlAsPdf(html)
            ' 3. Stream back as a file
            Return File(pdf.BinaryData, "application/pdf", $"ticket-{id}.pdf")
        End Using
    End Function
End Class
$vbLabelText   $csharpLabel

O que este código ilustra

  • Sem arquivos temporários — a visão Razor é renderizada na memória e então passada diretamente para RenderHtmlAsPdf, evitando I/O de disco e condições de corrida em pasta temporária race conditions.
  • Saída do tamanho de ingressosPaperSize = A5 e margens estreitas mantêm os ingressos para impressão em casa compactos.
  • Estilos de impressão consistentesCssMediaType = Print aplica as mesmas regras de CSS @media print que os navegadores usam.
  • Transmissão bináriapdf.BinaryData transmite o documento sem tocar no sistema de arquivos; Ideal para endpoints de API e funções Lambda.
  • Renderizador reutilizávelChromePdfRenderer é instanciado uma vez por controlador e depois reutilizado, minimizando a sobrecarga de spawn de processos.

PaperSize , PaperOrientation , FitToPaperWidth

Margins , Header , Footer , Watermark

Próximo passo: adicione criptografia, assinaturas digitais ou combine vários ingressos em um único arquivo. Veja o exemplo de combinação e o guia de instruções para assinatura digital .


Icon Quote related to O que este código ilustra

Minha biblioteca favorita desse tipo é o IronPDF. Ele permite a manipulação rápida e eficiente de arquivos PDF. Além disso, possui muitos recursos valiosos, como a exportação para o formato PDF/A e a assinatura digital de documentos PDF.

Milan Jovanovic related to O que este código ilustra

Milan Jovanovic

Microsoft MVP

Veja o estudo de caso
Icon Quote related to O que este código ilustra

Com o IronOCR, podemos economizar US$ 40.000 por ano em processamento manual, ao mesmo tempo que aumentamos a produtividade e liberamos recursos para tarefas de alto impacto. Eu o recomendo fortemente.

Brent Matzelle related to O que este código ilustra

Brent Matzelle

Diretor de Tecnologia, OPYN

Veja o estudo de caso
Icon Quote related to O que este código ilustra

O IronSuite desempenha um papel crucial nas nossas operações. Estas são ferramentas que aumentam a eficiência no negócio, incluindo a criação de plantas baixas e melhoria na gestão de inventário.

David Jones related to O que este código ilustra

David Jones

Engenheiro(a) de Software Líder, Agorus Build

Veja o estudo de caso

Como posso ajustar com precisão o tamanho do papel, as margens, os cabeçalhos, as marcas d'água e a segurança antes da renderização?

IronPDF expõe um único objeto ChromePdfRenderOptions que controla todos os aspectos da saída—dimensões de papel, orientação, cabeçalhos e rodapés, tempo de JavaScript, marcas d'água, criptografia e assinaturas digitais—tudo sem plugins adicionais do navegador.

Exemplo de código — aplicar várias opções simultaneamente

:path=/static-assets/pdf/content-code-examples/tutorials/dotnet-core-pdf-generating-7.cs
[HttpPost]
public ActionResult Index(ClientModel model)
{
    if (ModelState.IsValid)
    {
        ClientServices.AddClient(model);
        return RedirectToAction("TicketView");
    }
  return View(model);
}
<HttpPost>
Public Function Index(ByVal model As ClientModel) As ActionResult
	If ModelState.IsValid Then
		ClientServices.AddClient(model)
		Return RedirectToAction("TicketView")
	End If
  Return View(model)
End Function
$vbLabelText   $csharpLabel

Por que essas opções são importantes?

  • PaperSize, Margins e CssMediaType espelham o diálogo de impressão de um navegador para que layouts na tela e o PDF permaneçam idênticos no Windows, Linux e Docker.
  • cabeçalhos e rodapés HTML suportam tokens Razor, CSS e JavaScript—úteis para números de página dinâmicos ou branding.
  • HtmlStamp permite que uma única linha crie marcas d'água com marca com controle total de HTML + CSS.
  • As opções de segurança permitem criptografia de 128 bits, senhas de proprietário/usuário e permissões granulares sem a necessidade de ferramentas de terceiros.
  • As assinaturas digitais adicionam um selo criptográfico diretamente no código, mantendo a autenticidade legal e a inviolabilidade.
  • Auxiliares de extração como ExtractAllText e ExtractAllImages revertem o processo quando a análise é necessária.

Referência rápida — Configurações populares

##

PaperSize , PaperOrientation , Margins , CssMediaType , RenderDelay

##

`HtmlHeader` , `HtmlFooter` , marcadores Razor dinâmicos, tokens de número de página

##

`Watermark` , `HtmlStamp` , opacidade, alinhamento

##

`SecurityOptions` , `SignAndStamp` , senhas de proprietário/usuário, selagem de certificado

Próximas tarefas: mesclar vários PDFs, extrair texto e imagens e implantar em Docker ou em um sistema sem servidor. Continue para a seção de implantação para garantir a paridade entre plataformas.


Como posso implantar um código de geração de PDF no Docker em sistemas Linux e Windows?

IronPdf é entregue como um único pacote NuGet auto-contido, assim containerizar um aplicativo ASP.NET Core (ou console) é simples em tanto Windows quanto Linux. A chave é copiar os binários publicados para uma imagem de tempo de execução esguia e, no Linux, adicionar as duas bibliotecas nativas que o IronPDF requer (libnss3 e libatk1.0-0).

Dockerfile de múltiplos estágios (Ubuntu 22.04)

Observe Por que várias etapas? A imagem do SDK (etapa 1) compila o projeto; A imagem final de tempo de execução (estágio 2) permanece compacta — < 120 MB — porque as ferramentas de compilação são descartadas.

####### ---------- stage 1 ----------
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
WORKDIR /src
COPY ["MyPdfApp.csproj", "."]
RUN dotnet restore

COPY . .
RUN dotnet publish -c Release -o /app/publish

####### ---------- stage 2 ----------
FROM mcr.microsoft.com/dotnet/aspnet:8.0-jammy
######## Install two native libs required by Chromium
RUN apt-get update && \
    apt-get install -y --no-install-recommends libnss3 libatk1.0-0 && \
    rm -rf /var/lib/apt/lists/*

WORKDIR /app
COPY --from=build /app/publish .
ENTRYPOINT ["dotnet", "MyPdfApp.dll"]

ObserveContêineres Windows? Substitua o segundo estágio por mcr.microsoft.com/dotnet/aspnet:8.0-windowsservercore-ltsc2022—nenhum pacote adicional é necessário, pois as DLLs do Chromium estão incluídas.

Script de validação de ponta a ponta

docker build -t pdf-demo .
docker run --rm -p 8080:80 pdf-demo
######### ↳ Navigate to http://localhost:8080/api/pdf?url=https://example.com
docker build -t pdf-demo .
docker run --rm -p 8080:80 pdf-demo
######### ↳ Navigate to http://localhost:8080/api/pdf?url=https://example.com
SHELL
  • A ação da API chama internamente ChromePdfRenderer.RenderUrlAsPdf assim como na Seção 2. O IronPDF inicia seu processo Chromium em sandbox dentro do contêiner — nenhum servidor X é necessário porque ele renderiza sem interface gráfica.
  • O consumo de memória permanece abaixo de 200 MB mesmo durante renderizações grandes.

PontasDica de solução de problemas: Se os logs do contêiner mostrarem um erro "libnss3.so não encontrado", confirme que tanto libnss3 como libatk1.0-0 estão presentes. As imagens alpinas não são suportadas porque a biblioteca musl C não possui os símbolos necessários.

Recursos internos


Como posso abrir, mesclar, adicionar marcas d'água e extrair conteúdo de PDFs existentes no .NET Core?

IronPDF trata cada PDF—seja gerado pelo IronPDF, Adobe® Acrobat ou ferramentas de terceiros—como um objeto PdfDocument de primeira classe que pode ser aberto, editado, seguro e salvo novamente sem perda de qualidade. A mesma superfície de API funciona no .NET 8 LTS atualmente e compila sem alterações no .NET 9 Preview e na futura versão do .NET 10.

Amostra unificada — abrir → mesclar → marca d'água → extrair

:path=/static-assets/pdf/content-code-examples/tutorials/dotnet-core-pdf-generating-10.cs
[HttpPost]
public ActionResult TicketView(TicketModel model)
{
    IronPdf.Installation.TempFolderPath = $@"{Directory.GetParent}/irontemp/";
    IronPdf.Installation.LinuxAndDockerDependenciesAutoConfig = true;
    var html = this.RenderViewAsync("_TicketPdf", model);
    var renderer = new IronPdf.ChromePdfRenderer();
    using var pdf = renderer.RenderHtmlAsPdf(html.Result, @"wwwroot/css");
    return File(pdf.Stream.ToArray(), "application/pdf");
}
<HttpPost>
Public Function TicketView(ByVal model As TicketModel) As ActionResult
	IronPdf.Installation.TempFolderPath = $"{AddressOf Directory.GetParent}/irontemp/"
	IronPdf.Installation.LinuxAndDockerDependenciesAutoConfig = True
	Dim html = Me.RenderViewAsync("_TicketPdf", model)
	Dim renderer = New IronPdf.ChromePdfRenderer()
	Dim pdf = renderer.RenderHtmlAsPdf(html.Result, "wwwroot/css")
	Return File(pdf.Stream.ToArray(), "application/pdf")
End Function
$vbLabelText   $csharpLabel

Por que isso é importante?

  • Abrir & combinarPdfDocument.FromFile carrega qualquer PDF compatível com os padrões, incluindo arquivos criptografados, enquanto PdfDocument.Merge concatena um número arbitrário de documentos em uma única chamada.
  • Marca d'águaApplyStamp (alias HtmlStamp) incorpora sobreposições HTML/CSS totalmente estilizadas—logo, código QR, ou texto diagonal—em páginas selecionadas sem rasterização.
  • Extração de conteúdoExtractAllText e ExtractAllImages extraem texto UTF-8 bruto ou streams de imagem binários para arquivamento ou pipelines de IA posteriores.
  • Pronto para assinaturas digitais – a mesma instância PdfDocument pode ser selada com SignAndStamp, produzindo hashes compatíveis com RFC 3161 alinhados com requisitos de assinatura digital ISO 32000-2.
  • Conformidade com padrões abertos – O IronPDF preserva a estrutura original do PDF (fontes, camadas, metadados XMP), de modo que a saída permaneça compatível com o Adobe® Reader e outros visualizadores ISO 32000-1 .
  • Preparada para o futuro – A API evita assemblies de interoperabilidade e chamadas GDI do Win32, portanto o código é executado sem alterações no Windows, Linux, Docker e nas futuras versões serverless do .NET 10.

Precisa dividir, girar ou excluir páginas? Consulte o tutorial de edição em nível de página para obter informações sobre operações detalhadas.


Como os PDFs podem ser criptografados e assinados digitalmente no .NET Core?

O IronPDF protege um documento em duas etapas: criptografia baseada em AES (senhas de usuário/proprietário + permissões granulares) e assinaturas digitais X.509 que selam o arquivo com um hash criptográfico. Ambas as APIs vivem no mesmo objeto PdfDocument, portanto, o fluxo de trabalho é idêntico no .NET 8 LTS hoje e compila sem alterações no .NET 9 preview e na próxima versão do .NET 10.

Exemplo — aplicar AES de 256 bits, bloquear direitos de impressão e adicionar uma assinatura visível.

:path=/static-assets/pdf/content-code-examples/tutorials/dotnet-core-pdf-generating-11.cs
using System.IO;
using System.Threading.Tasks;

public static class ControllerExtensions
{
    public static async Task<string> RenderViewAsync<TModel>(this Controller controller, string viewName, TModel model, bool partial = false)
    {
        if (string.IsNullOrEmpty(viewName))
        {
            viewName = controller.ControllerContext.ActionDescriptor.ActionName;
        }
        controller.ViewData.Model = model;
        using (var writer = new StringWriter())
        {
            IViewEngine viewEngine = controller.HttpContext.RequestServices.GetService(typeof(ICompositeViewEngine)) as ICompositeViewEngine;
            ViewEngineResult viewResult = viewEngine.FindView(controller.ControllerContext, viewName, !partial);
            if (viewResult.Success == false)
            {
                return $"A view with the name {viewName} could not be found";
            }
            ViewContext viewContext = new ViewContext(controller.ControllerContext, viewResult.View, controller.ViewData, controller.TempData, writer, new HtmlHelperOptions());
            await viewResult.View.RenderAsync(viewContext);
            return writer.GetStringBuilder().ToString();
        }
    }
}
Imports System.IO
Imports System.Threading.Tasks

Public Module ControllerExtensions
	<System.Runtime.CompilerServices.Extension> _
	Public Async Function RenderViewAsync(Of TModel)(ByVal controller As Controller, ByVal viewName As String, ByVal model As TModel, Optional ByVal As Boolean = False) As Task(Of String)
		If String.IsNullOrEmpty(viewName) Then
			viewName = controller.ControllerContext.ActionDescriptor.ActionName
		End If
		controller.ViewData.Model = model
		Using writer = New StringWriter()
			Dim viewEngine As IViewEngine = TryCast(controller.HttpContext.RequestServices.GetService(GetType(ICompositeViewEngine)), ICompositeViewEngine)
			Dim viewResult As ViewEngineResult = viewEngine.FindView(controller.ControllerContext, viewName, Not partial)
			If viewResult.Success = False Then
				Return $"A view with the name {viewName} could not be found"
			End If
			Dim viewContext As New ViewContext(controller.ControllerContext, viewResult.View, controller.ViewData, controller.TempData, writer, New HtmlHelperOptions())
			Await viewResult.View.RenderAsync(viewContext)
			Return writer.GetStringBuilder().ToString()
		End Using
	End Function
End Module
$vbLabelText   $csharpLabel

Nos bastidores

  • Criptografia AES-256 — IronPDF envolve a carga com chaves AES aprovadas pelo NIST, bloqueando a abertura, impressão ou cópia não autorizadas.
  • Granularidade de permissões — propriedades como AllowUserPrinting e AllowUserFormData alternam direitos por ação; É necessária uma senha de proprietário para que qualquer restrição entre em vigor.
  • Assinaturas digitaisSignAndStamp incorpora um carimbo de data/hora RFC 3161 e cadeia de certificados, criando hashes que exibem evidência de adulteração reconhecida pelo Adobe® Acrobat e outros visualizadores ISO 32000-2.
  • API única — tanto criptografia quanto assinatura modificam a mesma instância PdfDocument, evitando várias passagens de arquivo e preservando fontes internas, camadas e metadados.

PontasDica de solução de problemas: se o Adobe Reader relatar "assinatura inválida", assegure-se de que o PFX contenha um certificado raiz confiável e que as strings location estejam limpas em ASCII.

Configurações básicas de segurança

##

`PdfSecuritySettings` → `OwnerPassword` , `UserPassword` , `EncryptionAlgorithm` , `AllowUserPrinting`

##

`PdfDocument.SignAndStamp` — Caminho PFX, autoridade, localização, motivo, carimbo de data/hora

Recursos internos para análises mais aprofundadas


Como otimizar e escalar o desempenho da conversão de HTML para PDF no .NET Core?

O motor Chromium do IronPDF já renderiza a maioria das páginas em < 1 s em hardware moderno, mas o throughput pode ser multiplicado por acumular renderizações, habilitar multithreading e reduzir a sobrecarga do Headless Chrome. As dicas abaixo se aplicam igualmente a todas as versões do .NET .

1. Renderizações em lote em um pool de threads em segundo plano

:path=/static-assets/pdf/content-code-examples/tutorials/dotnet-core-pdf-generating-12.cs
IronPdf.License.LicenseKey = "YourLicenseKey";
ChromePdfRenderer renderer = new ChromePdfRenderer();

// Set rendering options
renderer.RenderingOptions.PaperSize = IronPdf.Rendering.PdfPaperSize.A4;
renderer.RenderingOptions.PaperOrientation = IronPdf.Rendering.PdfPaperOrientation.Portrait;

renderer.RenderHtmlFileAsPdf(@"testFile.html").SaveAs("GeneratedFile.pdf");
Imports IronPdf

License.LicenseKey = "YourLicenseKey"
Dim renderer As New ChromePdfRenderer()

' Set rendering options
renderer.RenderingOptions.PaperSize = Rendering.PdfPaperSize.A4
renderer.RenderingOptions.PaperOrientation = Rendering.PdfPaperOrientation.Portrait

renderer.RenderHtmlFileAsPdf("testFile.html").SaveAs("GeneratedFile.pdf")
$vbLabelText   $csharpLabel

2. Reduzir o custo de inicialização do Headless Chrome

O IronPDF inclui sua própria versão do Chromium, mas cada renderização acarreta uma pequena taxa de inicialização. O agrupamento de recursos ajuda, e os contêineres Linux devem incluir duas bibliotecas nativas:

RUN apt-get update && \
    apt-get install -y --no-install-recommends libnss3 libatk1.0-0

A falta de qualquer biblioteca manifesta um erro libnss3.so not found nos logs do Docker.

Recomendadas flags do Chrome (aplicadas automaticamente pelo IronPDF) incluem --disable-gpu e --no-sandbox para reduzir a memória e problemas de usuário root em contêineres.

3. Aguarde o JavaScript tardio com RenderDelay ou WaitFor

Páginas que animam contadores ou buscam dados após DOMContentLoaded podem precisar de um pequeno atraso:

renderer.RenderingOptions.RenderDelay = 200;        // ms
// OR: renderer.RenderingOptions.JavaScript = "WaitFor('window.doneLoading')";
renderer.RenderingOptions.RenderDelay = 200;        // ms
// OR: renderer.RenderingOptions.JavaScript = "WaitFor('window.doneLoading')";
renderer.RenderingOptions.RenderDelay = 200 ' ms
' OR: renderer.RenderingOptions.JavaScript = "WaitFor('window.doneLoading')";
$vbLabelText   $csharpLabel

Consulte o tutorial dedicado ao WaitFor para obter informações sobre promessas personalizadas e sondagem do DOM.

4. Ative o registro de depuração para uma solicitação.

:path=/static-assets/pdf/content-code-examples/tutorials/dotnet-core-pdf-generating-15.cs
IronPdf.License.LicenseKey = "YourLicenseKey";
PdfDocument pdf = PdfDocument.FromFile("1.pdf");
PdfDocument pdf2 = PdfDocument.FromFile("2.pdf");
pdf.AppendPdf(pdf2);
pdf.SaveAs("appendedFile.pdf");
IronPdf.License.LicenseKey = "YourLicenseKey"
Dim pdf As PdfDocument = PdfDocument.FromFile("1.pdf")
Dim pdf2 As PdfDocument = PdfDocument.FromFile("2.pdf")
pdf.AppendPdf(pdf2)
pdf.SaveAs("appendedFile.pdf")
$vbLabelText   $csharpLabel

O recurso Live DevTools permite rastrear fontes ausentes, imagens com erro 404 e eventos de temporização sem a necessidade de recompilar o código.

5. Reutilize PDFs de modelos em vez de renderizá-los novamente.

Para execuções de fatura, crie um PDF modelo com marcadores como [[name]] e realize uma substituição de texto em vez de reconstruir HTML complexo. É 10 vezes mais rápido e consome pouca memória.

Lista de verificação para ajuste rápido

##

`Parallel.ForEach` , `async/await` , reutilizar um único `ChromePdfRenderer`

##

Use `aspnet:8.0-jammy` ; instale `libnss3` + `libatk1.0-0` ; flags `--no-sandbox` , `--disable-gpu`

##

`RenderDelay` , `WaitFor()` , registrar a linha do tempo do DevTools para hidratações lentas de SPA

Leitura complementar


Onde posso baixar uma versão de avaliação gratuita, escolher uma licença e encontrar suporte especializado? {#anchor-10-resources}

Uma chave de avaliação de 30 dias é emitida instantaneamente através do formulário Iniciar Avaliação Gratuita e desbloqueia todos os recursos — incluindo conversão de HTML para PDF, assinaturas digitais e criptografia — sem marca d'água.

Após avaliar a biblioteca, escolha uma licença perpétua para desenvolvedores , para implantação ou corporativa ; Cada plano inclui atualizações menores gratuitas, direitos de uso para desenvolvimento/teste/produção e uma garantia de reembolso de 30 dias. Aplicar a chave é uma linha única de código (IronPdf.License.LicenseKey = "YOUR-KEY";) e pode ser automatizada em pipelines CI/CD.

A documentação completa — incluindo guias de início rápido , referência da API e vídeos tutoriais — está disponível no portal de documentação e é atualizada a cada nova versão do .NET .

Questões técnicas recebem respostas em um dia útil via chat ao vivo , e-mail ou telefone da equipe de suporte sediada em Chicago.

As perguntas frequentes sobre otimização de desempenho e implementação estão reunidas no Centro de Assistência de Desempenho.

Recurso URL Por que isso importa
Obtenha uma chave de avaliação de 30 dias https://ironpdf.com/demos/ Desbloqueia todas as funcionalidades sem marcas d'água.
Licenciamento e preços https://ironpdf.com/licensing/ Planos perpétuos ou por assinatura; O Iron Suite inclui 10 bibliotecas.
Referência da API https://ironpdf.com/object-reference/api/ Documentação de classe completa, por exemplo ChromePdfRenderer
Portal de documentos https://ironpdf.com/docs/ Guias, tutoriais, projetos de exemplo
Assistência de desempenho https://ironpdf.com/troubleshooting/ironpdf-performance-assistance/ Dicas de otimização e escalonamento
Contate o suporte https://ironsoftware.com/contact-us/ Suporte por chat ao vivo, e-mail e telefone.

Próximos passos

  1. Clone o repositório de exemplo que demonstra todos os principais recursos — desde a renderização de visualização MVC até a criptografia AES-256.
  2. Insira a chave de avaliação em uma solução existente e execute os testes unitários para validar a compatibilidade entre plataformas.
  3. Agende uma demonstração ao vivo com a equipe de engenharia para obter recomendações específicas para o seu projeto.

Com esses recursos em mãos, qualquer equipe .NET pode enviar PDFs perfeitos em nível de pixel para produção — localmente, em Docker ou sem servidor — em um único sprint.

Perguntas frequentes

Como posso converter HTML para PDF no .NET Core?

Você pode converter HTML para PDF no .NET Core usando a biblioteca IronPDF. Primeiro, instale o pacote NuGet IronPDF e, em seguida, crie uma instância ChromePdfRenderer . Use o método RenderHtmlAsPdf para converter strings HTML em PDFs.

Como faço para converter um URL de um site em um documento PDF?

Para converter um URL de um site em um documento PDF, instale o pacote NuGet IronPDF, crie uma instância ChromePdfRenderer e use o método RenderUrlAsPdf para renderizar o URL em um PDF. O resultado pode ser salvo usando o método SaveAs .

Qual a melhor maneira de converter views do Razor em PDFs?

A melhor maneira de converter views Razor em PDFs é usando o IronPDF. Primeiro, renderize a view Razor em uma string HTML e, em seguida, passe essa string para o método RenderHtmlAsPdf para criar um documento PDF.

Como posso aumentar a segurança dos meus documentos PDF?

Aprimore a segurança de PDFs usando o IronPDF aplicando criptografia AES-256, definindo senhas e controlando as permissões de usuário. Configure essas opções por meio da propriedade SecuritySettings para restringir ações como impressão e edição.

Quais opções estão disponíveis para personalizar a renderização de PDFs?

O IronPDF oferece diversas opções de renderização por meio da classe ChromePdfRenderOptions , incluindo a configuração do tamanho do papel, orientação, margens e a aplicação de tipos de mídia CSS. Você também pode adicionar cabeçalhos, rodapés e marcas d'água para personalizar a saída do documento.

Como faço para implantar um aplicativo de geração de PDF em um contêiner Docker?

Para implantar um aplicativo de geração de PDF em um contêiner Docker, configure as dependências do Linux no seu Dockerfile e defina as permissões de usuário. Utilize IronPdf.Installation.LinuxAndDockerDependenciesAutoConfig para gerenciamento automático de dependências.

Como posso adicionar marcas d'água a um PDF usando C#?

Você pode adicionar marcas d'água a PDFs usando o IronPDF, utilizando a propriedade Watermark com objetos HtmlStamp . Para opções avançadas, a classe HtmlStamper permite posicionamento personalizado e efeitos de transparência.

Posso adicionar assinaturas digitais a documentos PDF?

Sim, você pode adicionar assinaturas digitais a PDFs usando a classe PdfSignature do IronPDF. Utilize o método Sign em um PdfDocument e forneça um arquivo de certificado para garantir a integridade e autenticidade do documento.

Como posso otimizar o desempenho da geração de PDFs no .NET Core?

Otimize o desempenho da geração de PDFs reutilizando uma instância thread-safe ChromePdfRenderer , habilitando multithreading e removendo flags de inicialização desnecessárias do Chrome em modo headless. Essas práticas ajudam a melhorar a eficiência do seu aplicativo.

O exemplo de conversão de HTML para PDF em .NET Core apresentado neste tutorial também funciona com o .NET 10?

Sim. O IronPDF é totalmente compatível com o .NET 10, então você pode usar o exemplo de HTML para PDF do ChromePdfRenderer deste tutorial em projetos .NET 10 sem alterar o código principal. A principal diferença é que você deve usar o .NET 10 como alvo ao criar o projeto e, em seguida, instalar o pacote IronPDF mais recente do NuGet para gerar PDFs perfeitos em pixels a partir de HTML, views Razor ou URLs.

Jacob Mellor, Diretor de Tecnologia da Team Iron
Diretor de Tecnologia

Jacob Mellor é Diretor de Tecnologia da Iron Software e um engenheiro visionário pioneiro na tecnologia C# PDF. Como desenvolvedor original do código-fonte principal da Iron Software, ele moldou a arquitetura de produtos da empresa desde sua criação, transformando-a, juntamente com o CEO Cameron Rimington, em uma ...

Leia mais
Analisado por
Jeff Fritz
Jeffrey T. Fritz
Gerente de Programa Principal - Equipe da Comunidade .NET
Jeff também é Gerente de Programa Principal das equipes do .NET e do Visual Studio. Ele é o produtor executivo da série de conferências virtuais .NET Conf e apresenta o "Fritz and Friends", uma transmissão ao vivo para desenvolvedores que vai ao ar duas vezes por semana, onde ele conversa sobre tecnologia e escreve código junto com os espectadores. Jeff cria workshops, apresentações e planeja conteúdo para os maiores eventos de desenvolvedores da Microsoft, incluindo o Microsoft Build, o Microsoft Ignite, a .NET Conf e o Microsoft MVP Summit.
Pronto para começar?
Nuget Downloads 19,936,792 | Versão: 2026.7 recém-lançado
Still Scrolling Icon

Ainda está rolando a tela?

Quer provas rápidas? PM > Install-Package IronPdf
executar um exemplo Veja seu HTML se transformar em um PDF.