如何在.NET Core中生成PDF文件

在.NET Core中使用C#和IronPDF将HTML转换为PDF

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

直接从 HTML 生成高保真 PDF 是现代 .NET 应用程序中的常规需求——报告、发票和票据都需要与网页用户界面匹配的像素完美输出。 IronPDF 通过公开一个单一的 C# API 来简化此工作流程,将 HTML、Razor 视图和完整网站呈现为符合标准的 PDF 文档。 在本指南结束时,开发人员将能够在 ASP.NET Core 项目中转换 URL、原始 HTML 或 MVC 视图,并将相同的代码部署到 Windows、Linux、Docker 或无服务器环境。

提示对于布局问题,IronPDF提供了一个无头Chrome调试器,帮助在PDF渲染之前诊断CSS、JavaScript和媒体查询的怪异行为。 审查专用的 像素完美 HTML 到 PDF 指南 以了解深入的技术。

快速入门:在.NET Core中从 HTML 创建 PDF

using IronPDF 库轻松将 HTML 转换为 .NET Core 中的 PDF。 本指南提供了一个简单的示例,以最少的代码快速开始,将 HTML 内容呈现到高质量的 PDF 中。 非常适合希望轻松将 PDF 创建集成到其应用程序中的开发人员。

  1. 使用 NuGet 包管理器安装 https://www.nuget.org/packages/IronPdf

    PM > Install-Package IronPdf
  2. 复制并运行这段代码。

    var pdf = new IronPdf.ChromePdfRenderer().RenderHtmlAsPdf("<h1>Hello World</h1>");
  3. 部署到您的生产环境中进行测试

    通过免费试用立即在您的项目中开始使用IronPDF

    arrow pointer

快速启动检查表

  1. 安装Install-Package IronPdf
  2. 渲染一个URLChromePdfRenderer.RenderUrlAsPdf()
  3. 渲染原始HTMLChromePdfRenderer.RenderHtmlAsPdf()
  4. 导出Razor视图ChromePdfRenderer.RenderHtmlAsPdfAsync()
  5. 微调输出 – 利用ChromePdfRenderer.RenderingOptions

本教程涵盖的内容

  • URL、HTML字符串和Razor视图转换
  • 纸张、边距和媒体类型配置
  • 跨平台部署(Windows、Linux、Docker)
  • 后处理:合并、水印、密码保护和数字签名PDF
  • 端到端样本:票务 MVC 应用程序

如何在 .NET Core 中安装 PDF 库?

在任何 .NET 8项目中安装库只需一行代码,并且与 .NET 9 preview 和即将发布的 .NET 10 版本保持向前兼容。 使用 NuGet 的包管理器控制台,包管理器将自动解析 Windows、Linux、Docker 和无服务器目标的所有依赖项。

PM> Install-Package IronPdf             # .NET 8 LTS and higher
PM> Install-Package IronPdf             # .NET 8 LTS and higher
SHELL

dotnet add package IronPdf一起使用。

安装完成后,通过转换任何公共网址确认一切正确连接:

:path=/static-assets/pdf/content-code-examples/tutorials/dotnet-core-pdf-generating-3.cs
public class ClientModel
{
    [Required]
    public string Name { get; set; }
    [Required]
    public string Phone { get; set; }
    [Required]
    public string Email { get; set; }
}
Public Class ClientModel
	<Required>
	Public Property Name() As String
	<Required>
	Public Property Phone() As String
	<Required>
	Public Property Email() As String
End Class
$vbLabelText   $csharpLabel

其工作原理

  • ChromePdfRenderer在后台启动一个沙箱化的Chromium实例——无需单独安装Chrome。
  • RenderUrlAsPdf捕捉完全渲染的DOM,包括JavaScript驱动的内容、CSS媒体查询和字体。
  • 生成的PdfDocument暴露出合并、保护密码或数字签名输出的辅助方法——在本教程稍后部分介绍这些功能。

有关部署细节(Azure App Service、AWS Lambda、本地 Linux),请参阅专门的 安装指南高级 NuGet 设置 页面。 关于 Docker 和 K8s 集群的内部 CI/CD 提示,请参阅 Docker 部署最佳实践


.NET Core 服务如何将实时网站网址转换为 PDF?

只需调用RenderUrlAsPdf:传递任何可公开访问的URL,IronPDF将返回一个完全渲染、符合标准的PDF。 下面的代码适用于 .NET 8 LTS,并且在 .NET 9 预览以及计划的 2025 年 .NET 10 版本中无需更改即可编译。

逐步示例

:path=/static-assets/pdf/content-code-examples/tutorials/dotnet-core-pdf-generating-4.cs
public class ClientServices
{
    private static ClientModel _clientModel;
    public static void AddClient(ClientModel clientModel)
    {
        _clientModel = clientModel;
    }
    public static ClientModel GetClient()
    {
        return _clientModel;
    }
}
Public Class ClientServices
	Private Shared _clientModel As ClientModel
	Public Shared Sub AddClient(ByVal clientModel As ClientModel)
		_clientModel = clientModel
	End Sub
	Public Shared Function GetClient() As ClientModel
		Return _clientModel
	End Function
