IRONSOFTWAREHOME
使用IRONPDF

在ASP.NET Core中使用C#将HTML转换为PDF -- IronPDF指南

Curtis Chau
Curtis Chau
Updated: 2026年6月20日

在 ASP.NET Core 应用程序中构建 PDF 查看器比大多数开发人员想象的要容易。 通过在服务器端生成 PDF 并以正确的 MIME 类型返回,您可以直接在任何现代浏览器中显示文档——无需插件,也无需 Adobe Acrobat Reader。 IronPDF 通过其基于 Chrome 的引擎处理渲染,将 HTML、CSS 和 JavaScript 转换为高保真 PDF,这些 PDF 会以内联方式显示在浏览器的内置查看器中。

本教程将引导您完成所有主要场景:显示由 HTML 字符串生成的 PDF、渲染实时 网址、转换 Razor 视图、流式传输大型文件,以及将所有内容连接到 ASP.NET Core MVC 控制器中。 代码示例针对 .NET 10,并在适用情况下使用顶级语句。

ASP.NET 中基于浏览器的 PDF 查看功能是如何工作的?

现代浏览器都内置了 PDF 查看器。 当服务器响应Content-Type: application/pdf标头时,浏览器会内联渲染文档,而不是触发文件下载。 关键是将该标头与Content-Disposition: inline配对。

在服务器端,您的任务是生成一个有效的PDF二进制文件,并通过FileResult返回它。 浏览器会自动处理分页、缩放、文本选择、搜索、打印和下载等功能,无需您编写任何额外的用户界面代码。

IronPDF 自然而然地契合了这种模式。 它的File()助手。 最终成果是一个功能齐全的文档查看器,可在 Chrome、Firefox、Edge 和 Safari 浏览器上运行。

现代浏览器通过其原生查看器引擎实现了W3C PDF 渲染规范,这意味着您的服务器返回的任何符合规范的 PDF 文件都将正确显示,无需额外配置。 IronPDF 的输出完全符合标准,因此您可以信赖跨浏览器版本的一致渲染效果。

对于容器化部署,IronPDF 提供官方 Docker 镜像,其中预配置了 Chromium 依赖项,因此您无需在每个节点上手动安装 Chrome。 Linux 和 Windows 容器均受支持。 如果您需要独立扩展 PDF 生成, IronPDF Engine Docker 镜像允许您将渲染过程作为单独的微服务运行。

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

在 Visual Studio 中打开您的 ASP.NET Core 项目,然后通过 NuGet 包管理器控制台安装 IronPDF:

PM > Install-Package IronPdf

或使用 .NET CLI:

dotnet add package IronPdf

安装后,将您的许可证密钥添加到Program.cs中,然后调用任何IronPDF API:

IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";

如果要部署到Azure ,请将许可证密钥存储在 Azure Key Vault 或应用程序配置中,而不是将其硬编码。 对于 AWS Lambda 部署,请使用在 Lambda 函数设置中配置的环境变量。

这就是全部设置步骤。IronPDF 会在 Windows 运行时自动检测并配置 Chromium。 在 Linux 系统上,请查阅Linux 安装指南,了解所需的几个系统软件包。

您可以先从免费试用版开始,评估全部功能,然后再选择用于生产环境的许可证级别。

如何从 HTML 字符串生成并显示 PDF?

将PDF呈现在用户面前的最快方法是渲染一个HTML字符串并内联返回。创建一个名为PdfController的控制器,并添加如下操作:

using IronPdf;
using Microsoft.AspNetCore.Mvc;

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllersWithViews();

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

public class PdfController : Controller
{
    private readonly ChromePdfRenderer _renderer;

    public PdfController()
    {
        _renderer = new ChromePdfRenderer();
        _renderer.RenderingOptions.WaitFor.RenderDelay(100);
        _renderer.RenderingOptions.Timeout = 30;
    }

