Como converter Views em PDFs em C# ASP.NET Core MVC
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.
-
Instale IronPDF com o Gerenciador de Pacotes NuGet
PM > Install-Package IronPdf -
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"); -
Implante para testar em seu ambiente de produção.
Comece a usar IronPDF em seu projeto hoje com uma avaliação gratuita
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 .
Fluxo de trabalho mínimo (5 etapas)
- Baixe a biblioteca C# para converter Views em PDFs no ASP.NET Core MVC.
- Adicione uma classe de modelo para os dados.
- Edite o arquivo "HomeController.cs" e utilize o método `RenderRazorViewToPdf`
- Crie uma nova visualização e edite o arquivo ".cshtml" para renderizar o PDF.
- Baixe o projeto de exemplo para começar rapidamente.
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.
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
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
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.
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
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}
}
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
Personrecém-adicionada e selecione "Adicionar visualização".

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

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

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" />
}
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>
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çãoPersondepois deHome.
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>
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.
O que acontece se os links de navegação não corresponderem?
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()
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.
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.

