Como converter Views em PDFs no ASP.NET Core MVC | IronPDF

Como converter Views em PDFs em C# ASP.NET Core MVC

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

Converta Views do ASP.NET Core MVC em PDFs usando o método RenderRazorViewToPdf do IronPDF para converter PDF de arquivos .cshtml em documentos de alta qualidade com uma única linha de código em sua aplicação MVC.

Uma View é um componente do framework ASP.NET usado para gerar marcação HTML em aplicações web. Faz parte do padrão Model-View-Controller (MVC), comumente usado em aplicações ASP.NET MVC e ASP.NET Core MVC. As Views são responsáveis ​​por apresentar os dados aos usuários, renderizando o conteúdo HTML dinamicamente. As visualizações normalmente usam a sintaxe Razor , uma sintaxe de marcação para incorporar código baseado em servidor em páginas da web, o que as torna ferramentas poderosas para criar documentos PDF orientados a dados.

Início rápido: Converter CSHTML para PDF em ASP.NET Core

Transforme Views do ASP.NET Core MVC em PDFs usando o IronPDF. Com uma única linha de código, converta seus arquivos '.cshtml' em documentos PDF. Integre essa funcionalidade diretamente em sua aplicação MVC para geração perfeita de PDFs a partir de visualizações HTML dinâmicas. Siga este guia para configurar seu ambiente e começar a conversão.

  1. Instale IronPDF com o Gerenciador de Pacotes NuGet

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

    // using IronPdf.Extensions.Mvc.Core
    new IronPdf.ChromePdfRenderer().RenderRazorViewToPdf(HttpContext, "Views/Home/Report.cshtml", model).SaveAs("report.pdf");
  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

ASP.NET Core Web App MVC (Model-View-Controller) é uma estrutura de aplicação web fornecida pela Microsoft para a criação de aplicações web utilizando ASP.NET Core.

  • Modelo : Representa os dados e a lógica de negócios, gerencia as interações de dados e se comunica com as fontes de dados.
  • Visualização : Apresenta a interface do usuário, exibe dados e fornece informações aos usuários.
  • Controlador : Lida com a entrada do usuário, responde a solicitações, comunica-se com o Modelo e orquestra as interações Modelo-Visão.

O IronPDF permite a criação direta de arquivos PDF a partir de Views em projetos ASP.NET Core MVC. Isso simplifica a geração de PDFs no ASP.NET Core MVC, oferecendo suporte a recursos modernos, incluindo estilização CSS , execução de JavaScript e fontes personalizadas .

Que pacote preciso para as extensões do IronPDF ?

O pacote IronPdf.Extensions.Mvc.Core é uma extensão do pacote principal IronPdf. Os pacotes IronPdf.Extensions.Mvc.Core e IronPdf são necessários para renderizar Views em documentos PDF no ASP.NET Core MVC. O pacote de extensão fornece funcionalidades específicas para integração com o sistema de injeção de dependência do ASP.NET Core e o pipeline de renderização de visualizações Razor .

Install-Package IronPDF

Por que preciso tanto do IronPDF quanto do pacote de extensões?

O pacote principal do IronPDF contém o mecanismo central de renderização de PDF e as funcionalidades fundamentais, enquanto o pacote Extensions.Mvc.Core fornece integração especializada com o sistema de renderização de visualização do ASP.NET Core MVC. Essa separação permite uma melhor modularidade e garante que você inclua apenas a funcionalidade específica necessária para o seu tipo de projeto. O pacote de extensão inclui a interface IRazorViewRenderer e a implementação necessárias para converter visualizações Razor em HTML antes da geração do PDF.

Qual versão do pacote NuGet devo usar?

Use sempre versões correspondentes do IronPDF e do IronPdf.Extensions.Mvc.Core para garantir a compatibilidade. Para obter as versões estáveis ​​mais recentes e informações sobre compatibilidade de versões, consulte a documentação dos pacotes NuGet . Ao atualizar, certifique-se de que ambos os pacotes sejam atualizados juntos para manter o funcionamento correto.

Quais são os problemas de instalação mais comuns?

Problemas comuns de instalação incluem incompatibilidade de versões entre os pacotes principais e de extensão, dependências ausentes ou requisitos específicos da plataforma. Caso encontre problemas, certifique-se de que seu projeto esteja direcionado a uma versão compatível do .NET e consulte a visão geral da instalação para obter etapas de solução de problemas.

Biblioteca NuGet C# para PDF

Instalar com NuGet

Install-Package IronPDF

Como faço para renderizar visualizações em PDFs?

Você precisa de um projeto de aplicativo Web ASP.NET Core (Model-View-Controller) para converter Views em arquivos PDF. O processo envolve a criação de uma ação de controlador que usa o método RenderRazorViewToPdf do IronPDF para transformar suas visualizações Razor em documentos PDF. Essa abordagem aproveita todo o poder da sintaxe Razor , permitindo que você crie PDFs complexos, orientados a dados e com conteúdo dinâmico.