End Class
$vbLabelText   $csharpLabel

其工作原理

  • ChromePdfRenderer在后台启动一个沙箱化的Chromium实例——无需系统Chrome依赖,保持Docker镜像的精简。
  • RenderUrlAsPdf会等待DOM和JavaScript加载完成后再进行快照,因此单页应用可以正确渲染。
  • CssMediaType设置为Print指示引擎使用打印专用规则,与浏览器的_打印→保存为PDF_输出匹配。
  • 生成的PdfDocument可以加密、数字签名、合并或光栅化——在后续章节中介绍这些功能。

renderer.LoggingOptions.DebugMode = true并按照无头Chrome调试指南检查渲染期间的实时开发工具。

相关资源

-API参考– ChromePdfRenderer.RenderUrlAsPdf -API参考– PdfDocument.SaveAs


如何在 .NET Core 中将原始 HTML 转换为 PDF?

将一个HTML字符串或Razor视图的渲染标记传递给ChromePdfRenderer.RenderHtmlAsPdf可以立即生成一份符合标准的PDF。 该方法启动 IronPDF 的嵌入式 Chromium 引擎,因此无需外部浏览器安装或 WebView 依赖。 下面显示的相同代码今天在 .NET 8 LTS 上编译,并与 2025 年 11 月计划发布的 .NET 9 和 .NET 10 版本保持向前兼容。

示例 — 从 HTML 片段生成 PDF

:path=/static-assets/pdf/content-code-examples/tutorials/dotnet-core-pdf-generating-5.cs
@model IronPdfMVCHelloWorld.Models.ClientModel
@{
  ViewBag.Title = "Book Ticket";
}
<h2>Index</h2>
@using (Html.BeginForm())
{
  <div class="form-horizontal">
    @Html.ValidationSummary(true, "", new { @class = "text-danger" })
    <div class="form-group">
      @Html.LabelFor(model => model.Name, htmlAttributes: new { @class = "control-label col-md-2" })
      <div class="col-md-10">
        @Html.EditorFor(model => model.Name, new { htmlAttributes = new { @class = "form-control" } })
        @Html.ValidationMessageFor(model => model.Name, "", new { @class = "text-danger" })
      </div>
    </div>
    <div class="form-group">
      @Html.LabelFor(model => model.Phone, htmlAttributes: new { @class = "control-label col-md-2" })
      <div class="col-md-10">
        @Html.EditorFor(model => model.Phone, new { htmlAttributes = new { @class = "form-control" } })
        @Html.ValidationMessageFor(model => model.Phone, "", new { @class = "text-danger" })
      </div>
    </div>
    <div class="form-group">
      @Html.LabelFor(model => model.Email, htmlAttributes: new { @class = "control-label col-md-2" })
      <div class="col-md-10">
        @Html.EditorFor(model => model.Email, new { htmlAttributes = new { @class = "form-control" } })
        @Html.ValidationMessageFor(model => model.Email, "", new { @class = "text-danger" })
      </div>
    </div>
    <div class="form-group">
      <div class="col-md-10 pull-right">
        <button type="submit" value="Save" class="btn btn-sm">
          <i class="fa fa-plus"></i>
          <span>
            Save
          </span>
        </button>
      </div>
    </div>
  </div>
}
model ReadOnly Property () As IronPdfMVCHelloWorld.Models.ClientModel
  ViewBag.Title = "Book Ticket"
End Property
'INSTANT VB TODO TASK: The following line could not be converted:
(Of h2) Index</h2> [using](Html.BeginForm())
If True Then
'INSTANT VB TODO TASK: The following line uses invalid syntax:
'  <div class="form-horizontal"> @Html.ValidationSummary(True, "", New { @class = "text-danger" }) <div class="form-group"> @Html.LabelFor(model => model.Name, htmlAttributes: New { @class = "control-label col-md-2" }) <div class="col-md-10"> @Html.EditorFor(model => model.Name, New { htmlAttributes = New { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.Name, "", New { @class = "text-danger" }) </div> </div> <div class="form-group"> @Html.LabelFor(model => model.Phone, htmlAttributes: New { @class = "control-label col-md-2" }) <div class="col-md-10"> @Html.EditorFor(model => model.Phone, New { htmlAttributes = New { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.Phone, "", New { @class = "text-danger" }) </div> </div> <div class="form-group"> @Html.LabelFor(model => model.Email, htmlAttributes: New { @class = "control-label col-md-2" }) <div class="col-md-10"> @Html.EditorFor(model => model.Email, New { htmlAttributes = New { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.Email, "", New { @class = "text-danger" }) </div> </div> <div class="form-group"> <div class="col-md-10 pull-right"> <button type="submit" value="Save" class="btn btn-sm"> <i class="fa fa-plus"></i> <span> Save </span> </button> </div> </div> </div> }
$vbLabelText   $csharpLabel

