使用 IronPDF 在 .NET Core 中通过 C# 实现 HTML转PDF
直接从 HTML 生成高保真 PDF 是现代 .NET 应用程序中的常规需求——报告、发票和票据都需要与网页用户界面匹配的像素完美输出。 IronPDF 通过公开一个单一的 C# API 来简化此工作流程,将 HTML、Razor 视图和完整网站呈现为符合标准的 PDF 文档。 在本指南结束时,开发人员将能够在 ASP.NET Core 项目中转换 URL、原始 HTML 或 MVC 视图,并将相同的代码部署到 Windows、Linux、Docker 或无服务器环境。
快速入门:在.NET Core中从 HTML 创建 PDF
使用 IronPDF 库轻松将 HTML 转换为 .NET Core 中的 PDF。 本指南提供了一个简单的示例,以最少的代码快速开始,将 HTML 内容呈现到高质量的 PDF 中。 非常适合希望轻松将 PDF 创建集成到其应用程序中的开发人员。
最小工作流程(5 个步骤)
- 安装 `IronPdf` NuGet 软件包。
- 使用 `RenderUrlAsPdf` 转换网站 URL
- 通过 `RenderHtmlAsPdf` 渲染原始 HTML
- 将 MVC 视图导出为 PDF
- 调整纸张大小、页边距、页眉和页脚
快速启动检查表
1.安装– Install-Package IronPdf
2.渲染 URL – ChromePdfRenderer.RenderUrlAsPdf()
3.渲染原始 HTML – ChromePdfRenderer.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
需要命令行界面 (CLI) 吗?同样的命令也适用于项目文件夹内的 dotnet add package IronPdf。
安装完成后,通过转换任何公共网址确认一切正确连接:
// Program.cs — .NET 8 LTS
using IronPdf;
var renderer = new ChromePdfRenderer();
// Render a live website to PDF
using PdfDocument pdf = renderer.RenderUrlAsPdf("https://example.com");
// Persist to disk
pdf.SaveAs("website-snapshot.pdf");
// Program.cs — .NET 8 LTS
using IronPdf;
var renderer = new ChromePdfRenderer();
// Render a live website to PDF
using PdfDocument pdf = renderer.RenderUrlAsPdf("https://example.com");
// Persist to disk
pdf.SaveAs("website-snapshot.pdf");
' Program.cs — .NET 8 LTS
Imports IronPdf
Private renderer = New ChromePdfRenderer()
' Render a live website to PDF
Private PdfDocument As using
' Persist to disk
pdf.SaveAs("website-snapshot.pdf")
其工作原理
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 版本中无需更改即可编译。
逐步示例
// Program.cs — .NET 8 LTS-compatible
using IronPdf;
// 1. Activate a license (or trial key)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
// 2. Create a reusable renderer instance
var renderer = new ChromePdfRenderer
{
RenderingOptions =
{
// Force A4 portrait output and apply @media print styles
PaperSize = PdfPaperSize.A4,
CssMediaType = PdfCssMediaType.Print
}
};
// 3. Convert Microsoft Docs home page to PDF
using PdfDocument pdf = renderer.RenderUrlAsPdf("https://learn.microsoft.com/");
// 4. Save the PDF or stream it from a Web API
pdf.SaveAs("docs-offline-copy.pdf");
// Program.cs — .NET 8 LTS-compatible
using IronPdf;
// 1. Activate a license (or trial key)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
// 2. Create a reusable renderer instance
var renderer = new ChromePdfRenderer
{
RenderingOptions =
{
// Force A4 portrait output and apply @media print styles
PaperSize = PdfPaperSize.A4,
CssMediaType = PdfCssMediaType.Print
}
};
// 3. Convert Microsoft Docs home page to PDF
using PdfDocument pdf = renderer.RenderUrlAsPdf("https://learn.microsoft.com/");
// 4. Save the PDF or stream it from a Web API
pdf.SaveAs("docs-offline-copy.pdf");
' Program.cs — .NET 8 LTS-compatible
Imports IronPdf
' 1. Activate a license (or trial key)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
' 2. Create a reusable renderer instance
Dim renderer = New ChromePdfRenderer With {
.RenderingOptions = {
PaperSize = PdfPaperSize.A4,
CssMediaType = PdfCssMediaType.Print
}
}
' 3. Convert Microsoft Docs home page to PDF
Using pdf As PdfDocument = renderer.RenderUrlAsPdf("https://learn.microsoft.com/")
' 4. Save the PDF or stream it from a Web API
pdf.SaveAs("docs-offline-copy.pdf")
End Using
其工作原理
ChromePdfRenderer启动一个沙盒化的 Chromium 实例——没有系统 Chrome 依赖,保持 Docker 镜像精简。RenderUrlAsPdf等待 DOM 和JavaScript完成后再进行快照,以便单页应用程序能够正确渲染。- 将
CssMediaType设置为Print会告诉引擎使用特定于打印的规则,匹配浏览器的 Print → Save as PDF 输出。 - 生成的
PdfDocument可以进行加密、数字签名、合并或栅格化——这些功能将在后面的章节中介绍。
renderer.LoggingOptions.DebugMode = true 并按照无头 Chrome 调试指南操作,以在渲染期间检查实时开发者工具。相关资源
- API 参考 –
ChromePdfRenderer.RenderUrlAsPdf - API 参考 –
PdfDocument.SaveAs - 教程 - 在 Docker 容器中部署 IronPDF
如何在 .NET Core 中将原始 HTML 转换为 PDF?
将 HTML 字符串(或Razor视图的渲染标记)传递给 ChromePdfRenderer.RenderHtmlAsPdf 即可立即生成符合标准的 PDF。 该方法启动 IronPDF 的嵌入式 Chromium 引擎,因此无需外部浏览器安装或 WebView 依赖。 下面显示的相同代码今天在 .NET 8 LTS 上编译,并与 2025 年 11 月计划发布的 .NET 9 和 .NET 10 版本保持向前兼容。
示例 — 从 HTML 片段生成 PDF
// Program.cs — compatible with .NET 8 and newer
using IronPdf;
// Sample HTML fragment (could also be read from a file, Razor view, or CMS)
const string html = """
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Quarterly Report</title>
<style>
body { font-family:'Segoe UI', sans-serif; margin:1.2rem; }
header { margin-bottom:2rem; }
h1 { color:#3056d3; }
table { width:100%; border-collapse:collapse; margin-top:1rem; }
th,td { border:1px solid #ddd; padding:0.5rem; text-align:right; }
tr:nth-child(even){ background-color:#f8f9fa; }
</style>
</head>
<body>
<header><h1>Q2 Revenue Summary</h1></header>
<table>
<thead><tr><th>Product</th><th>Revenue ($)</th></tr></thead>
<tbody>
<tr><td>IronPDF for .NET</td><td>1,200,000</td></tr>
<tr><td>IronOCR for .NET</td><td>890,000</td></tr>
<tr><td>IronXL for .NET</td><td>610,000</td></tr>
</tbody>
</table>
</body>
</html>
""";
// 1. Create a renderer once and reuse it across conversions
var renderer = new ChromePdfRenderer
{
RenderingOptions =
{
PaperSize = PdfPaperSize.A4, // ISO-standard paper size
PaperOrientation = PdfPaperOrientation.Portrait,
CssMediaType = PdfCssMediaType.Screen, // Respect on-screen CSS
RenderDelay = 100, // Wait 100 ms for JS/animations
FallbackEncoding = "utf-8" // Handle non-ASCII correctly
}
};
// 2. Render the HTML fragment
using PdfDocument pdf = renderer.RenderHtmlAsPdf(html);
// 3. Persist to disk or return via ASP.NET Core FileStreamResult
pdf.SaveAs("q2-report.pdf");
// Program.cs — compatible with .NET 8 and newer
using IronPdf;
// Sample HTML fragment (could also be read from a file, Razor view, or CMS)
const string html = """
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Quarterly Report</title>
<style>
body { font-family:'Segoe UI', sans-serif; margin:1.2rem; }
header { margin-bottom:2rem; }
h1 { color:#3056d3; }
table { width:100%; border-collapse:collapse; margin-top:1rem; }
th,td { border:1px solid #ddd; padding:0.5rem; text-align:right; }
tr:nth-child(even){ background-color:#f8f9fa; }
</style>
</head>
<body>
<header><h1>Q2 Revenue Summary</h1></header>
<table>
<thead><tr><th>Product</th><th>Revenue ($)</th></tr></thead>
<tbody>
<tr><td>IronPDF for .NET</td><td>1,200,000</td></tr>
<tr><td>IronOCR for .NET</td><td>890,000</td></tr>
<tr><td>IronXL for .NET</td><td>610,000</td></tr>
</tbody>
</table>
</body>
</html>
""";
// 1. Create a renderer once and reuse it across conversions
var renderer = new ChromePdfRenderer
{
RenderingOptions =
{
PaperSize = PdfPaperSize.A4, // ISO-standard paper size
PaperOrientation = PdfPaperOrientation.Portrait,
CssMediaType = PdfCssMediaType.Screen, // Respect on-screen CSS
RenderDelay = 100, // Wait 100 ms for JS/animations
FallbackEncoding = "utf-8" // Handle non-ASCII correctly
}
};
// 2. Render the HTML fragment
using PdfDocument pdf = renderer.RenderHtmlAsPdf(html);
// 3. Persist to disk or return via ASP.NET Core FileStreamResult
pdf.SaveAs("q2-report.pdf");
' Program.cs — compatible with .NET 8 and newer
Imports IronPdf
' Sample HTML fragment (could also be read from a file, Razor view, or CMS)
Private Const html As String = "<!DOCTYPE html>
<html lang=""en"">
<head>
<meta charset=""utf-8"">
<title>Quarterly Report</title>
<style>
body { font-family:'Segoe UI', sans-serif; margin:1.2rem; }
header { margin-bottom:2rem; }
h1 { color:#3056d3; }
table { width:100%; border-collapse:collapse; margin-top:1rem; }
th,td { border:1px solid #ddd; padding:0.5rem; text-align:right; }
tr:nth-child(even){ background-color:#f8f9fa; }
</style>
</head>
<body>
<header><h1>Q2 Revenue Summary</h1></header>
<table>
<thead><tr><th>Product</th><th>Revenue ($)</th></tr></thead>
<tbody>
<tr><td>IronPDF for .NET</td><td>1,200,000</td></tr>
<tr><td>IronOCR for .NET</td><td>890,000</td></tr>
<tr><td>IronXL for .NET</td><td>610,000</td></tr>
</tbody>
</table>
</body>
</html>"
' 1. Create a renderer once and reuse it across conversions
Private renderer = New ChromePdfRenderer With {
.RenderingOptions = {
PaperSize = PdfPaperSize.A4,
PaperOrientation = PdfPaperOrientation.Portrait,
CssMediaType = PdfCssMediaType.Screen,
RenderDelay = 100,
FallbackEncoding = "utf-8"
}
}
' 2. Render the HTML fragment
Private PdfDocument As using
' 3. Persist to disk or return via ASP.NET Core FileStreamResult
pdf.SaveAs("q2-report.pdf")
代码演示了什么
- 嵌入式 Chromium -- IronPDF 捆绑了 Chromium 引擎,保证 HTML5、CSS3 和 JavaScript 与现代浏览器的兼容性。
- 单一依赖 -- 一个轻量级 NuGet 安装覆盖 Windows、Linux、Docker 和 Azure/AWS,无需额外的系统库。
-渲染选项--CssMediaType和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
该代码的说明
-没有临时文件-- Razor视图在内存中渲染,然后直接传递给RenderHtmlAsPdf ,避免磁盘 I/O 和临时文件夹竞争条件。
-票据大小的输出-- PaperSize = A5 和窄边距使在家打印的票据保持紧凑。
-一致的打印样式-- CssMediaType = Print 应用与浏览器相同的 @media print CSS 规则。
-二进制流式传输-- pdf.BinaryData 无需访问文件系统即可传输文档; - PaperSize、Margins 和 CssMediaType 反映了浏览器的打印对话框,因此屏幕布局和 PDF 在 Windows、Linux 和 Docker 上保持一致。
-可重用的渲染器-- ChromePdfRenderer 每个控制器实例化一次,然后重用,从而最大限度地减少进程生成开销。
`纸张大小`, `纸张方向`, `适合纸张宽度`
`边距`, `页眉`, `页脚`, `水印`
如何在渲染前微调纸张尺寸、边距、页眉、水印和安全性?
IronPDF 公开了一个单一的 ChromePdfRenderOptions 对象,可以完全控制输出的各个方面——纸张尺寸、方向、页眉和页脚、JavaScript 时间、水印、加密和数字签名——无需任何额外的浏览器插件。
IronPDF公开了一个 ChromePdfRenderOptions 对象,该对象控制输出的各个方面——纸张尺寸、方向、页眉和页脚、 JavaScript计时、水印、加密和数字签名——所有这些都无需额外的浏览器插件。
为什么这些选项很重要
// AdvancedOptions.cs — .NET 8 compatible
using IronPdf;
var renderer = new ChromePdfRenderer();
// Configure everything in one place
renderer.RenderingOptions = new ChromePdfRenderOptions
{
// 1. Page layout
PaperSize = PdfPaperSize.A4, // ISO size
PaperOrientation = PdfPdfOrientation.Portrait,
Margins = new PdfMargins { Top = 20, Bottom = 25, Left = 15, Right = 15 }, // mm
// 2. Timing & media
CssMediaType = PdfCssMediaType.Print, // Respect @media print
EnableJavaScript = true,
RenderDelay = 200, // Wait 200 ms for animations
// 3. Headers & footers (HTML gives full design freedom)
HtmlHeader = "<header style='font:14px Segoe UI'>Invoice — {{date}}</header>",
HtmlFooter = "<footer style='text-align:right;font-size:10px'>Page {{page}} / {{total-pages}}</footer>",
// 4. Watermark
Watermark = new HtmlStamp
{
HtmlTemplate = "<div style='font-size:50px;color:#cccccc;opacity:0.3;'>CONFIDENTIAL</div>",
VerticalAlignment = VerticalAlignment.Center,
HorizontalAlignment = HorizontalAlignment.Center
},
// 5. Security
SecurityOptions = new PdfSecurityOptions
{
OwnerPassword = "StrongOwnerPwd!",
UserPassword = "ReadOnly",
AllowUserPrinting = false,
AllowUserCopyPasteContent = false
}
};
// Render any HTML
using PdfDocument pdf = renderer.RenderHtmlAsPdf("<h1>Advanced Options Demo</h1>");
// Digitally sign with a PFX certificate (optional)
pdf.SignAndStamp("./certs/company.pfx", "Iron Software", "Bangkok", "Approval");
// Save
pdf.SaveAs("advanced-options-demo.pdf");
// AdvancedOptions.cs — .NET 8 compatible
using IronPdf;
var renderer = new ChromePdfRenderer();
// Configure everything in one place
renderer.RenderingOptions = new ChromePdfRenderOptions
{
// 1. Page layout
PaperSize = PdfPaperSize.A4, // ISO size
PaperOrientation = PdfPdfOrientation.Portrait,
Margins = new PdfMargins { Top = 20, Bottom = 25, Left = 15, Right = 15 }, // mm
// 2. Timing & media
CssMediaType = PdfCssMediaType.Print, // Respect @media print
EnableJavaScript = true,
RenderDelay = 200, // Wait 200 ms for animations
// 3. Headers & footers (HTML gives full design freedom)
HtmlHeader = "<header style='font:14px Segoe UI'>Invoice — {{date}}</header>",
HtmlFooter = "<footer style='text-align:right;font-size:10px'>Page {{page}} / {{total-pages}}</footer>",
// 4. Watermark
Watermark = new HtmlStamp
{
HtmlTemplate = "<div style='font-size:50px;color:#cccccc;opacity:0.3;'>CONFIDENTIAL</div>",
VerticalAlignment = VerticalAlignment.Center,
HorizontalAlignment = HorizontalAlignment.Center
},
// 5. Security
SecurityOptions = new PdfSecurityOptions
{
OwnerPassword = "StrongOwnerPwd!",
UserPassword = "ReadOnly",
AllowUserPrinting = false,
AllowUserCopyPasteContent = false
}
};
// Render any HTML
using PdfDocument pdf = renderer.RenderHtmlAsPdf("<h1>Advanced Options Demo</h1>");
// Digitally sign with a PFX certificate (optional)
pdf.SignAndStamp("./certs/company.pfx", "Iron Software", "Bangkok", "Approval");
// Save
pdf.SaveAs("advanced-options-demo.pdf");
Imports IronPdf
Dim renderer As New ChromePdfRenderer()
' Configure everything in one place
renderer.RenderingOptions = New ChromePdfRenderOptions With {
' 1. Page layout
.PaperSize = PdfPaperSize.A4, ' ISO size
.PaperOrientation = PdfPdfOrientation.Portrait,
.Margins = New PdfMargins With {.Top = 20, .Bottom = 25, .Left = 15, .Right = 15}, ' mm
' 2. Timing & media
.CssMediaType = PdfCssMediaType.Print, ' Respect @media print
.EnableJavaScript = True,
.RenderDelay = 200, ' Wait 200 ms for animations
' 3. Headers & footers (HTML gives full design freedom)
.HtmlHeader = "<header style='font:14px Segoe UI'>Invoice — {{date}}</header>",
.HtmlFooter = "<footer style='text-align:right;font-size:10px'>Page {{page}} / {{total-pages}}</footer>",
' 4. Watermark
.Watermark = New HtmlStamp With {
.HtmlTemplate = "<div style='font-size:50px;color:#cccccc;opacity:0.3;'>CONFIDENTIAL</div>",
.VerticalAlignment = VerticalAlignment.Center,
.HorizontalAlignment = HorizontalAlignment.Center
},
' 5. Security
.SecurityOptions = New PdfSecurityOptions With {
.OwnerPassword = "StrongOwnerPwd!",
.UserPassword = "ReadOnly",
.AllowUserPrinting = False,
.AllowUserCopyPasteContent = False
}
}
' Render any HTML
Using pdf As PdfDocument = renderer.RenderHtmlAsPdf("<h1>Advanced Options Demo</h1>")
' Digitally sign with a PFX certificate (optional)
pdf.SignAndStamp("./certs/company.pfx", "Iron Software", "Bangkok", "Approval")
' Save
pdf.SaveAs("advanced-options-demo.pdf")
End Using
为什么这些选项很重要
Margins和CssMediaType镜像浏览器的打印对话框,因此在 Windows、Linux 和 Docker 上,屏幕布局和 PDF 保持相同。HtmlStamp允许单行创建品牌水印,拥有完整的 HTML + CSS 控制。HtmlStamp允许使用一行代码创建具有完整 HTML + CSS 控制的品牌水印。- 安全选项 启用 128 位加密、拥有者/用户密码,并且无须第三方工具提供细粒度权限。
- 数字签名 直接在代码中添加密码学印章,保持法律真实性和篡改证据。
- 提取辅助程序(例如
ExtractAllText和ExtractAllImages)在需要分析时会反转该过程。
`PaperSize`, `PaperOrientation`, `Margins`, `CssMediaType`, `RenderDelay`.
`HtmlHeader`、`HtmlFooter`、动态 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所需的两个本地库(libnss3 和 libatk1.0-0)。
mcr.microsoft.com/dotnet/aspnet:8.0-windowsservercore-ltsc2022——无需额外的包,因为 Chromium DLL 已捆绑。####### ---------- 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
- API 操作内部调用
ChromePdfRenderer.RenderUrlAsPdf,就像第 2 部分中一样。 - 内存占用保持在 200 MB 以下,即使在大规模渲染期间也是如此。
提示故障排除提示:如果容器日志显示 "libnss3.so not found" 错误,请确认libnss3和libatk1.0-0都存在。
libnss3 和 libatk1.0-0 都存在。 ### 内部资源
- 教程 - 在 Docker 容器中部署 IronPDF
- 如何 - 在 Azure 应用服务 Linux 上运行 IronPdf
- API 参考 –
ChromePdfRenderer类
IronPDF 将每个 PDF(无论是由 IronPDF、Adobe® Acrobat 还是第三方工具生成)视作一级 PdfDocument 对象,可打开、编辑、加密和重新保存而不会损失质量。
IronPDF将每个 PDF 文件(无论是IronPDF、Adobe® Acrobat 还是第三方工具生成的 PDF 文件)都视为一流的 PdfDocument 对象,可以打开、编辑、保护和重新保存而不会损失质量。 相同的 API 表面现在可在 .NET 8 LTS 上运行,在 .NET 9 预览版和即将发布的 .NET 10 上编译时也不会有任何变化。
为什么这很重要
// ManipulateExistingPdf.cs — .NET 8 LTS compatible
using IronPdf;
using System.Linq;
// Step 1: Open two existing files (password-protected PDFs are supported)
PdfDocument invoice = PdfDocument.FromFile("invoice.pdf", "ReadOnly"); // open with user pwd
PdfDocument tAndCs = PdfDocument.FromFile("terms.pdf"); // no pwd required
// Step 2: Merge them (invoice pages first, then T&Cs)
PdfDocument mergedPdf = PdfDocument.Merge(invoice, tAndCs); // 1-liner merge
// Step 3: Apply a diagonal CONFIDENTIAL watermark to every page
mergedPdf.ApplyStamp(
"<div style='font-size:60px;color:#d9534f;opacity:0.2;transform:rotate(-45deg);"
+ "width:100%;text-align:center;'>CONFIDENTIAL</div>",
verticalAlignment : VerticalAlignment.Center,
horizontalAlignment : HorizontalAlignment.Center);
// Step 4: Extract all text and the first image for audit purposes
string fullText = mergedPdf.ExtractAllText();
var image = mergedPdf.ExtractAllImages().FirstOrDefault();
// Step 5: Save or stream
mergedPdf.SaveAs("invoice-with-terms.pdf");
// ManipulateExistingPdf.cs — .NET 8 LTS compatible
using IronPdf;
using System.Linq;
// Step 1: Open two existing files (password-protected PDFs are supported)
PdfDocument invoice = PdfDocument.FromFile("invoice.pdf", "ReadOnly"); // open with user pwd
PdfDocument tAndCs = PdfDocument.FromFile("terms.pdf"); // no pwd required
// Step 2: Merge them (invoice pages first, then T&Cs)
PdfDocument mergedPdf = PdfDocument.Merge(invoice, tAndCs); // 1-liner merge
// Step 3: Apply a diagonal CONFIDENTIAL watermark to every page
mergedPdf.ApplyStamp(
"<div style='font-size:60px;color:#d9534f;opacity:0.2;transform:rotate(-45deg);"
+ "width:100%;text-align:center;'>CONFIDENTIAL</div>",
verticalAlignment : VerticalAlignment.Center,
horizontalAlignment : HorizontalAlignment.Center);
// Step 4: Extract all text and the first image for audit purposes
string fullText = mergedPdf.ExtractAllText();
var image = mergedPdf.ExtractAllImages().FirstOrDefault();
// Step 5: Save or stream
mergedPdf.SaveAs("invoice-with-terms.pdf");
' ManipulateExistingPdf.cs — .NET 8 LTS compatible
Imports IronPdf
Imports System.Linq
' Step 1: Open two existing files (password-protected PDFs are supported)
Private invoice As PdfDocument = PdfDocument.FromFile("invoice.pdf", "ReadOnly") ' open with user pwd
Private tAndCs As PdfDocument = PdfDocument.FromFile("terms.pdf") ' no pwd required
' Step 2: Merge them (invoice pages first, then T&Cs)
Private mergedPdf As PdfDocument = PdfDocument.Merge(invoice, tAndCs) ' 1-liner merge
' Step 3: Apply a diagonal CONFIDENTIAL watermark to every page
mergedPdf.ApplyStamp("<div style='font-size:60px;color:#d9534f;opacity:0.2;transform:rotate(-45deg);" & "width:100%;text-align:center;'>CONFIDENTIAL</div>", verticalAlignment := VerticalAlignment.Center, horizontalAlignment := HorizontalAlignment.Center)
' Step 4: Extract all text and the first image for audit purposes
Dim fullText As String = mergedPdf.ExtractAllText()
Dim image = mergedPdf.ExtractAllImages().FirstOrDefault()
' Step 5: Save or stream
mergedPdf.SaveAs("invoice-with-terms.pdf")
- 打开和合并 –
PdfDocument.FromFile加载任何符合标准的 PDF,包括加密文件,而PdfDocument.Merge在单次调用中合并任意数量的文档。
-打开并合并– PdfDocument.FromFile 加载任何符合标准的 PDF,包括加密文件,而 PdfDocument.Merge 可在一次调用中连接任意数量的文档。
-水印– ApplyStamp(别名 HtmlStamp)在选定的页面上嵌入完全样式化的 HTML/CSS 叠加层——徽标、二维码或对角文本——而无需栅格化。
-内容提取– ExtractAllText 和 ExtractAllImages 提取原始 UTF-8 文本或二进制图像流,用于下游归档或 AI 管道。
-数字签名已准备就绪– 同一个 PdfDocument 实例可以用 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 版本上编译也不会改变。
幕后
// SecureAndSign.cs — .NET 8 LTS compatible
using IronPdf;
// Step 1: Load an existing PDF (or produce one with RenderHtmlAsPdf)
PdfDocument pdf = PdfDocument.FromFile("financial-report.pdf");
// Step 2: Configure AES-256 encryption & permissions
pdf.SecuritySettings = new PdfSecuritySettings
{
EncryptionAlgorithm = PdfEncryptionAlgorithm.AES256Bit,
OwnerPassword = "IronAdmin!2025",
UserPassword = "ReadOnly",
AllowUserPrinting = PdfPrintSecurity.Disabled,
AllowUserCopyPasteContent = false,
AllowUserAnnotations = false
};
// Step 3: Digitally sign with a PFX certificate
pdf.SignAndStamp(
certificatePath : "./certs/ironsoftware.pfx",
authority : "Iron Software Ltd.",
location : "Chicago, IL",
reason : "Final approval"
);
// Step 4: Persist or stream
pdf.SaveAs("financial-report-secured-signed.pdf");
// SecureAndSign.cs — .NET 8 LTS compatible
using IronPdf;
// Step 1: Load an existing PDF (or produce one with RenderHtmlAsPdf)
PdfDocument pdf = PdfDocument.FromFile("financial-report.pdf");
// Step 2: Configure AES-256 encryption & permissions
pdf.SecuritySettings = new PdfSecuritySettings
{
EncryptionAlgorithm = PdfEncryptionAlgorithm.AES256Bit,
OwnerPassword = "IronAdmin!2025",
UserPassword = "ReadOnly",
AllowUserPrinting = PdfPrintSecurity.Disabled,
AllowUserCopyPasteContent = false,
AllowUserAnnotations = false
};
// Step 3: Digitally sign with a PFX certificate
pdf.SignAndStamp(
certificatePath : "./certs/ironsoftware.pfx",
authority : "Iron Software Ltd.",
location : "Chicago, IL",
reason : "Final approval"
);
// Step 4: Persist or stream
pdf.SaveAs("financial-report-secured-signed.pdf");
' SecureAndSign.cs — .NET 8 LTS compatible
Imports IronPdf
' Step 1: Load an existing PDF (or produce one with RenderHtmlAsPdf)
Private pdf As PdfDocument = PdfDocument.FromFile("financial-report.pdf")
' Step 2: Configure AES-256 encryption & permissions
pdf.SecuritySettings = New PdfSecuritySettings With {
.EncryptionAlgorithm = PdfEncryptionAlgorithm.AES256Bit,
.OwnerPassword = "IronAdmin!2025",
.UserPassword = "ReadOnly",
.AllowUserPrinting = PdfPrintSecurity.Disabled,
.AllowUserCopyPasteContent = False,
.AllowUserAnnotations = False
}
' Step 3: Digitally sign with a PFX certificate
pdf.SignAndStamp(certificatePath := "./certs/ironsoftware.pfx", authority := "Iron Software Ltd.", location := "Chicago, IL", reason := "Final approval")
' Step 4: Persist or stream
pdf.SaveAs("financial-report-secured-signed.pdf")
-
AES-256 加密 -- IronPDF 用 NIST 认可的 AES 密钥包装负载,阻止未经授权的打开、打印或复制粘贴。
- 权限的细粒度 -- 属性如
AllowUserPrinting和AllowUserFormData控制每个操作的权限;
-权限粒度-- 诸如AllowUserPrinting和AllowUserFormData之类的属性切换每个操作的权限; - 数字签名 --SignAndStamp嵌入 RFC 3161 时间戳和证书链,创建 Adobe® Acrobat 和其他 ISO 32000-2 观看器识别的防篡改哈希。
-数字签名--SignAndStamp嵌入 RFC 3161 时间戳和证书链,创建 Adobe® Acrobat 和其他 ISO 32000-2 查看器可识别的防篡改哈希值。
-一站式 API -- 加密和签名都修改同一个PdfDocument实例,避免多次文件传递,并保留内部字体、图层和元数据。
location 字符串符合 ASCII 编码规范。`PdfSecuritySettings` → `OwnerPassword`, `UserPassword`, `EncryptionAlgorithm`, `AllowUserPrinting`.
`PdfDocument.SignAndStamp` - PFX 路径、权限、位置、原因、时间戳
深入探索的内部资源
- 教程 - Password-protect a PDF
- 示例 - 数字签名 PDF
- API 参考–
PdfSecuritySettings
如何优化和扩展.NET Core中的HTML到PDF性能?
IronPDF的Chromium引擎在现代硬件上已经能在 < 1 s内渲染大多数页面,但可以通过 批处理渲染、启用多线程和缩减无头Chrome开销 来增加吞吐量。 ### 1. 在后台线程池中批量渲染
ChromePdfRenderer是 线程安全的;
// BatchRender.cs — Thread-safe on .NET 8+
using IronPdf;
using System.Threading.Tasks;
var htmlSources = Directory.GetFiles("./html", "*.html");
var renderer = new ChromePdfRenderer(); // reuse 1 instance
Parallel.ForEach(htmlSources, new ParallelOptions { MaxDegreeOfParallelism = Environment.ProcessorCount }, file =>
{
string html = File.ReadAllText(file);
using PdfDocument pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs(Path.ChangeExtension(file, ".pdf"));
});
// BatchRender.cs — Thread-safe on .NET 8+
using IronPdf;
using System.Threading.Tasks;
var htmlSources = Directory.GetFiles("./html", "*.html");
var renderer = new ChromePdfRenderer(); // reuse 1 instance
Parallel.ForEach(htmlSources, new ParallelOptions { MaxDegreeOfParallelism = Environment.ProcessorCount }, file =>
{
string html = File.ReadAllText(file);
using PdfDocument pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs(Path.ChangeExtension(file, ".pdf"));
});
' BatchRender.cs — Thread-safe on .NET 8+
Imports IronPdf
Imports System.Threading.Tasks
Private htmlSources = Directory.GetFiles("./html", "*.html")
Private renderer = New ChromePdfRenderer() ' reuse 1 instance
Parallel.ForEach(htmlSources, New ParallelOptions With {.MaxDegreeOfParallelism = Environment.ProcessorCount}, Sub(file)
Dim html As String = File.ReadAllText(file)
Using pdf As PdfDocument = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs(Path.ChangeExtension(file, ".pdf"))
End Using
End Sub)
ChromePdfRenderer是线程安全的; -Parallel.ForEach饱和每个 CPU 核心;Parallel.ForEach使每个 CPU 核心饱和; 与单线程循环相比,典型服务器的吞吐量提高了 4-6 倍。2. 修剪无头 Chrome 启动成本
IronPDF 提供了自己的 Chromium 构建,但每次渲染都需要一定的启动成本。
池化有帮助,Linux 容器 必须包括两个本机库: 缺少任何一个库将"libnss3.so not found"错误在 Docker 日志中出现。
RUN apt-get update && \
apt-get install -y --no-install-recommends libnss3 libatk1.0-0
Missing either library manifests as a libnss3.so not found error in Docker logs.
Recommended Chrome flags (automatically applied by IronPDF) include --disable-gpu and --no-sandbox to reduce memory and root-user issues in containers.
3. 使用 RenderDelay 或 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')";
查看专门的WaitFor教程以获取自定义承诺和DOM检查。
4. 启用一次请求的调试日志记录
renderer.LoggingOptions.DebugMode = true;
renderer.LoggingOptions.LogsToConsole = true;
renderer.LoggingOptions.LogFilePath = "./logs/ironpdf-debug.log";
renderer.LoggingOptions.DebugMode = true;
renderer.LoggingOptions.LogsToConsole = true;
renderer.LoggingOptions.LogFilePath = "./logs/ironpdf-debug.log";
renderer.LoggingOptions.DebugMode = True
renderer.LoggingOptions.LogsToConsole = True
renderer.LoggingOptions.LogFilePath = "./logs/ironpdf-debug.log"
实时DevTools跟踪可以揭示丢失的字体、404图片和不重新编译代码的计时事件。
5. 重用模板PDF而不是重新渲染
对于发票运行,创建一个带有占位符(如 [[name]])的模板 PDF ,并执行文本替换,而不是重建复杂的 HTML。 它速度快10倍且内存轻。
快速调整清单
`Parallel.ForEach`、`async/await`、重复使用单个`ChromePdfRenderer`。
使用 `aspnet:8.0-jammy`; 安装 `libnss3` + `libatk1.0-0`; 标志 `--no-sandbox`, `--disable-gpu`.
`RenderDelay`、`WaitFor()`、慢速 SPA 水合的日志 DevTools 时间轴
进一步阅读
- 如何 - 使用异步/多线程生成 PDF
- 故障排除 - 性能协助中心
- 示例 - 线程渲染演示
我在哪里可以下载免费试用版、选择许可证并获取专家支持? {#anchor-10-resources}
一个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/ |
即时聊天、电子邮件、电话支持 |
下一步
通过这些资源,任何.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。