Que tipo de projeto devo usar?

Utilize o modelo de aplicativo Web ASP.NET Core (Model-View-Controller) para obter compatibilidade ideal com os recursos de renderização de visualização do IronPDF. Este tipo de projeto fornece a infraestrutura necessária para a renderização de visualizações, incluindo o mecanismo de visualização Razor e o roteamento adequado. Para projetos existentes, certifique-se de que sigam o padrão MVC e que tenham os recursos de renderização de visualização necessários instalados.

Posso usar isso com APIs mínimas?

Embora as APIs Minimal não tenham suporte integrado para visualização, você ainda pode usar os recursos de conversão de HTML para PDF do IronPDF. Para geração de PDFs baseada em visualizações, utilize a abordagem MVC tradicional ou considere o Razor Pages como alternativa.

Como adiciono uma classe de modelo?

  • Navegue até a pasta "Modelos".
  • Crie um novo arquivo de classe C# chamado "Person". Essa classe servirá como modelo para representar dados individuais. Utilize o seguinte trecho de código:
:path=/static-assets/pdf/content-code-examples/how-to/cshtml-to-pdf-mvc-core-model.cs
namespace ViewToPdfMVCCoreSample.Models
{
    public class Person
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Title { get; set; }
        public string Description { get; set; }
    }
}
Namespace ViewToPdfMVCCoreSample.Models
	Public Class Person
		Public Property Id() As Integer
		Public Property Name() As String
		Public Property Title() As String
		Public Property Description() As String
	End Class
End Namespace
$vbLabelText   $csharpLabel

Por que preciso de um modelo para geração de PDF?

Os modelos fornecem dados estruturados que podem ser passados ​​para as visualizações para renderização. Essa separação de responsabilidades garante que sua lógica de geração de PDFs permaneça limpa e de fácil manutenção. O modelo funciona como um contrato entre o seu controlador e a sua visualização, garantindo a segurança de tipos e habilitando o suporte ao IntelliSense nas suas visualizações Razor .

Quais tipos de dados funcionam melhor com visualizações?

Tipos de dados e coleções simples funcionam melhor para a geração de PDFs. Objetos aninhados complexos podem ser usados, mas podem exigir lógica de visualização adicional. Para um desempenho ideal, simplifique as estruturas de dados complexas no seu controlador antes de passá-las para a visualização. Considere usar ViewModels projetados especificamente para saída em PDF quando seus modelos de domínio forem muito complexos.

Aqui está um exemplo de uma estrutura de modelo mais complexa, adequada para geração de PDF:

public class InvoiceViewModel
{
    public string InvoiceNumber { get; set; }
    public DateTime InvoiceDate { get; set; }
    public decimal TotalAmount { get; set; }
    public List<InvoiceLineItem> LineItems { get; set; }
    public CustomerInfo Customer { get; set; }

    // Computed property for PDF display
    public string FormattedTotal => TotalAmount.ToString("C");
}

public class InvoiceLineItem
{
    public string Description { get; set; }
    public int Quantity { get; set; }
    public decimal UnitPrice { get; set; }
    public decimal LineTotal => Quantity * UnitPrice;
}

public class CustomerInfo
{
    public string Name { get; set; }
    public string Email { get; set; }
    public string Address { get; set; }
}
public class InvoiceViewModel
{
    public string InvoiceNumber { get; set; }
    public DateTime InvoiceDate { get; set; }
    public decimal TotalAmount { get; set; }
    public List<InvoiceLineItem> LineItems { get; set; }
    public CustomerInfo Customer { get; set; }

    // Computed property for PDF display
    public string FormattedTotal => TotalAmount.ToString("C");
}

public class InvoiceLineItem
{
    public string Description { get; set; }
    public int Quantity { get; set; }
    public decimal UnitPrice { get; set; }
    public decimal LineTotal => Quantity * UnitPrice;
}

public class CustomerInfo
{
    public string Name { get; set; }
    public string Email { get; set; }
    public string Address { get; set; }
}
Public Class InvoiceViewModel
    Public Property InvoiceNumber As String
    Public Property InvoiceDate As DateTime
    Public Property TotalAmount As Decimal
    Public Property LineItems As List(Of InvoiceLineItem)
    Public Property Customer As CustomerInfo

    ' Computed property for PDF display
    Public ReadOnly Property FormattedTotal As String
        Get
            Return TotalAmount.ToString("C")
        End Get
    End Property
End Class

Public Class InvoiceLineItem
    Public Property Description As String
    Public Property Quantity As Integer
    Public Property UnitPrice As Decimal
    Public ReadOnly Property LineTotal As Decimal
        Get
            Return Quantity * UnitPrice
        End Get
    End Property