代码演示了什么

  • 嵌入的Chromium——IronPDF包含了Chromium引擎,保证与现代浏览器的HTML5、CSS3和JavaScript一致性
  • 单一依赖——一个轻量级NuGet安装涵盖Windows、Linux、Docker和Azure/AWS,而不需要额外的系统库。
  • 渲染选项RenderDelay反映浏览器打印设置,以便PDF与屏幕布局相匹配。
  • 面向未来的目标——API的表面在.NET 8、.NET 9 STS和即将到来的.NET 10之间是相同的,因此长期维护成本很低
  • 后处理钩子PdfDocument提供合并、密码保护和数字签名的助手——每个都将在本指南后面部分介绍。

进一步阅读:请参阅逐步HTML字符串到PDF教程以及完整的ChromePdfRenderer API文档


如何将 ASP .NET Core MVC 视图导出为 PDF?

IronPDF以与浏览器相同的方式渲染一个完全处理的Razor视图( .cshtml )并将结果作为PdfDocument流式传输。 以下工作流程保持控制器逻辑清晰,不需要浏览器插件,并且适用于 .NET 8 LTS、.NET 9 preview 和计划的 2025年 11月的 .NET 10 版本。

端到端控制器示例

// TicketsController.cs — .NET 8 LTS / MVC
using IronPdf;
using Microsoft.AspNetCore.Mvc;
using YourApp.Models;           // TicketViewModel

public class TicketsController : Controller
{
    private readonly ChromePdfRenderer _renderer;

    public TicketsController()
    {
        _renderer = new ChromePdfRenderer
        {
            RenderingOptions =
            {
                PaperSize        = PdfPaperSize.A5,            // Compact ticket size
                PaperOrientation = PdfPdfOrientation.Portrait,
                FitToPaperWidth  = true,
                CssMediaType     = PdfCssMediaType.Print,
                Margins = new PdfMargins(5, 10, 5, 10)         // mm
            }
        };
    }

    // GET /Tickets/Print/42
    public async Task<IActionResult> Print(int id)
    {
        TicketViewModel vm = await _service.GetTicketAsync(id);

        // 1. Render the Razor view to an HTML string
        string html  = await RazorTemplateEngine.RenderViewAsync(
                           HttpContext, "~/Views/Tickets/Print.cshtml", vm);

        // 2. Convert HTML → PDF
        using PdfDocument pdf = _renderer.RenderHtmlAsPdf(html);

        // 3. Stream back as a file
        return File(pdf.BinaryData, "application/pdf",
                    $"ticket-{id}.pdf");
    }
}
// TicketsController.cs — .NET 8 LTS / MVC
using IronPdf;
using Microsoft.AspNetCore.Mvc;
using YourApp.Models;           // TicketViewModel

public class TicketsController : Controller
{
    private readonly ChromePdfRenderer _renderer;

    public TicketsController()
    {
        _renderer = new ChromePdfRenderer
        {
            RenderingOptions =
            {
                PaperSize        = PdfPaperSize.A5,            // Compact ticket size
                PaperOrientation = PdfPdfOrientation.Portrait,
                FitToPaperWidth  = true,
                CssMediaType     = PdfCssMediaType.Print,
                Margins = new PdfMargins(5, 10, 5, 10)         // mm
            }
        };
    }

    // GET /Tickets/Print/42
    public async Task<IActionResult> Print(int id)
    {
        TicketViewModel vm = await _service.GetTicketAsync(id);

        // 1. Render the Razor view to an HTML string
        string html  = await RazorTemplateEngine.RenderViewAsync(
                           HttpContext, "~/Views/Tickets/Print.cshtml", vm);

        // 2. Convert HTML → PDF
        using PdfDocument pdf = _renderer.RenderHtmlAsPdf(html);

        // 3. Stream back as a file
        return File(pdf.BinaryData, "application/pdf",
                    $"ticket-{id}.pdf");
    }
}
Imports IronPdf
Imports Microsoft.AspNetCore.Mvc
Imports YourApp.Models ' TicketViewModel

Public Class TicketsController
    Inherits Controller

    Private ReadOnly _renderer As ChromePdfRenderer

    Public Sub New()
        _renderer = New ChromePdfRenderer With {
            .RenderingOptions = New PdfRenderingOptions With {
                .PaperSize = PdfPaperSize.A5, ' Compact ticket size
                .PaperOrientation = PdfPdfOrientation.Portrait,
                .FitToPaperWidth = True,
                .CssMediaType = PdfCssMediaType.Print,
                .Margins = New PdfMargins(5, 10, 5, 10) ' mm
            }
        }
    End Sub

    ' GET /Tickets/Print/42
    Public Async Function Print(id As Integer) As Task(Of IActionResult)
        Dim vm As TicketViewModel = Await _service.GetTicketAsync(id)

        ' 1. Render the Razor view to an HTML string
        Dim html As String = Await RazorTemplateEngine.RenderViewAsync(
            HttpContext, "~/Views/Tickets/Print.cshtml", vm)

        ' 2. Convert HTML → PDF
        Using pdf As PdfDocument = _renderer.RenderHtmlAsPdf(html)
            ' 3. Stream back as a file
            Return File(pdf.BinaryData, "application/pdf", $"ticket-{id}.pdf")
        End Using
    End Function
