DEV Community

IronSoftware
IronSoftware

Posted on

MVC View to PDF in C# (.NET Guide)

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");
    }
}
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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");
    }
}
Enter fullscreen mode Exit fullscreen mode

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");
}
Enter fullscreen mode Exit fullscreen mode

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>
Enter fullscreen mode Exit fullscreen mode

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");
}
Enter fullscreen mode Exit fullscreen mode

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");
}
Enter fullscreen mode Exit fullscreen mode

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>
Enter fullscreen mode Exit fullscreen mode

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 -->
Enter fullscreen mode Exit fullscreen mode

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>
Enter fullscreen mode Exit fullscreen mode

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());
    }
}
Enter fullscreen mode Exit fullscreen mode

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");
    }
}
Enter fullscreen mode Exit fullscreen mode

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>
Enter fullscreen mode Exit fullscreen mode

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" />
Enter fullscreen mode Exit fullscreen mode

In the controller, set base URL if needed:

renderer.RenderingOptions.BaseUrl = new Uri(Request.Url.GetLeftPart(UriPartial.Authority));
Enter fullscreen mode Exit fullscreen mode

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)