End Class

Public Class CustomerInfo
    Public Property Name As String
    Public Property Email As String
    Public Property Address As String
End Class
$vbLabelText   $csharpLabel

Como faço para editar o controlador?

Navegue até a pasta "Controllers" e abra o arquivo "HomeController". Faremos alterações apenas na ação HomeController e adicionaremos a ação Persons. Consulte o código abaixo para obter orientações:

O código abaixo primeiro instancia a classe ChromePdfRenderer, passando um IRazorViewRenderer, o caminho para o nosso Views/Home/Persons.cshtml, e a Lista que contém os dados necessários para o método RenderRazorViewToPdf. Os usuários podem usar RenderingOptions para acessar uma série de recursos, como adicionar texto personalizado, incluir cabeçalhos e rodapés HTML no PDF resultante, definir margens personalizadas e aplicar números de página. Para opções de renderização mais avançadas, consulte a documentação de opções de renderização.

ObserveO documento PDF pode ser visualizado no navegador usando o seguinte código: File(pdf.BinaryData, "application/pdf"). No entanto, baixar o PDF depois de visualizá-lo no navegador resulta em um documento PDF corrompido.

using IronPdf.Extensions.Mvc.Core;
using Microsoft.AspNetCore.Mvc;
using System.Diagnostics;
using ViewToPdfMVCCoreSample.Models;

namespace ViewToPdfMVCCoreSample.Controllers
{
    public class HomeController : Controller
    {
        private readonly ILogger<HomeController> _logger;
        private readonly IRazorViewRenderer _viewRenderService;
        private readonly IHttpContextAccessor _httpContextAccessor;

        public HomeController(ILogger<HomeController> logger, IRazorViewRenderer viewRenderService, IHttpContextAccessor httpContextAccessor)
        {
            _logger = logger;
            _viewRenderService = viewRenderService;
            _httpContextAccessor = httpContextAccessor;
        }

        public IActionResult Index()
        {
            return View();
        }

        public async Task<IActionResult> Persons()
        {
            // Example list of persons
            var persons = new List<Person>
            {
                new Person { Name = "Alice", Title = "Mrs.", Description = "Software Engineer" },
                new Person { Name = "Bob", Title = "Mr.", Description = "Software Engineer" },
                new Person { Name = "Charlie", Title = "Mr.", Description = "Software Engineer" }
            };

            // Check if the request method is POST
            if (_httpContextAccessor.HttpContext.Request.Method == HttpMethod.Post.Method)
            {
                // Create a new PDF renderer
                ChromePdfRenderer renderer = new ChromePdfRenderer();

                // Configure rendering options for better output
                renderer.RenderingOptions.MarginTop = 40;
                renderer.RenderingOptions.MarginBottom = 40;
                renderer.RenderingOptions.PaperOrientation = IronPdf.Rendering.PdfPaperOrientation.Portrait;
                renderer.RenderingOptions.Title = "Persons Report";

                // Render View to PDF document
                PdfDocument pdf = renderer.RenderRazorViewToPdf(_viewRenderService, "Views/Home/Persons.cshtml", persons);

                Response.Headers.Add("Content-Disposition", "inline");

                // Output PDF document
                return File(pdf.BinaryData, "application/pdf", "viewToPdfMVCCore.pdf");
            }

            return View(persons);
        }

        public IActionResult Privacy()
        {
            return View();
        }

        [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
        public IActionResult Error()
        {
            return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
        }
    }
}
using IronPdf.Extensions.Mvc.Core;
using Microsoft.AspNetCore.Mvc;
using System.Diagnostics;
using ViewToPdfMVCCoreSample.Models;

namespace ViewToPdfMVCCoreSample.Controllers
{
    public class HomeController : Controller
    {
        private readonly ILogger<HomeController> _logger;
        private readonly IRazorViewRenderer _viewRenderService;
        private readonly IHttpContextAccessor _httpContextAccessor;

        public HomeController(ILogger<HomeController> logger, IRazorViewRenderer viewRenderService, IHttpContextAccessor httpContextAccessor)
        {
            _logger = logger;
            _viewRenderService = viewRenderService;
            _httpContextAccessor = httpContextAccessor;
        }

        public IActionResult Index()
        {
            return View();
        }