End Class
$vbLabelText   $csharpLabel

该代码的说明

  • 无临时文件 — Razor视图在内存中呈现,然后直接传递给RenderHtmlAsPdf,避免磁盘I/O和临时文件夹竞争条件
  • 票大小输出PaperSize = A5和窄边距保持家庭打印票证紧凑。
  • 一致的打印样式@media print CSS规则。
  • 二进制流pdf.BinaryData在不接触文件系统的情况下流传输文档; - PaperSizeMarginsCssMediaType 反映了浏览器的打印对话框,因此屏幕布局和 PDF 在 Windows、Linux 和 Docker 上保持一致。
  • 可重用的渲染器 — 每个控制器实例化一次ChromePdfRenderer,然后重用,以最小化进程生成的开销。

纸张大小, 纸张方向, 适合纸张宽度

边距, 页眉, 页脚, 水印

Icon Quote related to 该代码的说明

我最喜欢的这种库是 IronPDF。它允许快速高效地操作 PDF 文件。它还具有许多有价值的功能,比如导出为 PDF/A 格式和数字签名 PDF 文档。

Milan Jovanovic related to 该代码的说明

Milan Jovanovic

微软MVP

查看案例研究
Icon Quote related to 该代码的说明

IronOCR 意味着我们每年可以节省 $40,000 的人工处理成本,同时提高生产力,并释放资源用于高影响任务。我强烈推荐它。

Brent Matzelle related to 该代码的说明

Brent Matzelle

首席技术官,OPYN

查看案例研究
Icon Quote related to 该代码的说明

Iron Suite 在我们的运营中起着至关重要的作用。这些工具提高了业务各方面的效率,包括创建平面图和改善库存管理。

David Jones related to 该代码的说明

David Jones

首席软件工程师,Agorus Build

查看案例研究

如何在渲染前微调纸张尺寸、边距、页眉、水印和安全性?


IronPDF 公开了一个单一的 ChromePdfRenderOptions 对象,可以完全控制输出的各个方面——纸张尺寸、方向、页眉和页脚、JavaScript 时间、水印、加密和数字签名——无需任何额外的浏览器插件。

IronPDF公开一个单独的ChromePdfRenderOptions对象,控制输出的每个方面——纸张尺寸、方向、页眉和页脚、JavaScript计时、水印、加密和数字签名——所有这些都无需额外的浏览器插件。

为什么这些选项很重要

:path=/static-assets/pdf/content-code-examples/tutorials/dotnet-core-pdf-generating-7.cs
[HttpPost]
public ActionResult Index(ClientModel model)
{
    if (ModelState.IsValid)
    {
        ClientServices.AddClient(model);
        return RedirectToAction("TicketView");
    }
  return View(model);
}
<HttpPost>
Public Function Index(ByVal model As ClientModel) As ActionResult
	If ModelState.IsValid Then
		ClientServices.AddClient(model)
		Return RedirectToAction("TicketView")
	End If
  Return View(model)
End Function
$vbLabelText   $csharpLabel

为什么这些选项很重要

  • CssMediaType反映浏览器的打印对话框,因此屏幕布局和PDF在Windows、Linux和Docker上保持一致。
  • HTML页眉和页脚支持Razor令牌、CSS和JavaScript——适用于动态页码或品牌中。
  • HtmlStamp允许一个简单的行创建品牌水印,具有完整的HTML + CSS控制。
  • 安全选项 启用 128 位加密、拥有者/用户密码,并且无须第三方工具提供细粒度权限。
  • 数字签名 直接在代码中添加密码学印章,保持法律真实性和篡改证据。
  • 提取助手如ExtractAllImages在需要分析时逆转过程。

PaperSize, PaperOrientation, Margins, CssMediaType, RenderDelay.

HtmlHeaderHtmlFooter、动态 Razor 占位符、页码令牌

`水印`、`HtmlStamp`、不透明度、对齐方式

`SecurityOptions`、`SignAndStamp`、所有者/用户密码、证书密封

下一步任务: 合并多个PDF,提取文本和图像,并部署到Docker或无服务器环境。


如何将 PDF 生成代码部署到 Linux 和 Windows 上的 Docker?

IronPDF 作为一个自包含 NuGet 包发行,因此容器化一个 ASP.NET Core(或控制台)应用程序在Windows 和 Linux上都很简单。

IronPdf作为一个单独自包含的NuGet包发布,因此在Windows和Linux上容器化ASP.NET Core(或控制台)应用程序很简单。 关键在于将已发布的二进制文件复制到简化的运行时映像中,并在Linux中,添加IronPDF所需的两个本机库(libnss3libatk1.0-0)。

