如何在ASP NET Core MVC中将视图转换为PDF

How to Convert Views to PDFs in ASP.NET Core MVC

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

视图是 ASP.NET 框架中用于在 Web 应用程序中生成 HTML 标记的组件。 它是模型-视图-控制器 (MVC) 模式的一部分,通常用于 ASP.NET MVC 和 ASP.NET Core MVC 应用程序。 视图负责通过动态呈现 HTML 内容来向用户呈现数据。

快速入门:在 ASP.NET Core 中轻松将 CSHTML 转换为 PDF

使用 IronPDF 可以轻松地将 ASP.NET Core MVC 视图转换为 PDF。 只需一行代码,就可以将 '.cshtml' 文件渲染为高质量的 PDF 文档。 通过将此功能直接集成到 MVC 应用程序中,简化开发过程,从动态 HTML 视图无缝生成 PDF。 按照指南设置您的环境,立即开始转换。

Nuget IconGet started making PDFs with NuGet now:

  1. Install IronPDF with NuGet Package Manager

    PM > Install-Package IronPdf

  2. Copy and run this code snippet.

    // using IronPdf.Extensions.Mvc.Core
    new IronPdf.ChromePdfRenderer().RenderRazorViewToPdf(HttpContext, "Views/Home/Report.cshtml", model).SaveAs("report.pdf");
  3. Deploy to test on your live environment

    Start using IronPDF in your project today with a free trial
    arrow pointer

ASP.NET Core Web App MVC (模型-视图-控制器) 是 Microsoft 提供的用于使用 ASP.NET Core 构建 Web 应用程序的 Web 应用程序。

  • 模型:表示数据和业务逻辑,管理数据交互,并与数据源通信。
  • 视图:呈现用户界面,专注于显示数据并向用户呈现信息。
  • 控制器:处理用户输入、响应请求、与模型通信,并协调模型和视图之间的交互。

IronPDF 简化了在 ASP.NET Core MVC 项目中从视图创建 PDF 文件的过程。 这使得在 ASP.NET Core MVC 中生成 PDF 变得简单而直接。

class="hsg-featured-snippet">

最小工作流程(5 步)

  1. 下载用于在 ASP.NET Core MVC 中将视图转换为 PDF 的 C# 库
  2. 为数据添加模型类
  3. 编辑“HomeController.cs”文件并使用 RenderRazorViewToPdf 方法
  4. 创建一个新视图并编辑“.cshtml”文件以渲染 PDF
  5. 下载示例项目以快速入门

IronPDF 扩展包

IronPdf.Extensions.Mvc.Core 包是主 IronPdf 包的扩展。 将视图渲染为 PDF 文档需要 IronPdf.Extensions.Mvc.Core 和 IronPdf 两个包在 ASP.NET Core MVC 中。

Install-Package IronPdf.Extensions.Mvc.Core

class="products-download-section">
data-modal-id="trial-license-after-download">
class="product-image">C# NuGet Library for PDF
class="product-info">

使用 NuGet 安装

data-original-title="点击复制">
class="copy-nuget-row">
Install-Package IronPdf.Extensions.Mvc.Core
class="copy-button">
class="nuget-link">nuget.org/packages/IronPdf.Extensions.Mvc.Core/

将视图渲染为 PDF

将视图转换为 PDF 文件,您将需要一个 ASP.NET Core Web App (模型-视图-控制器) 项目。

添加模型类

  • 导航到“Models”文件夹。
  • 创建一个新的 C# 类文件名为“Person”。此类将作为模型来表示个人数据。 使用以下代码片段:
: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

编辑控制器

导航到“Controllers”文件夹并打开“HomeController”文件。我们将仅对 HomeController 进行更改并添加“Persons”操作。 请参考下面的代码进行指导:

下面的代码首先实例化 ChromePdfRenderer 类,传入 IRazorViewRenderer、我们“Persons.cshtml”文件的路径,以及包含所需数据的列表到 RenderRazorViewToPdf 方法。 用户可以利用 RenderingOptions 来访问多种功能,例如添加自定义文本,包括 HTML 页眉和页脚在生成的 PDF 中,定义自定义边距,以及应用页码。

请注意The PDF document can be viewed in the browser using the following code: File(pdf.BinaryData, "application/pdf"). 然而,在浏览器中查看后下载 PDF 会导致 PDF 文档损坏。

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();

                // 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();

                // 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(ByVal logger As ILogger(Of HomeController), ByVal viewRenderService As IRazorViewRenderer, ByVal 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
'INSTANT VB NOTE: The local variable persons was renamed since Visual Basic will not allow local variables with the same name as their enclosing function or property:
			Dim persons_Conflict = 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()

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

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

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

			Return View(persons_Conflict)
		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

使用 RenderRazorViewToPdf 方法后,您将获得一个 PdfDocument 对象,可以进一步进行增强和修改。 您可以灵活地将 PDF 转换为 PDF/A 或 PDF/UA 格式,在生成的 PDF 中添加您的数字签名,或根据需要合并和拆分 PDF 文档。 此外,该库允许您旋转页面,插入注释或书签,并在您的 PDF 文件上加盖独特的水印。