        public async Task<IActionResult> Persons()
        {
            // Example list of persons
            var persons = new List<Person>
            {
                new Person { Name = "Alice", Title = "Mrs.", Description = "Software Engineer" },
                new Person { Name = "Bob", Title = "Mr.", Description = "Software Engineer" },
                new Person { Name = "Charlie", Title = "Mr.", Description = "Software Engineer" }
            };

            // Check if the request method is POST
            if (_httpContextAccessor.HttpContext.Request.Method == HttpMethod.Post.Method)
            {
                // Create a new PDF renderer
                ChromePdfRenderer renderer = new ChromePdfRenderer();

                // Configure rendering options for better output
                renderer.RenderingOptions.MarginTop = 40;
                renderer.RenderingOptions.MarginBottom = 40;
                renderer.RenderingOptions.PaperOrientation = IronPdf.Rendering.PdfPaperOrientation.Portrait;
                renderer.RenderingOptions.Title = "Persons Report";

                // Render View to PDF document
                PdfDocument pdf = renderer.RenderRazorViewToPdf(_viewRenderService, "Views/Home/Persons.cshtml", persons);

                Response.Headers.Add("Content-Disposition", "inline");

                // Output PDF document
                return File(pdf.BinaryData, "application/pdf", "viewToPdfMVCCore.pdf");
            }

            return View(persons);
        }

        public IActionResult Privacy()
        {
            return View();
        }

        [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
        public IActionResult Error()
        {
            return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
        }
    }
}
Imports IronPdf.Extensions.Mvc.Core
Imports Microsoft.AspNetCore.Mvc
Imports System.Diagnostics
Imports ViewToPdfMVCCoreSample.Models

Namespace ViewToPdfMVCCoreSample.Controllers
    Public Class HomeController
        Inherits Controller

        Private ReadOnly _logger As ILogger(Of HomeController)
        Private ReadOnly _viewRenderService As IRazorViewRenderer
        Private ReadOnly _httpContextAccessor As IHttpContextAccessor

        Public Sub New(logger As ILogger(Of HomeController), viewRenderService As IRazorViewRenderer, httpContextAccessor As IHttpContextAccessor)
            _logger = logger
            _viewRenderService = viewRenderService
            _httpContextAccessor = httpContextAccessor
        End Sub

        Public Function Index() As IActionResult
            Return View()
        End Function

        Public Async Function Persons() As Task(Of IActionResult)
            ' Example list of persons
            Dim persons = New List(Of Person) From {
                New Person With {.Name = "Alice", .Title = "Mrs.", .Description = "Software Engineer"},
                New Person With {.Name = "Bob", .Title = "Mr.", .Description = "Software Engineer"},
                New Person With {.Name = "Charlie", .Title = "Mr.", .Description = "Software Engineer"}
            }

            ' Check if the request method is POST
            If _httpContextAccessor.HttpContext.Request.Method = HttpMethod.Post.Method Then
                ' Create a new PDF renderer
                Dim renderer As New ChromePdfRenderer()

                ' Configure rendering options for better output
                renderer.RenderingOptions.MarginTop = 40
                renderer.RenderingOptions.MarginBottom = 40
                renderer.RenderingOptions.PaperOrientation = IronPdf.Rendering.PdfPaperOrientation.Portrait
                renderer.RenderingOptions.Title = "Persons Report"

                ' Render View to PDF document
                Dim pdf As PdfDocument = renderer.RenderRazorViewToPdf(_viewRenderService, "Views/Home/Persons.cshtml", persons)

                Response.Headers.Add("Content-Disposition", "inline")

                ' Output PDF document
                Return File(pdf.BinaryData, "application/pdf", "viewToPdfMVCCore.pdf")
            End If

            Return View(persons)
        End Function

        Public Function Privacy() As IActionResult
            Return View()
        End Function

