Converting MVC views to PDF lets you generate downloadable reports, invoices, and documents using your existing Razor templates. No need to duplicate HTML—render your views directly to PDF.
using IronPdf;
using IronPdf.Extensions.Mvc.Framework;
// Install via NuGet: Install-Package IronPdf.Extensions.Mvc.Framework
public class ReportController : Controller
{
public ActionResult DownloadReport()
{
var pdf = new [ChromePdfRenderer](https://ironpdf.com/blog/videos/how-to-render-an-html-file-to-pdf-in-csharp-ironpdf/)();
var document = pdf.RenderView(HttpContext, "~/Views/Report/Invoice.cshtml", model);
return File(document.BinaryData, "application/pdf", "report.pdf");
}
}
IronPDF's MVC extension renders your .cshtml views with full CSS and layout support.
Which Package Do I Need?
| Framework | Package |
|---|---|
| ASP.NET MVC (.NET Framework) | IronPdf.Extensions.Mvc.Framework |
| ASP.NET Core MVC | IronPdf.Extensions.Mvc.Core |
Both require the main IronPdf package as a dependency.
# For .NET Framework MVC
Install-Package IronPdf
Install-Package IronPdf.Extensions.Mvc.Framework
# For .NET Core / .NET 5+
Install-Package IronPdf
Install-Package IronPdf.Extensions.Mvc.Core
How Do I Render a View to PDF?
Basic view rendering:
using IronPdf;
using IronPdf.Extensions.Mvc.Framework;
// Install via NuGet: Install-Package IronPdf.Extensions.Mvc.Framework
public class InvoiceController : Controller
{
public ActionResult GenerateInvoice(int id)
{
var invoice = _invoiceService.GetInvoice(id);
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderView(
HttpContext,
"~/Views/Invoice/Template.cshtml",
invoice);
return File(pdf.BinaryData, "application/pdf", $"invoice-{id}.pdf");
}
}
The view renders with your model data, CSS, and layout—then converts to PDF.
How Do I Pass a Model to the View?
Views receive strongly-typed models:
using IronPdf;
using IronPdf.Extensions.Mvc.Framework;
// Install via NuGet: Install-Package IronPdf.Extensions.Mvc.Framework
// Model
public class ReportModel
{
public string Title { get; set; }
public DateTime GeneratedDate { get; set; }
public List<DataRow> Rows { get; set; }
}
// Controller
public ActionResult DownloadReport()
{
var model = new ReportModel
{
Title = "Monthly Sales Report",
GeneratedDate = DateTime.Now,
Rows = _dataService.GetMonthlyData()
};
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderView(HttpContext, "~/Views/Reports/Monthly.cshtml", model);
return File(pdf.BinaryData, "application/pdf", "monthly-report.pdf");
}
The view:
@model ReportModel
<h1>@Model.Title</h1>
<p>Generated: @Model.GeneratedDate.ToString("MMMM dd, yyyy")</p>
<table>
<tr>
<th>Product</th>
<th>Quantity</th>
<th>Revenue</th>
</tr>
@foreach (var row in Model.Rows)
{
<tr>
<td>@row.Product</td>
<td>@row.Quantity</td>
<td>@row.Revenue.ToString("C")</td>
</tr>
}
</table>
How Do I Add Headers and Footers?
Configure rendering options for consistent headers/footers:
using IronPdf;
using IronPdf.Extensions.Mvc.Framework;
// Install via NuGet: Install-Package IronPdf.Extensions.Mvc.Framework
public ActionResult DownloadWithBranding()
{
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
{
HtmlFragment = @"
<div style='text-align:center; font-size:10px;'>
Company Name | Confidential
</div>",
DrawDividerLine = true
};
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
HtmlFragment = @"
<div style='text-align:center; font-size:10px;'>
Page {page} of {total-pages}
</div>"
};
var pdf = renderer.RenderView(HttpContext, "~/Views/Report/Template.cshtml", model);
return File(pdf.BinaryData, "application/pdf", "report.pdf");
}
How Do I Set Page Size and Margins?
Configure paper settings:
using IronPdf;
using IronPdf.Extensions.Mvc.Framework;
// Install via NuGet: Install-Package IronPdf.Extensions.Mvc.Framework
public ActionResult DownloadA4Report()
{
var renderer = new ChromePdfRenderer();
// A4 paper, landscape
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape;
// Custom margins (millimeters)
renderer.RenderingOptions.MarginTop = 20;
renderer.RenderingOptions.MarginBottom = 20;
renderer.RenderingOptions.MarginLeft = 15;
renderer.RenderingOptions.MarginRight = 15;
var pdf = renderer.RenderView(HttpContext, "~/Views/Report/Wide.cshtml", model);
return File(pdf.BinaryData, "application/pdf", "wide-report.pdf");
}
How Do I Handle CSS and Styles?
Views render with full CSS support:
@model ReportModel
<!DOCTYPE html>
<html>
<head>
<style>
body {
font-family: Arial, sans-serif;
margin: 0;
padding: 20px;
}
h1 {
color: #333;
border-bottom: 2px solid #007bff;
padding-bottom: 10px;
}
table {
width: 100%;
border-collapse: collapse;
margin-top: 20px;
}
th, td {
border: 1px solid #ddd;
padding: 12px;
text-align: left;
}
th {
background-color: #007bff;
color: white;
}
tr:nth-child(even) {
background-color: #f9f9f9;
}
.total-row {
font-weight: bold;
background-color: #e9ecef;
}
@media print {
.no-print { display: none; }
}
</style>
</head>
<body>
<h1>@Model.Title</h1>
<!-- Content -->
</body>
</html>
Inline styles or embedded <style> blocks work best for PDF rendering.
How Do I Use Layout Pages?
Render with shared layouts:
using IronPdf;
using IronPdf.Extensions.Mvc.Framework;
// Install via NuGet: Install-Package IronPdf.Extensions.Mvc.Framework
// The view can reference a layout
// ~/Views/Report/Invoice.cshtml
@{
Layout = "~/Views/Shared/_PdfLayout.cshtml";
}
@model InvoiceModel
<h1>Invoice #@Model.InvoiceNumber</h1>
<!-- Invoice content -->
Create a PDF-specific layout:
<!-- ~/Views/Shared/_PdfLayout.cshtml -->
<!DOCTYPE html>
<html>
<head>
<style>
/* PDF-optimized styles */
body { font-family: Arial; padding: 20px; }
@page { margin: 1cm; }
</style>
</head>
<body>
<header>
<img src="/images/logo.png" style="height: 40px;" />
</header>
@RenderBody()
<footer>
<p style="text-align: center; font-size: 10px;">
© @DateTime.Now.Year Company Name
</p>
</footer>
</body>
</html>
How Do I Display PDF in Browser vs Download?
Control the response:
using IronPdf;
using IronPdf.Extensions.Mvc.Framework;
// Install via NuGet: Install-Package IronPdf.Extensions.Mvc.Framework
public class PdfController : Controller
{
// Download (attachment)
public ActionResult Download()
{
var pdf = RenderPdf();
return File(pdf.BinaryData, "application/pdf", "document.pdf");
}
// View in browser (inline)
public ActionResult View()
{
var pdf = RenderPdf();
Response.Headers.Add("Content-Disposition", "inline; filename=document.pdf");
return File(pdf.BinaryData, "application/pdf");
}
private PdfDocument RenderPdf()
{
var renderer = new ChromePdfRenderer();
return renderer.RenderView(HttpContext, "~/Views/Report/Template.cshtml", GetModel());
}
}
How Do I Generate Invoices?
Complete invoice generation example:
using IronPdf;
using IronPdf.Extensions.Mvc.Framework;
// Install via NuGet: Install-Package IronPdf.Extensions.Mvc.Framework
public class InvoiceController : Controller
{
private readonly IInvoiceService _invoiceService;
public InvoiceController(IInvoiceService invoiceService)
{
_invoiceService = invoiceService;
}
public ActionResult DownloadInvoice(int id)
{
var invoice = _invoiceService.GetById(id);
if (invoice == null)
return HttpNotFound();
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.MarginTop = 25;
renderer.RenderingOptions.MarginBottom = 25;
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
HtmlFragment = "<div style='text-align:center; font-size:9px;'>Thank you for your business</div>"
};
var pdf = renderer.RenderView(HttpContext, "~/Views/Invoice/Template.cshtml", invoice);
return File(
pdf.BinaryData,
"application/pdf",
$"Invoice-{invoice.InvoiceNumber}.pdf");
}
}
Invoice view:
@model Invoice
<!DOCTYPE html>
<html>
<head>
<style>
body { font-family: Arial; padding: 30px; }
.header { display: flex; justify-content: space-between; }
.invoice-info { text-align: right; }
table { width: 100%; margin-top: 30px; border-collapse: collapse; }
th, td { padding: 10px; border-bottom: 1px solid #ddd; }
th { background: #f5f5f5; text-align: left; }
.total { font-size: 1.2em; font-weight: bold; text-align: right; }
</style>
</head>
<body>
<div class="header">
<div>
<h1>INVOICE</h1>
<p>@Model.CompanyName</p>
</div>
<div class="invoice-info">
<p><strong>Invoice #:</strong> @Model.InvoiceNumber</p>
<p><strong>Date:</strong> @Model.Date.ToString("MMM dd, yyyy")</p>
<p><strong>Due:</strong> @Model.DueDate.ToString("MMM dd, yyyy")</p>
</div>
</div>
<h3>Bill To:</h3>
<p>@Model.CustomerName<br/>@Model.CustomerAddress</p>
<table>
<tr>
<th>Description</th>
<th>Qty</th>
<th>Price</th>
<th>Total</th>
</tr>
@foreach (var item in Model.LineItems)
{
<tr>
<td>@item.Description</td>
<td>@item.Quantity</td>
<td>@item.UnitPrice.ToString("C")</td>
<td>@item.Total.ToString("C")</td>
</tr>
}
</table>
<p class="total">Total: @Model.Total.ToString("C")</p>
</body>
</html>
How Do I Handle Images in Views?
Use absolute URLs or base64 for reliable image rendering:
<!-- Absolute URL (ensure accessible) -->
<img src="https://yoursite.com/images/logo.png" />
<!-- Or embed as base64 -->
<img src="data:image/png;base64,@Convert.ToBase64String(Model.LogoBytes)" />
<!-- Or use file path -->
<img src="file:///C:/WebApp/Content/images/logo.png" />
In the controller, set base URL if needed:
renderer.RenderingOptions.BaseUrl = new Uri(Request.Url.GetLeftPart(UriPartial.Authority));
Quick Reference
| Task | Code |
|---|---|
| Render view | renderer.RenderView(HttpContext, viewPath, model) |
| Return PDF download | File(pdf.BinaryData, "application/pdf", "name.pdf") |
| Return PDF inline |
File(pdf.BinaryData, "application/pdf") + inline header |
| Set paper size | RenderingOptions.PaperSize = PdfPaperSize.A4 |
| Set orientation | RenderingOptions.PaperOrientation |
| Add header | RenderingOptions.HtmlHeader |
| Add footer | RenderingOptions.HtmlFooter |
MVC view-to-PDF conversion keeps your templates DRY. Design once in Razor, output as HTML or PDF.
For more MVC conversion options, see the IronPDF MVC documentation.
Written by Jacob Mellor, CTO at Iron Software. Jacob created IronPDF and leads a team of 50+ engineers building .NET document processing libraries.
Top comments (0)