请注意为什么使用多阶段?SDK镜像(第1阶段)编译项目;

请注意为什么多阶段? SDK 镜像(阶段 1)编译项目。

####### ---------- stage 1 ----------
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
WORKDIR /src
COPY ["MyPdfApp.csproj", "."]
RUN dotnet restore

COPY . .
RUN dotnet publish -c Release -o /app/publish

####### ---------- stage 2 ----------
FROM mcr.microsoft.com/dotnet/aspnet:8.0-jammy
######## Install two native libs required by Chromium
RUN apt-get update && \
    apt-get install -y --no-install-recommends libnss3 libatk1.0-0 && \
    rm -rf /var/lib/apt/lists/*

WORKDIR /app
COPY --from=build /app/publish .
ENTRYPOINT ["dotnet", "MyPdfApp.dll"]

请注意Windows容器? 将第二阶段替换为mcr.microsoft.com/dotnet/aspnet:8.0-windowsservercore-ltsc2022—不需要额外的包,因为Chromium DLL已被捆绑。

  • API 操作内部调用 ChromePdfRenderer.RenderUrlAsPdf,就像在 Section2 中一样。
docker build -t pdf-demo .
docker run --rm -p 8080:80 pdf-demo
######### ↳ Navigate to http://localhost:8080/api/pdf?url=https://example.com
docker build -t pdf-demo .
docker run --rm -p 8080:80 pdf-demo
######### ↳ Navigate to http://localhost:8080/api/pdf?url=https://example.com
SHELL
  • API操作内部调用ChromePdfRenderer.RenderUrlAsPdf,就像在Section2中一样。
  • 内存占用保持在 200 MB 以下,即使在大规模渲染期间也是如此。
    提示故障排除提示:如果容器日志显示 "libnss3.so not found" 错误,请确认 libnss3libatk1.0-0 都存在。

提示故障排除提示: 如果容器日志显示"libnss3.so not found"错误,请确认libnss3libatk1.0-0都存在。 ### 内部资源


IronPDF 将每个 PDF(无论是由 IronPDF、Adobe® Acrobat 还是第三方工具生成)视作一级 PdfDocument 对象,可打开、编辑、加密和重新保存而不会损失质量。

IronPDF将每个PDF—无论是由IronPDF、Adobe® Acrobat,还是第三方工具生成的—视为一级PdfDocument对象,可以在不丢失质量的情况下打开、编辑、加密和重新保存。 相同的 API 表面现在可在 .NET 8 LTS 上运行,在 .NET 9 预览版和即将发布的 .NET 10 上编译时也不会有任何变化。

为什么这很重要

:path=/static-assets/pdf/content-code-examples/tutorials/dotnet-core-pdf-generating-10.cs
[HttpPost]
public ActionResult TicketView(TicketModel model)
{
    IronPdf.Installation.TempFolderPath = $@"{Directory.GetParent}/irontemp/";
    IronPdf.Installation.LinuxAndDockerDependenciesAutoConfig = true;
    var html = this.RenderViewAsync("_TicketPdf", model);
    var renderer = new IronPdf.ChromePdfRenderer();
    using var pdf = renderer.RenderHtmlAsPdf(html.Result, @"wwwroot/css");
    return File(pdf.Stream.ToArray(), "application/pdf");
}
<HttpPost>
Public Function TicketView(ByVal model As TicketModel) As ActionResult
	IronPdf.Installation.TempFolderPath = $"{AddressOf Directory.GetParent}/irontemp/"
	IronPdf.Installation.LinuxAndDockerDependenciesAutoConfig = True
	Dim html = Me.RenderViewAsync("_TicketPdf", model)
	Dim renderer = New IronPdf.ChromePdfRenderer()
	Dim pdf = renderer.RenderHtmlAsPdf(html.Result, "wwwroot/css")
	Return File(pdf.Stream.ToArray(), "application/pdf")
End Function
$vbLabelText   $csharpLabel
  • 打开和合并PdfDocument.FromFile 加载任何符合标准的 PDF,包括加密文件,而 PdfDocument.Merge 在单次调用中合并任意数量的文档。

  • 打开和合并PdfDocument.Merge则在一次调用中连接任意数量的文件。
  • 水印ApplyStamp (别名HtmlStamp)可在选定页面上嵌入完全样式化的HTML/CSS覆盖——徽标、QR代码或斜体文字——而无需光栅化。
  • 内容提取ExtractAllTextExtractAllImages提取用于下游存档或AI管线的原始UTF-8文本或二进制图像流。
  • 数字签名就绪 – 相同的SignAndStamp进行密封,生成符合RFC 3161的哈希,与ISO 32000-2数字签名要求一致。
  • 面向未来 – API 避免了互操作程序集和 Win32 GDI 调用,因此代码无需更改即可在 Windows、Linux、Docker 和即将推出的 .NET 10 无服务器 SKU 上运行。 需要分割、旋转或删除页面吗?请参阅 页面级编辑教程 以获取详细操作。

在 .NET Core 中如何加密和数字签名 PDF?


IronPDF 通过两个步骤保护文档:基于 AES 的加密(用户/所有者密码 + 细粒度的权限)和 X.509 数字签名,它们通过加密哈希封印文档。

IronPDF通过两个步骤保护文档:AES加密(用户/所有者密码 + 细粒度权限)和X.509数字签名,用于用加密散列密封文件。 两个API都存在于相同的PdfDocument对象上,因此今天在.NET 8 LTS上的工作流是相同的,并可以在.NET 9预览版和即将发布的.NET 10上不作变化地编译。

幕后

:path=/static-assets/pdf/content-code-examples/tutorials/dotnet-core-pdf-generating-11.cs
using System.IO;
using System.Threading.Tasks;

public static class ControllerExtensions
{
    public static async Task<string> RenderViewAsync<TModel>(this Controller controller, string viewName, TModel model, bool partial = false)
    {
        if (string.IsNullOrEmpty(viewName))
        {
            viewName = controller.ControllerContext.ActionDescriptor.ActionName;
        }
        controller.ViewData.Model = model;
        using (var writer = new StringWriter())
        {
            IViewEngine viewEngine = controller.HttpContext.RequestServices.GetService(typeof(ICompositeViewEngine)) as ICompositeViewEngine;
            ViewEngineResult viewResult = viewEngine.FindView(controller.ControllerContext, viewName, !partial);
            if (viewResult.Success == false)
            {
                return $"A view with the name {viewName} could not be found";
            }
            ViewContext viewContext = new ViewContext(controller.ControllerContext, viewResult.View, controller.ViewData, controller.TempData, writer, new HtmlHelperOptions());
            await viewResult.View.RenderAsync(viewContext);
            return writer.GetStringBuilder().ToString();
        }
    }
}
Imports System.IO
Imports System.Threading.Tasks

Public Module ControllerExtensions
	<System.Runtime.CompilerServices.Extension> _
	Public Async Function RenderViewAsync(Of TModel)(ByVal controller As Controller, ByVal viewName As String, ByVal model As TModel, Optional ByVal As Boolean = False) As Task(Of String)
		If String.IsNullOrEmpty(viewName) Then
			viewName = controller.ControllerContext.ActionDescriptor.ActionName
		End If
		controller.ViewData.Model = model
		Using writer = New StringWriter()
			Dim viewEngine As IViewEngine = TryCast(controller.HttpContext.RequestServices.GetService(GetType(ICompositeViewEngine)), ICompositeViewEngine)
			Dim viewResult As ViewEngineResult = viewEngine.FindView(controller.ControllerContext, viewName, Not partial)
			If viewResult.Success = False Then
				Return $"A view with the name {viewName} could not be found"
			End If
			Dim viewContext As New ViewContext(controller.ControllerContext, viewResult.View, controller.ViewData, controller.TempData, writer, New HtmlHelperOptions())
			Await viewResult.View.RenderAsync(viewContext)
			Return writer.GetStringBuilder().ToString()
		End Using
	End Function
End Module
$vbLabelText   $csharpLabel
  • AES-256 加密 -- IronPDF 用 NIST 认可的 AES 密钥包装负载,阻止未经授权的打开、打印或复制粘贴。

  • AES-256加密 — IronPDF使用NIST批准的AES密钥包装负载,阻止未经授权的打开、打印或复制粘贴。
  • 权限粒度 — 属性例如AllowUserPrintingAllowUserFormData可切换每个动作权限; - 数字签名 -- SignAndStamp 嵌入 RFC 3161 时间戳和证书链,创建 Adobe® Acrobat 和其他 ISO 32000-2 观看器识别的防篡改哈希。
  • 数字签名SignAndStamp嵌入一个RFC 3161时间戳和证书链,创建被Adobe® Acrobat和其他ISO 32000-2查看器认可的防篡改哈希。
  • 一站式API — 加密和签名都能修改相同的PdfDocument实例,避免了多次文件传递,并保存内部字体、层和元数据。

提示故障排除提示:如果Adobe Reader报告"无效签名",请确保PFX包含受信任的根证书,并且location字符串是ASCII干净的。

`PdfSecuritySettings` → `OwnerPassword`, `UserPassword`, `EncryptionAlgorithm`, `AllowUserPrinting`.

`PdfDocument.SignAndStamp` - PFX 路径、权限、位置、原因、时间戳

深入探索的内部资源


如何优化和扩展.NET Core中的HTML到PDF性能?

IronPDF的Chromium引擎已经可以在现代硬件上以<1s渲染大多数页面,但可以通过批量渲染、启用多线程以及减少无头Chrome开销来倍增吞吐量。

1. 在后台线程池中批量渲染

:path=/static-assets/pdf/content-code-examples/tutorials/dotnet-core-pdf-generating-12.cs
IronPdf.License.LicenseKey = "YourLicenseKey";
ChromePdfRenderer renderer = new ChromePdfRenderer();

// Set rendering options
renderer.RenderingOptions.PaperSize = IronPdf.Rendering.PdfPaperSize.A4;
renderer.RenderingOptions.PaperOrientation = IronPdf.Rendering.PdfPaperOrientation.Portrait;

renderer.RenderHtmlFileAsPdf(@"testFile.html").SaveAs("GeneratedFile.pdf");
Imports IronPdf

License.LicenseKey = "YourLicenseKey"
Dim renderer As New ChromePdfRenderer()

' Set rendering options
renderer.RenderingOptions.PaperSize = Rendering.PdfPaperSize.A4
renderer.RenderingOptions.PaperOrientation = Rendering.PdfPaperOrientation.Portrait

renderer.RenderHtmlFileAsPdf("testFile.html").SaveAs("GeneratedFile.pdf")
$vbLabelText   $csharpLabel

2. 修剪无头 Chrome 启动成本

2. 修剪无头Chrome启动成本

池化有帮助,Linux 容器 必须包括两个本机库: 缺少任何一个库将"libnss3.so not found"错误在 Docker 日志中出现。

RUN apt-get update && \
    apt-get install -y --no-install-recommends libnss3 libatk1.0-0

缺少任一库将在Docker日志中显示为libnss3.so not found错误。

推荐的Chrome标志(IronPDF自动应用)包括--no-sandbox,以减少容器中的内存和根用户问题。

3. 使用WaitFor等待延迟加载的JavaScript

加载完DOMContentLoaded后可能还需要短暂延迟的页面动画或数据获取:

renderer.RenderingOptions.RenderDelay = 200;        // ms
// OR: renderer.RenderingOptions.JavaScript = "WaitFor('window.doneLoading')";
renderer.RenderingOptions.RenderDelay = 200;        // ms
// OR: renderer.RenderingOptions.JavaScript = "WaitFor('window.doneLoading')";
renderer.RenderingOptions.RenderDelay = 200 ' ms
' OR: renderer.RenderingOptions.JavaScript = "WaitFor('window.doneLoading')";
$vbLabelText   $csharpLabel

查看专门的WaitFor教程以获取自定义承诺和DOM检查。

4. 启用一次请求的调试日志记录

:path=/static-assets/pdf/content-code-examples/tutorials/dotnet-core-pdf-generating-15.cs
IronPdf.License.LicenseKey = "YourLicenseKey";
PdfDocument pdf = PdfDocument.FromFile("1.pdf");
PdfDocument pdf2 = PdfDocument.FromFile("2.pdf");
pdf.AppendPdf(pdf2);
pdf.SaveAs("appendedFile.pdf");
IronPdf.License.LicenseKey = "YourLicenseKey"
Dim pdf As PdfDocument = PdfDocument.FromFile("1.pdf")
Dim pdf2 As PdfDocument = PdfDocument.FromFile("2.pdf")
pdf.AppendPdf(pdf2)
pdf.SaveAs("appendedFile.pdf")
$vbLabelText   $csharpLabel

实时DevTools跟踪可以揭示丢失的字体、404图片和不重新编译代码的计时事件。

5. 重用模板PDF而不是重新渲染

对于发票运行,创建一个支持的PDF模板,如[[name]]这样的占位符,并进行文本替换,而不是重建复杂的HTML。 它速度快10倍且内存轻。

快速调整清单

`Parallel.ForEach`、`async/await`、重复使用单个`ChromePdfRenderer`。

使用 `aspnet:8.0-jammy`; 安装 `libnss3` + `libatk1.0-0`; 标志 `--no-sandbox`, `--disable-gpu`.

`RenderDelay`、`WaitFor()`、慢速 SPA 水合的日志 DevTools 时间轴

进一步阅读


我在哪里可以下载免费试用版、选择许可证并获取专家支持?

一个30天试用密钥可以立即从开始免费试用表单中获取,并解锁所有功能——包括HTML到PDF、数字签名和加密——没有水印。

评估库后,选择永久的开发者部署企业许可证; 每个计划都包括免费的小更新、开发/暂存/生产使用权和30天退款保证。 应用密钥是单行代码(IronPdf.License.LicenseKey = "YOUR-KEY";),可以在CI/CD管道中自动化。

全面的文档——快速入门指南API参考教程视频——位于文档门户,每个.NET发布均更新。

工程问题通过实时聊天电子邮件或电话从芝加哥的支持团队一天内得到回应。

性能调整和部署常见问题汇总在性能协助中心。

快捷链接

资源 网址 重要性
获取30天试用密钥 https://ironpdf.com/demos/ 解锁所有功能没有水印
许可和定价 https://ironpdf.com/licensing/ 永久或订阅计划; Iron Suite捆绑10个库
API参考 https://ironpdf.com/object-reference/api/ 完整类文档,例如ChromePdfRenderer
文档门户 https://ironpdf.com/docs/ 指南、教程、示例项目
性能协助 https://ironpdf.com/troubleshooting/ironpdf-performance-assistance/ 优化和扩展提示
联系支持 https://ironsoftware.com/contact-us/ 即时聊天、电子邮件、电话支持

下一步

  1. 克隆示例仓库,展示所有主要功能——从MVC视图渲染到AES-256加密。
  2. 将试用密钥插入现有解决方案,运行单元测试以验证跨平台兼容性。
  3. 预约现场演示与工程团队一起为项目特定的建议。

通过这些资源,任何.NET团队在一个单一的冲刺中都可以将像素完美的PDF投入生产——无论是在本地、Docker中还是无服务器。

常见问题解答

如何在 .NET Core 中将 HTML 转换为 PDF?

您可以使用 IronPDF 库在 .NET Core 中将 HTML 转换为 PDF。首先,安装 IronPDF NuGet 包,然后创建一个 ChromePdfRenderer 实例。使用 RenderHtmlAsPdf 方法将 HTML 字符串转换为 PDF。

如何将网站 URL 转换为 PDF 文档?

要将网站 URL 转换为 PDF 文档,请安装 IronPDF NuGet 包,创建一个 ChromePdfRenderer 实例,并使用 RenderUrlAsPdf 方法将 URL 渲染为 PDF。可以使用 SaveAs 方法保存结果。

将 Razor 视图转换为 PDF 的最佳方式是什么?

将 Razor 视图转换为 PDF 的最佳方式是使用 IronPDF。首先,将 Razor 视图渲染为 HTML 字符串,然后将此字符串传递给 RenderHtmlAsPdf 方法以创建 PDF 文档。

如何增强我的 PDF 文档的安全性?

通过使用 IronPDF 增强 PDF 安全性,可以应用 AES-256 加密、设置密码和控制用户权限。通过 SecuritySettings 属性配置这些设置,以限制诸如打印和编辑等操作。

有哪些自定义 PDF 渲染的选项?

IronPDF 提供了多种渲染选项,通过 ChromePdfRenderOptions 类,包括设置纸张大小、方向、边距和应用 CSS 媒体类型。您还可以添加页眉、页脚和水印以实现定制的文档输出。

如何在 Docker 容器中部署 PDF 生成应用程序?

要在 Docker 容器中部署 PDF 生成应用程序,请在 Dockerfile 中配置 Linux 依赖项并设置用户权限。利用 IronPdf.Installation.LinuxAndDockerDependenciesAutoConfig 进行自动依赖项管理。

如何使用 C# 为 PDF 添加水印?

您可以通过使用 Watermark 属性和 HtmlStamp 对象在 PDF 中添加水印。对于高级选项,HtmlStamper 类允许自定义定位和透明效果。

我可以为 PDF 文档添加数字签名吗?

是的,您可以使用 IronPDF 的 PdfSignature 类为 PDF 添加数字签名。对 PdfDocument 使用 Sign 方法,并提供一个证书文件以确保文档的完整性和真实性。

如何优化 .NET Core 中 PDF 生成的性能?

通过重用一个线程安全的 ChromePdfRenderer 实例、启用多线程,并去除不必要的无头 Chrome 启动标志来优化 PDF 生成性能。这些实践有助于提高应用程序的效率。

本教程中的 .NET Core HTML 转 PDF 示例是否也适用于 .NET 10?

是的。IronPDF 完全兼容 .NET 10,因此您可以在 .NET 10 项目中使用本教程中的 ChromePdfRenderer HTML 转 PDF 示例,而无需更改核心代码。主要区别在于在创建项目时针对 .NET 10,然后从 NuGet 安装最新的 IronPDF 包,以从 HTML、Razor 视图或 URL 生成像素完美的 PDF。

Jacob Mellor,Team Iron 的首席技术官
首席技术官

Jacob Mellor 是 Iron Software 的首席技术官,也是一位开创 C# PDF 技术的有远见的工程师。作为 Iron Software 核心代码库的原始开发者,他从公司成立之初就开始塑造公司的产品架构,与首席执行官 Cameron Rimington 一起将公司转变为一家拥有 50 多名员工的公司,为 NASA、特斯拉和全球政府机构提供服务。

Jacob 拥有曼彻斯特大学土木工程一级荣誉工程学士学位(BEng)(1998-2001 年)。他的旗舰产品 IronPDF 和 Iron Suite for .NET 库在全球的 NuGet 安装量已超过 3000 万次,其基础代码继续为全球使用的开发人员工具提供动力。Jacob 拥有 25 年的商业经验和 41 年的编码专业知识,他一直专注于推动企业级 C#、Java 和 Python PDF 技术的创新,同时指导下一代技术领导者。

审核者
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 下载 20,088,359 | 版本: 2026.7 刚刚发布
Still Scrolling Icon

还在滚动吗?

想快速获得证据? PM > Install-Package IronPdf
运行示例看着你的HTML代码变成PDF文件。