        <ResponseCache(Duration:=0, Location:=ResponseCacheLocation.None, NoStore:=True)>
        Public Function Error() As IActionResult
            Return View(New ErrorViewModel With {.RequestId = If(Activity.Current?.Id, HttpContext.TraceIdentifier)})
        End Function
    End Class
End Namespace
$vbLabelText   $csharpLabel

Após usar o método RenderRazorViewToPdf, você recebe um objeto PdfDocument que está aberto a melhorias e modificações adicionais. Você pode converter o PDF para os formatos PDF/A ou PDF/UA, adicionar sua assinatura digital ao PDF gerado ou mesclar e dividir documentos PDF conforme necessário. Além disso, a biblioteca permite girar páginas, inserir anotações ou marcadores e imprimir marcas d'água exclusivas em seus arquivos PDF.

O que é o serviço IRazorViewRenderer?

O IRazorViewRenderer é uma interface de serviço fornecida pelo pacote IronPdf.Extensions.Mvc.Core que lida com a conversão de visualizações Razor em HTML. Ele se integra ao mecanismo de visualização do ASP.NET Core para processar arquivos .cshtml com seus modelos associados, executando toda a sintaxe Razor e produzindo o HTML final que o IronPDF converte em PDF.

Por que verificar o método POST antes de renderizar?

A verificação do método POST garante que a geração do PDF ocorra somente quando solicitada explicitamente por meio do envio de um formulário. Isso evita a geração acidental de PDFs ao carregar a página e permite que a mesma ação sirva tanto para a visualização em HTML (no método GET) quanto para o download do PDF (no método POST). Esse padrão segue os princípios RESTful e proporciona uma melhor experiência ao usuário.

Como posso personalizar a saída em PDF?

O IronPDF oferece amplas opções de personalização através da propriedade RenderingOptions. Aqui está um exemplo com configurações mais avançadas:

// Advanced rendering configuration example
var renderer = new ChromePdfRenderer();

// Page setup
renderer.RenderingOptions.PaperSize = IronPdf.Rendering.PdfPaperSize.A4;
renderer.RenderingOptions.MarginLeft = 20;
renderer.RenderingOptions.MarginRight = 20;

// Headers and footers with merge fields
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter()
{
    Height = 25,
    HtmlFragment = "<div style='text-align: center; font-size: 12px;'>Page {page} of {total-pages}</div>"
};

// JavaScript execution delay for dynamic content
renderer.RenderingOptions.WaitFor = new WaitFor()
{
    RenderDelay = 500, // Wait 500ms for JS execution
    NetworkIdle = NetworkIdleTypes.NetworkIdle0 // Wait for network requests
};

// Apply watermark
renderer.RenderingOptions.TextHeader = new TextHeaderFooter()
{
    DrawDividerLine = true,
    CenterText = "CONFIDENTIAL",
    Font = new FontTypes() { FontSize = 16 }
};
// Advanced rendering configuration example
var renderer = new ChromePdfRenderer();

// Page setup
renderer.RenderingOptions.PaperSize = IronPdf.Rendering.PdfPaperSize.A4;
renderer.RenderingOptions.MarginLeft = 20;
renderer.RenderingOptions.MarginRight = 20;

// Headers and footers with merge fields
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter()
{
    Height = 25,
    HtmlFragment = "<div style='text-align: center; font-size: 12px;'>Page {page} of {total-pages}</div>"
};

// JavaScript execution delay for dynamic content
renderer.RenderingOptions.WaitFor = new WaitFor()
{
    RenderDelay = 500, // Wait 500ms for JS execution
    NetworkIdle = NetworkIdleTypes.NetworkIdle0 // Wait for network requests
};

// Apply watermark
renderer.RenderingOptions.TextHeader = new TextHeaderFooter()
{
    DrawDividerLine = true,
    CenterText = "CONFIDENTIAL",
    Font = new FontTypes() { FontSize = 16 }
};
' Advanced rendering configuration example
Dim renderer As New ChromePdfRenderer()

' Page setup
renderer.RenderingOptions.PaperSize = IronPdf.Rendering.PdfPaperSize.A4
renderer.RenderingOptions.MarginLeft = 20
renderer.RenderingOptions.MarginRight = 20

' Headers and footers with merge fields
renderer.RenderingOptions.HtmlHeader = New HtmlHeaderFooter() With {
    .Height = 25,
    .HtmlFragment = "<div style='text-align: center; font-size: 12px;'>Page {page} of {total-pages}</div>"
}

' JavaScript execution delay for dynamic content
renderer.RenderingOptions.WaitFor = New WaitFor() With {
    .RenderDelay = 500, ' Wait 500ms for JS execution
    .NetworkIdle = NetworkIdleTypes.NetworkIdle0 ' Wait for network requests
}

' Apply watermark
renderer.RenderingOptions.TextHeader = New TextHeaderFooter() With {
    .DrawDividerLine = True,
    .CenterText = "CONFIDENTIAL",
    .Font = New FontTypes() With {.FontSize = 16}
}
$vbLabelText   $csharpLabel

Quais são os erros comuns em controladores?

Os erros comuns incluem exceções de referência nula quando os serviços não são injetados corretamente, problemas de caminho ao especificar locais de visualização e problemas de vinculação de modelo. Certifique-se de que todos os serviços necessários estejam registrados em Program.cs e use caminhos relativos a partir da raiz do projeto ao especificar os locais de visualização. Para solucionar problemas, ative as mensagens de erro detalhadas no modo de desenvolvedor.

Como adiciono uma vista?

  • Clique com o botão direito do mouse na ação Person recém-adicionada e selecione "Adicionar visualização".

Menu de contexto do Visual Studio mostrando a opção 'Adicionar Vista...' destacada ao clicar com o botão direito do mouse no método Persons()

  • Selecione "Visão Razor " para o novo item com andaimes.

Adicionar caixa de diálogo Razor View no Visual Studio mostrando a seleção de modelo de lista e classe de modelo Pessoa com opções de layout

  • Selecione o modelo "Lista" e a classe de modelo Person.

Adicionar caixa de diálogo Razor View no Visual Studio mostrando a seleção de modelos de lista e classes de modelo Pessoa com opções de layout

Isso cria um arquivo .cshtml chamado Persons.