添加视图

  • 右键单击新添加的 Persons 操作并选择“添加视图”。

右键单击 Persons 操作

  • 为新的脚手架项选择“Razor View”。

选择脚手架

  • 选择“列表”模板和“Person”模型类。

添加视图

这将创建一个名为“Persons”的 .cshtml 文件。

  • 导航到“Views”文件夹 -> “Home”文件夹 -> “Persons.cshtml”文件。

要添加一个调用“Persons”操作的按钮,请使用下面的代码:

@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

在顶部导航栏添加一个部分

  • 在同一个“Views”文件夹内导航到“Shared”文件夹 -> _Layout.cshtml。 将“Person”导航项放在“Home”之后。

确保 asp-action 属性的值与我们的文件名完全匹配,在本例中是“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

编辑 Program.cs 文件

我们将把 IHttpContextAccessorIRazorViewRenderer 接口注册到依赖注入 (DI) 容器。 请检查下面的代码以供参考。

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>();

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>();

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

Private 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)()

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

运行项目

这将向您展示如何运行项目并生成 PDF 文档。

运行 ASP.NET Core MVC 项目

下载 ASP.NET Core MVC 项目

您可以下载本指南的完整代码。它作为一个压缩文件,您可以在 Visual Studio 中打开它作为 ASP.NET Core Web App (模型-视图-控制器) 项目。

下载 ASP.NET Core MVC 示例项目

准备好看看您还能做些什么吗? 查看我们的教程页面:转换PDF文档

常见问题解答

我如何在 ASP.NET Core MVC 中将 CSHTML 转换为 PDF?

您可以使用 IronPDF 的 `RenderRazorViewToPdf` 方法在 ASP.NET Core MVC 项目中将 CSHTML 文件转换为 PDF。

在 ASP.NET Core MVC 项目中设置 PDF 生成有哪些必要步骤?

要设置 PDF 生成,请通过 NuGet 下载 IronPDF 库,创建一个模型类,编辑 HomeController 以使用 `RenderRazorViewToPdf` 方法,并在 'Program.cs' 文件中为 `IHttpContextAccessor` 和 `IRazorViewRenderer` 设置依赖注入。

为什么在 ASP.NET Core 中 PDF 转换需要依赖注入?

为 `IHttpContextAccessor` 和 `IRazorViewRenderer` 设置依赖注入是必要的,以正确地将视图呈现为 PDF,确保 Razor 视图呈现上下文正确建立。

在 ASP.NET Core MVC 中转换视图时我可以自定义 PDF 输出吗?

是的,使用 IronPDF,您可以通过调整页眉、页脚、边距和其他设置自定义 PDF 输出。

`RenderRazorViewToPdf` 方法在 PDF 转换中的作用是什么?

`RenderRazorViewToPdf` 方法对于将 Razor 视图转换为 PDF 文档至关重要,提供自定义 PDF 外观和内容的选项。

如何确保我的 ASP.NET Core MVC 项目支持 PDF 转换?

通过安装 IronPdf.Extensions.Mvc.Core 包并在项目中配置必要的服务和模型,确保您的项目支持 PDF 转换。

是否可以向从视图生成的 PDF 添加交互元素?

可以,在使用 IronPDF 生成 PDF 后,您可以添加交互元素如表单、链接和书签,以增强文档内的用户交互。

在哪里可以找到将视图转换为 PDF 的示例项目?

您可以下载指南中提供的示例项目,该项目演示在 ASP.NET Core Web 应用程序中将视图转换为 PDF 的完整设置。

如何在我的 ASP.NET Core MVC 项目中安装 IronPDF?

通过命令 Install-Package IronPdf.Extensions.Mvc.Core 使用 NuGet 包管理器安装 IronPDF。

IronPDF 是否兼容 .NET 10,能够将 CSHTML 视图转换为 PDF?

是的——IronPDF 完全兼容 .NET 10,并支持使用其现有的 API(如 `RenderRazorViewToPdf`)将 CSHTML 视图渲染为 PDF,无需额外配置。

Chaknith Bin
软件工程师
Chaknith 在 IronXL 和 IronBarcode 工作。他在 C# 和 .NET 方面有着深厚的专业知识,帮助改进软件并支持客户。他从用户互动中获得的见解有助于更好的产品、文档和整体体验。
审核者
Jeff Fritz
Jeffrey T. Fritz
首席项目经理 - .NET 社区团队
Jeff 也是 .NET 和 Visual Studio 团队的首席项目经理。他是 .NET Conf 虚拟会议系列的执行制片人,并主持“Fritz and Friends”直播节目,每周两次与观众一起谈论技术并编写代码。Jeff 撰写研讨会、演示文稿并计划包括 Microsoft Build、Microsoft Ignite、.NET Conf 和 Microsoft MVP 峰会在内的最大型微软开发者活动的内容。
准备开始了吗?
Nuget 下载 16,154,058 | 版本: 2025.11 刚刚发布