    public IActionResult DisplayFromHtml()
    {
        string html = @"
            <html>
            <head>
                <style>
                    body { font-family: Arial, sans-serif; padding: 40px; }
                    h1   { color: #2c3e50; }
                    p    { line-height: 1.7; color: #444; }
                </style>
            </head>
            <body>
                <h1>Sample PDF Document</h1>
                <p>This PDF was generated using IronPDF in an ASP.NET Core application.</p>
            </body>
            </html>";

        PdfDocument pdf = _renderer.RenderHtmlAsPdf(html);

        Response.Headers.Append("Content-Disposition", "inline; filename=document.pdf");
        return File(pdf.BinaryData, "application/pdf");
    }
}

浏览器中渲染后的 PDF 文件是什么样子的?

浏览器显示标题为

ChromePdfRenderer在底层使用Chromium,因此CSS网格、弹性布局、网页字体和现代CSS特性都能准确渲染。 设置inline告诉浏览器显示文件而不是保存它。 如果您将该值更改为attachment,浏览器会提示用户下载。

对于布局复杂的文档,您可以通过自定义纸张尺寸、边距和打印 CSS 媒体类型等渲染选项来微调输出。 WaitFor API在容器化环境中尤其有用,因为网络延迟可能会延迟外部资源的加载。

要深入了解 HTML 转换选项,请参阅HTML 字符串转 PDF 指南

如何通过 网址 和 Razor 视图渲染 PDF 文件?

IronPDF 可以将任何实时网页捕获为 PDF 文件——非常适合存档网页内容或从现有页面生成报告。 ASP.NET Core 文档介绍了控制器操作如何返回结果,这也是这里使用的模式。

public IActionResult RenderFromUrl(string url = "https://en.wikipedia.org/wiki/Main_Page")
{
    var renderer = new ChromePdfRenderer();
    renderer.RenderingOptions.EnableJavaScript = true;
    renderer.RenderingOptions.CssMediaType = IronPdf.Rendering.PdfCssMediaType.Print;
    renderer.RenderingOptions.WaitFor.NetworkIdle();

    PdfDocument pdf = renderer.RenderUrlAsPdf(url);

    Response.Headers.Append("Content-Disposition", "inline; filename=webpage.pdf");
    Response.Headers.Append("Cache-Control", "public, max-age=3600");
    return File(pdf.BinaryData, "application/pdf");
}

基于网址的PDF渲染是如何显示的?

使用IronPDF在ASP.NET web应用程序中呈现的维基百科主页PDF查看器截图,显示了主页面内容和导航元素,并完全保留了CSS样式

当您需要转换Razor 视图(例如发票或对账单模板)时,首先需要将视图渲染为 HTML 字符串,然后将该字符串传递给 IronPDF。 这样可以确保您的模板在网页和PDF输出中均可重复使用:

public async Task<IActionResult> ViewToPdf()
{
    var model = new InvoiceModel
    {
        InvoiceNumber = 1001,
        InvoiceDate   = DateTime.Now,
        CustomerName  = "Acme Corp.",
        Items = new List<ItemModel>
        {
            new ItemModel { Description = "Product A", Quantity = 2, UnitPrice = 50.00m },
            new ItemModel { Description = "Service B", Quantity = 1, UnitPrice = 150.00m }
        }
    };
    model.TotalAmount = model.Items.Sum(i => i.LineTotal);

    string htmlContent = await RenderViewToStringAsync("Invoice", model);

    var renderer = new ChromePdfRenderer();
    renderer.RenderingOptions.MarginTop    = 40;
    renderer.RenderingOptions.MarginBottom = 40;

    string baseUrl = $"{HttpContext.Request.Scheme}://{HttpContext.Request.Host}";
    PdfDocument pdf = renderer.RenderHtmlAsPdf(htmlContent, baseUrl);

    return File(pdf.BinaryData, "application/pdf");
}

private async Task<string> RenderViewToStringAsync(string viewName, object model)
{
    var actionContext = new ActionContext(
        HttpContext, RouteData, ControllerContext.ActionDescriptor);

    var viewEngine      = HttpContext.RequestServices.GetRequiredService<IRazorViewEngine>();
    var tempDataFactory = HttpContext.RequestServices.GetRequiredService<ITempDataDictionaryFactory>();
    var tempData        = tempDataFactory.GetTempData(HttpContext);

    ViewData.Model = model;

    var viewResult = viewEngine.FindView(actionContext, viewName, isMainPage: false);
    if (!viewResult.Success)
    {
        string searched = string.Join(
            Environment.NewLine,
            viewResult.SearchedLocations ?? Array.Empty<string>());
        throw new InvalidOperationException(
            $"Could not find view '{viewName}'. Searched:{Environment.NewLine}{searched}");
    }

    await using var writer      = new StringWriter();
    var             viewContext = new ViewContext(
        actionContext, viewResult.View, ViewData, tempData,
        writer, new HtmlHelperOptions());

    await viewResult.View.RenderAsync(viewContext);
    return writer.ToString();
}

Razor View 生成 PDF 的结果是什么?

PDF invoice displayed in a web browser showing Invoice #1001 for Acme Corp with two line items totaling $250.00, demonstrating successful Razor view to PDF conversion

当您的Razor视图引用相对CSS或图像路径时,baseUrl参数很重要。 传递当前主机 网址 可以让 IronPDF 正确解析这些路径。 请参阅Razor 转 PDF 教程,了解包括 Blazor 应用程序模式在内的完整演练过程。

如何处理流式传输中的大型 PDF 文件?

对于大小可能达到几兆字节的文档,流式传输可以降低峰值内存使用量,并更快地将字节传输到客户端。 使用File()与原始字节数组:

public async Task<IActionResult> StreamLargePdf()
{
    var renderer = new ChromePdfRenderer();
    renderer.RenderingOptions.CreatePdfFormsFromHtml = false;

    PdfDocument pdf = await renderer.RenderHtmlAsPdfAsync(
        "<h1>Large Document</h1><p>Full content here...</p>");

    pdf.CompressImages(80);

    var stream = new MemoryStream(pdf.BinaryData);

    Response.Headers.Append("Content-Length", pdf.BinaryData.Length.ToString());
    Response.Headers.Append("Accept-Ranges",  "bytes");

    return new FileStreamResult(stream, "application/pdf");
}

CompressImages(80)将JPEG质量降低到80%,这显著减小了图片较多文档的文件大小,同时质量损失最小。 设置Accept-Ranges: bytes会向浏览器表明它可以请求字节范围的数据块,从而在不需要下载整个文件的情况下使在大型PDF内的快速寻位成为可能。

ISO 的PDF/A 规范定义了存档质量 PDF 的要求。 如果您的应用程序需要生成长期存档文档,IronPDF 的 PDF/A 合规模式可确保输出符合这些标准,这对于监管或法律工作流程尤为重要。

对于旧版 ASP.NET Web Forms 项目,模式略有不同,因为您需要直接写入 HTTP 响应:

protected void btnGeneratePdf_Click(object sender, EventArgs e)
{
    using var renderer = new ChromePdfRenderer();
    PdfDocument pdf    = renderer.RenderHtmlAsPdf("<h1>Web Form PDF</h1>");
    Response.ContentType = "application/pdf";
    Response.BinaryWrite(pdf.BinaryData);
    Response.End();
}

对于同时生成大量 PDF 的工作负载,请查看IronPDF 异步 API 指南性能优化参考,以了解在高吞吐量场景下减少内存开销的设置。

基于浏览器的查看器能为用户提供哪些功能?

当浏览器以内嵌方式显示 PDF 文件时,它会自动打开一个功能齐全的 PDF 查看器。 您的用户可以进行文本选择以复制内容,使用内置搜索栏查找特定单词或数字,使用打印控件,以及一键下载——所有这些都无需您编写任何前端代码。

除了基本查看功能外,IronPDF 还支持多种文档功能,这些功能会影响用户在查看器中看到的内容:

下表总结了库中可用的主要转换方法以及何时使用每种方法:

IronPDF转换方法及推荐用例
方法输入最适合
RenderHtmlAsPdfHTML字符串模板化文档、发票、报告
RenderUrlAsPdf网址网页存档,实时内容快照
RenderHtmlAsPdf + Razor渲染后的视图 HTML将现有的 MVC 模板重用于 PDF 格式。
RenderHtmlFileAsPdf本地 HTML 文件存储在磁盘上的静态模板

对于容器化部署,IronPDF 还提供远程引擎支持,因此您可以将 PDF 生成作为专用微服务运行。请参阅内存优化指南,了解针对资源受限环境的优化设置。

如需全面了解各项功能,请访问IronPDF 功能页面

IronPDF 支持哪些格式和编辑选项?

IronPDF的功能远不止基本的渲染。 您可以使用以下选项为每个文档添加结构和品牌标识。

页面布局控制包括自定义纸张尺寸、方向设置和边距配置。 字体支持通过CSS @font-face声明覆盖完整的网页字体渲染,这意味着文档与您的品牌字体完全匹配。 您还可以将图像嵌入 PDF 页面中并调整其大小,从而完全控制视觉效果。

对于文档操作,IronPDF 允许您合并或拆分现有 PDF、添加或删除单个页面,以及以编程方式提取文本和图像。 捕获前的JavaScript执行支持动态图表和数据可视化——在生成依赖于客户端渲染库(如Chart.jsD3.js)的报告时非常有用。

这些功能意味着您可以直接从应用程序生成精美、可直接打印的文档,而无需单独的文档处理层。

如果您需要接收用户上传的 PDF 文件并将其与生成的 PDF 文件一起显示,IronPDF 读取现有 PDF 二进制文件与创建新文件一样简单。 使用BinaryData

请参阅C# 编辑 PDF 教程,了解有关编辑、注释和修改现有文档的详细步骤。

IronPDF 与其他方法相比有何优势?

IronPDF 服务器端方法的两种最常见的替代方案是嵌入客户端 PDF 查看器库(例如PDF.js ,Mozilla 的开源查看器)和将用户路由到单独的文档管理系统。

像 PDF.js 这样的客户端查看器对于简单的显示场景效果很好,但需要自行提供查看器 JavaScript 包、处理外部 PDF 的 CORS 以及管理浏览器兼容性。 使用 IronPDF 的服务器端生成功能,使 PDF 管道完全位于 .NET 堆栈上,从而简化了安全策略并避免了跨域复杂性。

专用文档管理系统会增加大多数 Web 应用程序不需要的运维开销。 对于已经运行 ASP.NET Core 的团队来说,直接从控制器生成和流式传输 PDF 是阻力最小的途径。

下一步计划是什么?

在 ASP.NET Core Web 应用程序中显示 PDF 文件只需要几行代码。 使用FileResult——浏览器的内置查看器处理所有其他事情。

对于生产环境部署,请考虑以下步骤来准备您的设置:

准备好为您的项目添加 PDF 查看功能了吗? 首先进行免费试用,几分钟内即可运行上述示例。 准备部署时,请查看适合您团队规模和使用情况的许可选项。 要探索相关的转换,请浏览 IronPDF 的操作指南库,了解其如何处理DOCX 到 PDF图像到 PDF以及其他格式的转换。

第一步:
arrow pointer
Curtis Chau
技术作家

Curtis Chau 拥有卡尔顿大学的计算机科学学士学位,专注于前端开发,精通 Node.js、TypeScript、JavaScript 和 React。他热衷于打造直观且美观的用户界面,喜欢使用现代框架并创建结构良好、视觉吸引力强的手册。

...
阅读更多

相关文章

Key in blue circle

立即获取免费的 30 天试用版密钥

无任何限制。100% 解锁。无需信用卡。

bullet_checked无需信用卡或创建账户无任何限制。100% 解锁。无需信用卡。
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
预约您的免费现场演示
Booking Badge

深受全球数百万工程师信赖

Iron Software 的客户徽标
获取您的无义务咨询
填写下面的表格或通过sales@ironsoftware.com
您的资料将始终保密。
深受全球数百万工程师信赖
Iron Software 的客户徽标
立即获取您的免费30 天试用密钥
无需信用卡或创建账户