  • Navegue até a pasta "Views" -> pasta "Home" -> arquivo Persons.cshtml.

Para adicionar um botão que invoque a ação Persons, use o código abaixo:

@using (Html.BeginForm("Persons", "Home", FormMethod.Post))
{
    <input type="submit" value="Print Person" />
}
@using (Html.BeginForm("Persons", "Home", FormMethod.Post))
{
    <input type="submit" value="Print Person" />
}
HTML

Por que usar FormMethod.Post para geração de PDF?

O uso de POST para geração de PDFs segue as melhores práticas da web, tornando a ação explícita e evitando a geração indesejada de PDFs devido a atualizações do navegador ou URLs salvos como favoritos. As solicitações GET devem ser idempotentes (não alterar o estado do servidor), enquanto as solicitações POST indicam uma ação que produz um resultado – neste caso, a geração de um documento PDF.

Como posso estilizar o botão de impressão em PDF?

Estilize o botão de impressão usando classes CSS e aprimore-o com JavaScript para uma melhor experiência do usuário. Aqui está uma versão melhorada:

@using (Html.BeginForm("Persons", "Home", FormMethod.Post, new { @class = "pdf-form" }))
{
    <button type="submit" class="btn btn-primary pdf-download-btn">
        <i class="fas fa-file-pdf"></i> Download as PDF
    </button>
}

<style>
    .pdf-download-btn {
        background-color: #dc3545;
        color: white;
        padding: 10px 20px;
        border: none;
        border-radius: 5px;
        cursor: pointer;
        transition: background-color 0.3s ease;
    }

    .pdf-download-btn:hover {
        background-color: #c82333;
    }

    .pdf-download-btn:active {
        transform: translateY(1px);
    }
</style>

<script>
    // Optional: Show loading indicator during PDF generation
    document.querySelector('.pdf-form').addEventListener('submit', function() {
        const button = this.querySelector('button');
        button.innerHTML = '<i class="fas fa-spinner fa-spin"></i> Generating PDF...';
        button.disabled = true;
    });
</script>
@using (Html.BeginForm("Persons", "Home", FormMethod.Post, new { @class = "pdf-form" }))
{
    <button type="submit" class="btn btn-primary pdf-download-btn">
        <i class="fas fa-file-pdf"></i> Download as PDF
    </button>
}

<style>
    .pdf-download-btn {
        background-color: #dc3545;
        color: white;
        padding: 10px 20px;
        border: none;
        border-radius: 5px;
        cursor: pointer;
        transition: background-color 0.3s ease;
    }

    .pdf-download-btn:hover {
        background-color: #c82333;
    }

    .pdf-download-btn:active {
        transform: translateY(1px);
    }
</style>

<script>
    // Optional: Show loading indicator during PDF generation
    document.querySelector('.pdf-form').addEventListener('submit', function() {
        const button = this.querySelector('button');
        button.innerHTML = '<i class="fas fa-spinner fa-spin"></i> Generating PDF...';
        button.disabled = true;
    });
</script>
HTML

Quais modelos de visualização funcionam melhor para PDFs?

Os modelos List e Details funcionam particularmente bem para a geração de PDFs, pois fornecem layouts estruturados. Modelos personalizados, criados especificamente para saída em PDF, geralmente produzem os melhores resultados. Considere criar visualizações de PDF dedicadas que otimizem o layout para impressão em vez da exibição na tela, removendo elementos de navegação e focando na apresentação do conteúdo.

Como adiciono uma seção à barra de navegação superior?

  • Na mesma pasta "Views", navegue até a pasta "Shared" -> _Layout.cshtml. Coloque o item de navegação Person depois de Home.

Certifique-se de que o valor do atributo asp-action corresponda exatamente ao nome do nosso arquivo, que neste caso é Persons.

<header>
    <nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
        <div class="container-fluid">
            <a class="navbar-brand" asp-area="" asp-controller="Home" asp-action="Index">ViewToPdfMVCCoreSample</a>
            <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target=".navbar-collapse" aria-controls="navbarSupportedContent"
                    aria-expanded="false" aria-label="Toggle navigation">
                <span class="navbar-toggler-icon"></span>
            </button>
            <div class="navbar-collapse collapse d-sm-inline-flex justify-content-between">
                <ul class="navbar-nav flex-grow-1">
                    <li class="nav-item">
                        <a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Index">Home</a>
                    </li>
                    <li class="nav-item">
                        <a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Persons">Person</a>
                    </li>
                    <li class="nav-item">
                        <a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Privacy">Privacy</a>
                    </li>
                </ul>
            </div>
        </div>
    </nav>
</header>
<header>
    <nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
        <div class="container-fluid">
            <a class="navbar-brand" asp-area="" asp-controller="Home" asp-action="Index">ViewToPdfMVCCoreSample</a>
            <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target=".navbar-collapse" aria-controls="navbarSupportedContent"
                    aria-expanded="false" aria-label="Toggle navigation">
                <span class="navbar-toggler-icon"></span>
            </button>
            <div class="navbar-collapse collapse d-sm-inline-flex justify-content-between">
                <ul class="navbar-nav flex-grow-1">
                    <li class="nav-item">
                        <a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Index">Home</a>
                    </li>
                    <li class="nav-item">
                        <a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Persons">Person</a>
                    </li>
                    <li class="nav-item">
                        <a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Privacy">Privacy</a>
                    </li>
                </ul>
            </div>
        </div>
    </nav>
</header>
HTML

Por que o asp-action precisa corresponder exatamente?

O atributo asp-action utiliza os auxiliares de tag do ASP.NET Core para gerar a URL correta com base na sua configuração de roteamento. Uma correspondência exata garante que o link seja direcionado para a ação correta do controlador. Incompatibilidades resultam em erros 404 ou no direcionamento para ações não intencionais. O sistema de tags auxiliares diferencia maiúsculas de minúsculas e deve corresponder exatamente ao nome do método no seu controlador.

Quando os links de navegação não correspondem às ações do controlador, os usuários encontram erros 404 ou são redirecionados para páginas incorretas. Durante o desenvolvimento, a página de exceções do desenvolvedor do ASP.NET Core exibe erros de roteamento detalhados. Em produção, os usuários veem páginas de erro genéricas. Verifique sempre se os links de navegação correspondem exatamente aos nomes das ações do controlador para evitar problemas na experiência do usuário.

Como faço para editar o arquivo Program.cs?

Registre a interface IHttpContextAccessor e IRazorViewRenderer no contêiner de injeção de dependência (DI). Confira o código abaixo para referência.

using IronPdf.Extensions.Mvc.Core;
using Microsoft.AspNetCore.Mvc.ViewFeatures;

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddControllersWithViews();

builder.Services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
builder.Services.AddSingleton<ITempDataProvider, CookieTempDataProvider>();

// Register IRazorViewRenderer here
builder.Services.AddSingleton<IRazorViewRenderer, RazorViewRenderer>();

// Optional: Configure IronPDF license if you have one
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY-HERE";

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Home/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

app.Run();
using IronPdf.Extensions.Mvc.Core;
using Microsoft.AspNetCore.Mvc.ViewFeatures;

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddControllersWithViews();

builder.Services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
builder.Services.AddSingleton<ITempDataProvider, CookieTempDataProvider>();

// Register IRazorViewRenderer here
builder.Services.AddSingleton<IRazorViewRenderer, RazorViewRenderer>();

// Optional: Configure IronPDF license if you have one
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY-HERE";

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Home/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

app.Run();
Imports IronPdf.Extensions.Mvc.Core
Imports Microsoft.AspNetCore.Mvc.ViewFeatures

Dim builder = WebApplication.CreateBuilder(args)

' Add services to the container.
builder.Services.AddControllersWithViews()

builder.Services.AddSingleton(Of IHttpContextAccessor, HttpContextAccessor)()
builder.Services.AddSingleton(Of ITempDataProvider, CookieTempDataProvider)()

' Register IRazorViewRenderer here
builder.Services.AddSingleton(Of IRazorViewRenderer, RazorViewRenderer)()

' Optional: Configure IronPDF license if you have one
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY-HERE"

Dim app = builder.Build()

' Configure the HTTP request pipeline.
If Not app.Environment.IsDevelopment() Then
    app.UseExceptionHandler("/Home/Error")
    ' The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts()
End If

app.UseHttpsRedirection()
app.UseStaticFiles()

app.UseRouting()

app.UseAuthorization()

app.MapControllerRoute(
    name:="default",
    pattern:="{controller=Home}/{action=Index}/{id?}")

app.Run()
$vbLabelText   $csharpLabel

Por que registrar serviços como Singleton?

Os serviços singleton são criados uma única vez e reutilizados ao longo da vida útil do aplicativo, tornando-os eficientes para serviços sem estado como IRazorViewRenderer. Esse padrão reduz a sobrecarga de memória e melhora o desempenho, já que o serviço de renderização da visualização não mantém um estado específico da solicitação. O IHttpContextAccessor deve ser um singleton para ser acessível em diferentes ciclos de vida do serviço.

Para que serve o ITempDataProvider?

ITempDataProvider permite o armazenamento temporário de dados entre solicitações, comumente usado para exibir mensagens após redirecionamentos. No contexto da geração de PDFs, isso garante que o estado da visualização seja mantido corretamente ao renderizar as visualizações em PDF. O CookieTempDataProvider armazena esses dados temporários em cookies criptografados, fornecendo um mecanismo seguro para o gerenciamento de estado.

Posso usar serviços com escopo definido?

Embora você possa usar serviços com escopo para alguns cenários, IRazorViewRenderer funciona melhor como um singleton porque não mantém um estado específico da solicitação. O uso de serviços com escopo criaria novas instâncias para cada solicitação, aumentando o uso de memória sem nenhum benefício. No entanto, se você precisar injetar serviços com escopo em suas visualizações, assegure-se de gerenciar adequadamente o ciclo de vida do serviço para evitar erros em tempo de execução.

Execute o projeto

Este vídeo mostra como executar o projeto e gerar um documento PDF. Ao executar o aplicativo, navegue até a página Persons usando o menu de navegação superior e clique no botão Print Person para gerar e baixar o PDF.

Visual Studio showing HomeController.cs with ASP.NET Core MVC controller code and IntelliSense assistance

Onde posso baixar o projeto ASP.NET Core MVC?

Baixe o código completo deste guia. Ele está compactado em um arquivo zip que você pode abrir no Visual Studio como um projeto de Aplicativo Web ASP.NET Core (Model-View-Controller).

Baixe o projeto de exemplo ASP.NET Core MVC

O que está incluído no projeto de exemplo?

O projeto de exemplo inclui um aplicativo ASP.NET Core MVC totalmente configurado com integração ao IronPDF , demonstrando a conversão de visualização para PDF. Ele contém o modelo Person, HomeController com lógica de geração de PDF, Persons view com sintaxe Razor adequada e todos os registros de serviço necessários em Program.cs. O projeto também inclui exemplos de configurações de estilo e layout otimizadas para saída em PDF.

Qual versão do Visual Studio devo usar?

Para obter a melhor experiência com projetos .NET 6+, recomenda-se o Visual Studio 2022 (versão 17.0 ou posterior). O Visual Studio Code com extensões C# também funciona bem para desenvolvimento multiplataforma. Certifique-se de ter o ASP.NET e o pacote de desenvolvimento web instalados. O projeto tem como alvo o .NET 6.0 por padrão, mas pode ser atualizado para versões mais recentes.

Como posso solucionar problemas de configuração de projeto?

Problemas comuns de instalação incluem pacotes NuGet ausentes, versões incorretas do SDK do .NET ou problemas de configuração. Primeiro, restaure os pacotes NuGet usando dotnet restore ou através do Gerenciador de Pacotes do Visual Studio. Verifique se a versão do seu SDK .NET corresponde aos requisitos do projeto usando dotnet --version. Para questões relacionadas ao licenciamento, consulte a documentação da chave de licença. Caso ocorram problemas de renderização, consulte o guia de solução de problemas para obter soluções.

Pronto para ver o que mais você pode fazer? Confira nossa página de tutoriais aqui: Converter PDFs

Perguntas frequentes

Qual é a maneira mais fácil de converter visualizações CSHTML em PDF no ASP.NET Core MVC?

A maneira mais fácil é usar o método RenderRazorViewToPdf do IronPDF, que pode converter seus arquivos .cshtml em documentos PDF com apenas uma linha de código. Basta chamar: new IronPDF.ChromePdfRenderer().RenderRazorViewToPdf(HttpContext, "Views/Home/Report.cshtml", model).SaveAs("report.pdf");

Quais pacotes NuGet eu preciso para converter Views em PDFs no ASP.NET Core MVC?

Você precisa de dois pacotes: IronPDF (o pacote principal) e IronPDF.Extensions.Mvc.Core (o pacote de extensão). O pacote de extensão fornece funcionalidades específicas para integração com o sistema de injeção de dependência do ASP.NET Core e o pipeline de renderização de visualizações Razor.

Posso aplicar estilos CSS e JavaScript ao converter CSHTML para PDF?

Sim, o IronPDF oferece suporte completo a estilos CSS, execução de JavaScript e fontes personalizadas ao renderizar visualizações em PDF. Isso garante que seus PDFs mantenham a mesma aparência e funcionalidade de suas visualizações da web, incluindo CSS responsivo e conteúdo JavaScript dinâmico.

Quais são os principais passos para implementar a conversão de View para PDF no meu projeto ASP.NET Core MVC?

O fluxo de trabalho envolve 5 etapas: 1) Baixe o IronPDF e sua extensão MVC Core, 2) Adicione uma classe de modelo para seus dados, 3) Edite seu Controller para usar o método RenderRazorViewToPdf, 4) Crie ou modifique uma View (arquivo .cshtml) para renderização de PDF e 5) Execute seu aplicativo para gerar PDFs.

Como o padrão MVC funciona com a geração de PDFs a partir de Views?

No ASP.NET Core MVC, o Modelo contém seus dados e lógica de negócios, a Visualização (seu arquivo .cshtml) apresenta a interface do usuário e exibe os dados, e o Controlador lida com as solicitações e usa o método RenderRazorViewToPdf do IronPDF para orquestrar a geração do PDF a partir da Visualização.

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
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 18,318,263 | Versão: 2026.4 acaba de ser 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.