# HTML 转 PDF 在 C# .NET 中
作为 IronPDF 的开发者,我们深知 HTML 到 PDF 转换的重要性,它需要产生准确、高质量的结果以满足客户的期望。本 C# 教程将指导您为您的应用程序、项目和网站构建一个 HTML 到 PDF 转换器。我们将开发一个 C# HTML 到 PDF 转换器,IronPDF 输出的 PDF 文档将与 Google Chrome 浏览器生成的 PDF 完全一致。
```cs
:title=Get started making PDFs now!
IronPdf.ChromePdfRenderer
.StaticRenderHtmlAsPdf("<p>Hello World</p>")
.SaveAs("pixelperfect.pdf");
```
<hr class="separator" />
<p class="main-content__segment-title">概述</p>
<div class="hsg-featured-snippet">
<h2>如何在 C# 中将 HTML 转换为 PDF</h2>
<img class="featured-snippet__image featured-snippet__image--float-right featured-snippet__image--html-pdf" src="/static-assets/pdf/images/html-to-pdf-converter-in-csharp.png" alt="如何在 C# 中将 HTML 转换为 PDF" />
<ol>
<li><a class="js-modal-open" data-modal-id="trial-license-after-download" href="https://nuget.org/packages/IronPdf/">下载并安装 HTML 到 PDF C# 库</a></li>
<li><a href="#anchor-create-a-pdf-with-an-html-string-in-c-net">使用 HTML 字符串创建 PDF</a></li>
<li><a href="#anchor-create-a-pdf-with-an-html-string-in-c-net">使用 RenderHtmlAsPdf 方法将 HTML 字符串转换为 PDF</a></li>
<li><a href="#anchor-export-a-pdf-using-existing-url">使用现有 URL 导出 PDF</a></li>
<li><a href="#anchor-generate-a-pdf-from-a-html-page">从 HTML 页面生成 PDF</a></li>
<li><a href="#anchor-add-custom-headers-and-footers">添加自定义页眉和页脚</a></li>
<li>调用 SaveAs 将 PDF 文件保存到计算机</li>
<li><a href="#anchor-c-html-to-pdf-conversion-settings">更多</a></li>
</ol>
</div>
<br class="main-article__clear-both" />
## C# 和 VB.NET 的 HTML 到 PDF 转换器
在 .NET 中以编程方式创建 PDF 文件可能是一项令人沮丧的任务。PDF 文档文件格式更适合打印机而不是开发人员。而且 C# 没有许多适合的库或内置的 PDF 生成功能,许多库需要额外的设置,并且在需要多行代码来完成简单任务时会导致进一步的挫折。
我们将在本教程中使用的 C# HTML 到 PDF 转换工具是 Iron Software 的 IronPDF,这是一个非常受欢迎的 C# PDF 生成和编辑库。该库具有完整的 PDF 编辑和生成功能,开箱即用,能够以最少的代码行数完成您需要的操作,并且具有 [其 50 多个功能的出色文档](/features/)。IronPDF 的突出之处在于它支持 **.NET 10, .NET 9, .NET 8, .NET 7, .NET 6, 和 .NET 5**,.NET Core, .NET Standard, 和 .NET Framework 在 Windows, macOS, Linux, Docker, Azure, 和 AWS 上。
使用 C# 和 IronPDF,“<a href="/how-to/create-new-pdfs/">生成 PDF 文档</a>”或“<a href="/examples/using-html-to-create-a-pdf/">HTML 到 PDF 转换</a>”的逻辑非常简单。由于 IronPDF 的高级 Chrome 渲染器,大部分或所有的 PDF 文档设计和布局将使用现有的 HTML 资产。
这种使用 HTML5 在 .NET 中动态生成 PDF 的方法在控制台应用程序、Windows 窗体应用程序、WPF 以及网站和 MVC 中同样有效。
**IronPDF 还支持使用 Chrome 调试您的 HTML 以获得像素完美的 PDF。有关设置此功能的教程可以在 <a href="/how-to/pixel-perfect-html-to-pdf/">这里</a> 找到。**
IronPDF 在 .NET 生态系统内外提供多种语言版本。
- [F# 指南](/get-started/fsharp-pdf-library-html-to-pdf/)
- [VB.NET 指南](/get-started/vb-net-pdf/)
- [Python](/python/tutorials/html-to-pdf/)
- [Java](/java/tutorials/html-to-pdf/)
- [Node.js](/nodejs/tutorials/html-to-pdf/)
IronPDF 对于开发是免费的;部署到生产环境并去除试用水印需要许可证密钥。您可以在 [这里购买许可证](/licensing/) 或注册 <a class='js-modal-open' data-modal-id='trial-license'>免费的 30 天试用密钥</a>。
<hr class="separator" />
<p class="main-content__segment-title">步骤 1</p>
## 下载并安装 HTML 到 PDF C# 库
### Visual Studio - NuGet 包管理器
在 Visual Studio 中,右键单击您的项目解决方案资源管理器并选择 `Manage NuGet Packages...`,然后只需搜索 IronPDF 并将最新版本安装到您的解决方案中... 点击任何弹出的对话框中的 OK。这在 VB.NET 项目中同样有效。
```shell
:ProductInstall
```
### NuGet 网站上的 IronPDF
有关 IronPDF 的功能、兼容性和下载的完整概述,请查看 NuGet 官方网站上的 IronPDF:<a class="js-modal-open" href="https://www.nuget.org/packages/IronPdf" target="_blank" data-modal-id="trial-license-after-download">https://www.nuget.org/packages/IronPdf</a>
### 通过 DLL 安装
另一种选择是直接安装 IronPDF DLL。可以从 <a class="js-modal-open" href="/packages/IronPdf.zip" data-modal-id="trial-license-after-download">https://ironpdf.com/packages/IronPdf.zip</a> 下载并手动安装到项目或 GAC 中。
<hr class="separator" />
<p class="main-content__segment-title">如何教程</p>
## 在 C# .NET 中使用 HTML 字符串创建 PDF
**如何:将 HTML 字符串转换为 PDF?** 在 C# 中*创建一个新的 PDF 文件*是一项非常高效且有益的技能。
我们可以简单地使用 [ChromePdfRenderer.RenderHtmlAsPdf](/object-reference/api/IronPdf.ChromePdfRenderer.html) 方法将任何 HTML (HTML5) 字符串转换为 PDF。**C# HTML 到 PDF 渲染**是由 IronPDF NuGet 包附带的 Google Chromium 引擎的完整功能版本进行的。
```csharp
using IronPdf;
// ChromePdfRenderer turns HTML into a PDF using IronPDF's embedded Chrome engine
var renderer = new ChromePdfRenderer();
// Render an HTML string. The result is a PdfDocument held in memory
var pdf = renderer.RenderHtmlAsPdf("<h1>Hello IronPdf</h1>");
// Write the PDF to disk
pdf.SaveAs("pixel-perfect.pdf");
```
`RenderHtmlAsPdf` 完全支持 HTML5、CSS3、JavaScript 和图像。如果这些资产在硬盘上,我们可能需要将 `RenderHtmlAsPdf` 的第二个参数设置为包含这些资产的目录。此方法返回一个 **PdfDocument** 对象,这是一个用于保存 PDF 信息的类。
### IronPDF 将按 Chrome 中的显示方式渲染您的 HTML
我们有一个完整的教程,专门用于让您设置 Chrome 进行完整的 HTML 调试,以确保在编辑 HTML、CSS 和 JavaScript 时看到的更改与选择渲染时 IronPDF 的输出 PDF 完全一致。请在此处找到教程:[如何在 Chrome 中调试 HTML 以创建像素完美的 PDF](/how-to/pixel-perfect-html-to-pdf/)。
**基本 URL 路径** (`BaseUrlOrPath` 参数):
```csharp
using IronPdf;
var renderer = new ChromePdfRenderer();
// The second argument is the base path. Relative URLs in the HTML (the image
// below, but also stylesheets, scripts and fonts) are resolved against it.
var pdf = renderer.RenderHtmlAsPdf("<img src='image1.png'/>", @"C:\MyProject\Assets\");
pdf.SaveAs(@"C:\MyProject\Assets\output.pdf");
```
所有引用的 CSS 样式表、图像和 JavaScript 文件都将相对于该基本路径,并可以保持在一个整洁且逻辑的结构中。当然,您也可以选择在线引用图像、样式表和资产,包括 Google Fonts 等网络字体,甚至 jQuery。
<hr class="separator" />
## 使用现有 URL 导出 PDF | URL 到 PDF
使用 C# 将现有 URL 渲染为 PDF 非常高效且直观。这也允许团队将 PDF 设计和后端 PDF 渲染工作分配给多个团队。
让我们在以下示例中渲染 Wikipedia.com 的一个页面:
```csharp
using IronPdf;
var renderer = new ChromePdfRenderer();
// Render a live web page straight from its URL
var pdf = renderer.RenderUrlAsPdf("https://en.wikipedia.org/wiki/PDF");
// The PDF is written next to the executable
pdf.SaveAs("wikipedia.pdf");
```
您会注意到,我们的 C# 代码生成的 PDF 中保留了超链接甚至 HTML 表单。
在渲染现有网页时,我们可能希望应用一些技巧:
### 打印和屏幕 CSS
CSS 媒体类型允许页面携带用于打印和屏幕的单独样式。我们可以指示 IronPDF 渲染“打印”CSS,这通常更简单。默认情况下,将渲染“屏幕”CSS 样式,这与您在浏览器中看到的内容相匹配。
```csharp
using IronPdf;
using IronPdf.Rendering;
var renderer = new ChromePdfRenderer();
// Choose which CSS media type the page is rendered with.
// Screen (the default) renders the page as a browser displays it;
// Print applies the page's @media print rules instead.
// renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Screen;
renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print;
```
主文章:[像素完美 HTML 到 PDF 比较](/how-to/pixel-perfect-html-to-pdf/#decide-to-use-css-media-type-print-or-screen)。
### JavaScript
IronPDF 支持 JavaScript、jQuery 甚至 AJAX。我们可能需要指示 [IronPDF **等待** JS 或 ajax](/how-to/javascript-to-pdf/) 完成运行,然后再渲染我们网页的快照。
```csharp
using IronPdf;
var renderer = new ChromePdfRenderer();
// Let the page's JavaScript run before the snapshot is taken
renderer.RenderingOptions.EnableJavaScript = true;
// Give scripts and AJAX calls 500 milliseconds to finish before rendering.
// For event-driven pages, WaitFor.NetworkIdle() or WaitFor.JavaScript() wait
// for a signal instead of a fixed delay.
renderer.RenderingOptions.WaitFor.RenderDelay(500);
```
我们可以通过渲染 [d3.js 弦图文档页面](https://d3js.org/d3-chord) 来演示 JavaScript 支持,该页面的图表在页面加载时由 JavaScript 绘制:
```csharp
using IronPdf;
var renderer = new ChromePdfRenderer();
// The chart is drawn by JavaScript, so let it run and give it a moment to finish
renderer.RenderingOptions.EnableJavaScript = true;
renderer.RenderingOptions.WaitFor.RenderDelay(500);
// Render the d3.js chord-diagram documentation page, whose charts are drawn by JavaScript
var pdf = renderer.RenderUrlAsPdf("https://d3js.org/d3-chord");
pdf.SaveAs("chart.pdf");
```
### 响应式 CSS
在 .NET 中使用响应式 CSS 将 HTML 转换为 PDF 设计用于在浏览器中查看。IronPDF 不会在服务器的操作系统中打开真实的浏览器窗口。没有浏览器视口,响应式布局可能会回退到其最窄的断点。
我们建议使用 **打印** CSS 媒体类型来解决此问题。打印 CSS 通常不应是响应式的。
```csharp
using IronPdf;
using IronPdf.Rendering;
var renderer = new ChromePdfRenderer();
// Responsive layouts are designed for a browser viewport, so render the page's
// print stylesheet instead of its screen stylesheet
renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print;
```
<hr class="separator" />
## 从 HTML 页面生成 PDF
我们还可以将硬盘上的任何 HTML 页面渲染为 PDF。所有相对资产(如 CSS、图像和 js)将被渲染,就像文件是使用 **file://** 协议打开的一样。
```csharp
using IronPdf;
var renderer = new ChromePdfRenderer();
// Render an HTML file from disk. Relative CSS, image and script paths
// resolve against the file's own folder, as if opened with file://
var pdf = renderer.RenderHtmlFileAsPdf("Assets/TestInvoice1.html");
pdf.SaveAs("Invoice.pdf");
```
这种方法的优点是允许开发人员在开发过程中在浏览器中测试 HTML 内容。我们推荐使用 Chrome,因为它是 IronPDF 的渲染引擎所基于的网络浏览器。
要将 [XML 转换为 PDF,您可以使用 XSLT 模板将 XML 内容打印为 PDF](/how-to/xml-to-pdf/)。
<hr class="separator" />
## 添加自定义页眉和页脚
在渲染时或使用 IronPDF 对现有 PDF 文件添加页眉和页脚。
使用 IronPDF,页眉和页脚可以使用 *`TextHeaderFooter`* 类包含简单的基于文本的内容,或者使用 *`HtmlHeaderFooter`* 类包含图像和丰富的 HTML 内容。
```csharp
using IronPdf;
using IronPdf.Rendering;
// Create a PDF from an existing HTML file with rendering options set up front
var renderer = new ChromePdfRenderer
{
RenderingOptions = new ChromePdfRenderOptions
{
// Margins are in millimeters
MarginTop = 50,
MarginBottom = 50,
// Render the page's print stylesheet
CssMediaType = PdfCssMediaType.Print,
// Plain-text header: the document title, centered, above a divider line
TextHeader = new TextHeaderFooter
{
CenterText = "{pdf-title}",
DrawDividerLine = true,
FontSize = 16
},
// Plain-text footer: date and time on the left, page numbers on the right
TextFooter = new TextHeaderFooter
{
LeftText = "{date} {time}",
RightText = "Page {page} of {total-pages}",
DrawDividerLine = true,
FontSize = 14
}
}
};
var pdf = renderer.RenderHtmlFileAsPdf("Assets/TestInvoice1.html");
pdf.SaveAs("Invoice.pdf");
// Open the result in the default PDF viewer
System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo
{
FileName = "Invoice.pdf",
UseShellExecute = true
});
```
在以下操作指南中探索所有渲染选项:[如何使用渲染选项](/how-to/rendering-options/)。
### HTML 页眉和页脚
`HtmlHeaderFooter` 类允许使用 HTML5 内容生成丰富的页眉和页脚,这些内容甚至可以包括图像和样式表。
```csharp
using IronPdf;
var renderer = new ChromePdfRenderer();
// An HTML footer can carry markup, styles and images.
// {page} and {total-pages} are filled in for every page.
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
HtmlFragment = "<div style='text-align:right'><em style='color:pink'>page {page} of {total-pages}</em></div>"
};
```
### PDF 页眉和页脚中的动态数据
我们可以使用占位符将内容“邮件合并”到页眉和页脚的文本甚至 HTML 中,例如:
- `{page}` 表示当前页码
- `{total-pages}` 表示 PDF 的总页数
- `{url}` 表示从网页渲染的 PDF 的 URL
- `{date}` 表示今天的日期
- `{time}` 表示当前时间
- `{html-title}` 表示渲染的 HTML 文档的 `<title>`
- `{pdf-title}` 表示文档标题,可以通过 ChromePdfRenderOptions 设置
<hr class="separator" />
## C# HTML 到 PDF 转换设置
我们的用户和客户可能期望 PDF 内容呈现的方式有很多细微差别。
`ChromePdfRenderer` 类包含一个 **RenderingOptions** 属性,可用于设置这些选项。
例如,我们可能希望选择仅接受“`print`”样式的 CSS3 指令:
```csharp
using IronPdf;
using IronPdf.Rendering;
var renderer = new ChromePdfRenderer();
// Render the page's @media print CSS rather than its screen styles
renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print;
renderer.RenderHtmlAsPdf("<html><body><h1>Hello, World!</h1></body></html>").SaveAs("Output.pdf");
```
我们还可能希望更改打印边距的大小,以在页面上创建更多空白,以便为大型页眉或页脚腾出空间,甚至为商业印刷宣传册或海报设置零边距:
```csharp
using IronPdf;
var renderer = new ChromePdfRenderer();
// Page margins in millimeters. Larger margins leave room for headers and
// footers; set them to 0 for edge-to-edge brochures and posters.
renderer.RenderingOptions.MarginTop = 50;
renderer.RenderingOptions.MarginBottom = 50;
renderer.RenderingOptions.MarginLeft = 20;
renderer.RenderingOptions.MarginRight = 20;
```
我们可能希望打开或关闭 HTML 元素的背景图像:
```csharp
using IronPdf;
var renderer = new ChromePdfRenderer();
// Include CSS background colors and images in the PDF (set false to drop them)
renderer.RenderingOptions.PrintHtmlBackgrounds = true;
var pdf = renderer.RenderHtmlAsPdf("<h1 style='background:#eee'>Hello, PDF!</h1>");
pdf.SaveAs("output.pdf");
```
还可以将输出 PDF 设置为在任何虚拟纸张尺寸上渲染,包括纵向和横向尺寸,甚至可以设置为以毫米或英寸为单位的自定义尺寸。
```csharp
using IronPdf;
using IronPdf.Rendering;
var renderer = new ChromePdfRenderer();
// Standard paper sizes and orientation
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape;
// Or a custom size, in millimeters or inches
// renderer.RenderingOptions.SetCustomPaperSizeinMilimeters(210, 297);
// renderer.RenderingOptions.SetCustomPaperSizeInInches(8.5, 11);
```
在以下操作指南中探索所有渲染选项:“[如何使用渲染选项](/how-to/rendering-options/)。”
<hr class="separator" />
## 应用 HTML 模板
模板化或“批量创建”PDF 是互联网和网站开发人员的常见需求。
与其模板化 PDF 文档本身,不如使用 IronPDF 我们可以使用现有的、经过验证的技术来模板化我们的 HTML。当 HTML 模板与查询字符串或数据库中的数据结合时,我们最终得到一个动态生成的 PDF 文档。
在最简单的情况下,使用 C# String.Format 方法对于基本示例是有效的。
```csharp
using IronPdf;
var renderer = new ChromePdfRenderer();
// Insert a value into an HTML template with string.Format
string html = string.Format("<h1>Hello {0}!</h1>", "World");
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("Hello.pdf");
```
如果 HTML 文件较长,通常我们可以使用任意占位符,例如 `[[NAME]]`,并在稍后用真实数据替换它们。
以下示例将创建 3 个 PDF,每个 PDF 都个性化为一个用户。
```csharp
using IronPdf;
var renderer = new ChromePdfRenderer();
// A template with a placeholder to replace
var htmlTemplate = "<p>[[NAME]]</p>";
var names = new[] { "John", "James", "Jenny" };
// One personalized PDF per name
foreach (var name in names)
{
var htmlInstance = htmlTemplate.Replace("[[NAME]]", name);
var pdf = renderer.RenderHtmlAsPdf(htmlInstance);
pdf.SaveAs(name + ".pdf");
}
```
### 使用 Handlebars.NET 进行高级模板化
将 C# 数据与 HTML 合并以生成 PDF 的一种复杂方法是使用 Handlebars 模板语言。
Handlebars 使得可以从 C# 对象和类实例(包括数据库记录)创建动态 HTML。Handlebars 特别有效的场景是查询可能返回未知数量的行,例如生成发票。
我们必须首先向项目添加一个额外的 NuGet 包:[https://www.nuget.org/packages/Handlebars.NET/](https://www.nuget.org/packages/Handlebars.NET/)
```csharp
using HandlebarsDotNet;
// A Handlebars template with two placeholders
var source =
@"<div class=""entry"">
<h1>{{title}}</h1>
<div class=""body"">
{{body}}
</div>
</div>";
// Compile it once, then fill it with any object that has matching properties
var template = Handlebars.Compile(source);
var data = new { title = "My new post", body = "This is my first post!" };
string html = template(data);
// html now contains:
//
// <div class="entry">
// <h1>My new post</h1>
// <div class="body">
// This is my first post!
// </div>
// </div>
```
要渲染此 HTML,我们可以简单地使用 `RenderHtmlAsPdf` 方法。
```csharp
using HandlebarsDotNet;
using IronPdf;
// Fill the Handlebars template, then render the resulting HTML
var template = Handlebars.Compile("<h1>{{title}}</h1><p>{{body}}</p>");
string html = template(new { title = "My new post", body = "This is my first post!" });
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("Handlebars.pdf");
```
您可以从 [GitHub](https://github.com/Handlebars-Net/Handlebars.Net) 了解有关 Handlebars 模板语言及其 C# 实现的更多信息。
### 使用 HTML5 添加分页符
在 PDF 文档中,分页是一个常见的需求。开发人员需要控制 PDF 页面的开始和结束位置,以获得干净、可读的布局。
最简单的方法是使用一个鲜为人知的 CSS 技巧,它将在任何打印的 HTML 文档中渲染一个分页符。
```html
<div style='page-break-after: always;'> </div>
```
提供的 HTML 可以工作,但并不是最佳实践。我们建议像以下示例一样调整媒体属性。这是一种整洁的方式来布局多页 HTML 内容。因为 IronPDF 默认使用 `screen` 媒体类型渲染,所以只有在 `RenderingOptions.CssMediaType` 设置为 `PdfCssMediaType.Print` 时,才会应用 `media="print"` 样式表(请参见上面的 [转换设置](#anchor-c-html-to-pdf-conversion-settings))。
```html
<!DOCTYPE html>
<html>
<head>
<style type="text/css" media="print">
.page {
page-break-after: always;
page-break-inside: avoid;
}
</style>
</head>
<body>
<div class="page">
<h1>This is Page 1</h1>
</div>
<div class="page">
<h1>This is Page 2</h1>
</div>
<div class="page">
<h1>This is Page 3</h1>
</div>
</body>
</html>
```
操作指南中概述了更多 [分页符的提示和技巧](/how-to/html-to-pdf-page-breaks/)。
<hr class="separator" />
## 为 PDF 附加封面
IronPDF 使合并 PDF 文档变得简单。此技术最常见的用法是为现有渲染的 PDF 文档添加封面或封底。
为此,我们首先渲染一个封面,然后使用 `PdfDocument.Merge()` 静态方法将两个文档合并。
```csharp
using IronPdf;
var renderer = new ChromePdfRenderer();
// The document body, rendered from a web page
var pdf = renderer.RenderUrlAsPdf("https://www.nuget.org/packages/IronPdf/");
// Prepend an existing PDF as the cover page. Merge returns a new document.
var cover = PdfDocument.FromFile("CoverPage.pdf");
var pdfMerged = PdfDocument.Merge(cover, pdf);
pdfMerged.SaveAs("Combined.pdf");
```
完整的代码示例可以在这里找到:[PDF 封面代码示例](/examples/pdf-cover-page/)。
<hr class="separator" />
## 添加水印
IronPDF 支持的最后一个 [C# PDF](/use-case/csharp-pdf/) 功能是为文档添加水印。这可以用于在每页上添加“机密”或“样本”的通知。
```csharp
using IronPdf;
using IronPdf.Editing;
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderUrlAsPdf("https://www.nuget.org/packages/IronPdf");
// Stamp every page with a red "SAMPLE" in the middle, rotated 30 degrees at 50% opacity.
// The watermark is HTML, so any markup, styling or image can be used.
pdf.ApplyWatermark(
"<h2 style='color:red; font-size:50px'>SAMPLE</h2>",
rotation: 30,
opacity: 50,
verticalAlignment: VerticalAlignment.Middle,
horizontalAlignment: HorizontalAlignment.Center);
pdf.SaveAs(@"C:\Path\To\Watermarked.pdf");
```
完整的代码示例可以在这里找到:[PDF 水印代码示例](/examples/pdf-watermarking/)。
<hr class="separator" />
## 下载 C# 源代码
本教程的完整 **免费 HTML 到 PDF 转换器 C# 源代码** 可作为压缩的 Visual Studio 2022 项目文件下载。它将使用其渲染引擎在 C# 中生成 PDF 文档对象。
[下载本教程作为 Visual Studio 项目](/tutorials/html-to-pdf/downloads/CSharp-Html-To-Pdf-Tutorial.zip)
免费下载包含创建 PDF 所需的一切,包括工作中的 C# PDF 代码示例代码:
1. 使用 C# 将 HTML 字符串转换为 PDF
2. C# 中的 HTML 文件到 PDF(支持 CSS、JavaScript 和图像)
3. 使用 URL 的 C# HTML 到 PDF(“URL 到 PDF”)
4. C# PDF 编辑和设置示例
5. 将 JavaScript 画布图表(如 d3.js)渲染为 PDF
6. PDF 库用于 C#
### 类参考
开发人员可能还对 `IronPdf.PdfDocument` 类参考感兴趣:
[https://ironpdf.com/object-reference/api/IronPdf.PdfDocument.html](https://ironpdf.com/object-reference/api/IronPdf.PdfDocument.html)
此对象模型显示了 PDF 文档如何可以:
- 加密和密码保护
- 编辑或“盖章”新的 HTML 内容
- 使用前景和背景图像增强
- 在页面或文档级别合并、连接、截断和拼接
- 解析以提取纯文本和图像,或使用 IronOCR 包进行 OCR 处理
<hr class="separator" />
## Blazor HTML 到 PDF
将 HTML 到 PDF 功能添加到您的 Blazor 服务器很简单,只需:
1. 创建一个新的 Blazor 服务器项目或使用现有项目
2. 使用 NuGet 将 IronPDF 库添加到您的项目中
3. 添加一个新的 Razor 组件或使用现有组件
4. 添加一个 `InputTextArea` 并将其链接到 IronPDF
5. 让 IronPDF 处理其余部分并部署
有关进一步阅读,请继续阅读 [完整的分步指南](/how-to/blazor-tutorial/) 以 [在 Blazor 应用程序中转换 HTML 为 PDF](/how-to/blazor-tutorial/)。
<img src="/static-assets/pdf/tutorials/blazor-tutorial/blazor-tutorial-3.webp" alt="从 Blazor 服务器页面生成的 PDF,使用 IronPDF" />
<hr class="separator" />
## 与其他 PDF 库比较
IronPDF 是一个功能强大且功能齐全的 PDF 库,专为现代 .NET 开发人员量身定制。凭借由先进的 Chromium 引擎驱动的本地 HTML 到 PDF 转换、直观的 API 和定期更新,它简化了开发,同时确保高质量的结果。让我们仔细看看它与其他工具的比较:
### PDFSharp
- **核心功能**:PDFsharp 是一个用于在托管代码中创建和编辑 PDF 文档的开源(MIT)库。它没有 HTML 渲染引擎,因此将 Web 内容转换为 PDF 需要单独的第三方渲染器。
- **现代标准**:IronPDF 利用现代 Web 技术,包括 HTML、CSS 和 JavaScript,通过其基于 Chromium 的引擎,确保 PDF 保持现代外观和感觉。
- **支持与更新**:PDFsharp 是开源的,每隔几个月发布一个版本,其维护者单独出售商业支持。IronPDF 每月发布更新和安全补丁,每个许可证都包括专业工程支持,这对企业应用程序很重要。
### wkhtmltopdf
- **集成的简易性**:wkhtmltopdf 是一个命令行工具,带有 C 库;没有官方的 .NET 包,因此从 .NET 使用它意味着启动本机二进制文件(或通过第三方包装器如 DinkToPdf 调用它)并为您部署到的每个平台提供该二进制文件。
- **渲染技术**:wkhtmltopdf 使用 QtWebKit 渲染,这是 Qt 在 2015 年弃用并在 Qt 5.6 中删除的 WebKit 分支,因此现代 JavaScript 和 CSS 功能不受支持,尤其是在动态、内容丰富的网站上。IronPDF 的 Chromium 引擎渲染当前的 Web 标准。
- **持续开发**:wkhtmltopdf 的最后一个版本是 2020 年 6 月的 0.12.6,其 GitHub 存储库在 2023 年 1 月被存档,因此没有供应商支持。IronPDF 继续发展,每月更新并提供专门的客户服务。
### iTextSharp
- **HTML-to-PDF 渲染**:iText 通过其独立的 pdfHTML 插件转换 HTML,这是一个 CSS 布局引擎而不是浏览器,并且旧版 iTextSharp 5 现在仅接收安全修复。IronPDF 在核心包中使用嵌入的 Chromium 引擎渲染 HTML,无需插件。
- **开发者体验**:iText 的 API 在 PDF 对象和布局元素的层面上工作,这很强大,但意味着日常任务需要更多代码。IronPDF 提供了一个简洁直观的 C# API,简化了编码并加速了项目交付。
- **维护与支持**:iText 的免费使用受 AGPL 约束,供应商支持仅限于商业许可证,iTextSharp 5.x 除了安全修复外已停止更新。IronPDF 包含专业支持和每月更新的每个许可证。
### Aspose.PDF
- **转换质量**:Aspose.PDF 使用其自己的布局引擎而不是浏览器转换 HTML。其文档通过首先使用 `HttpClient` 将 HTML 获取到流中,然后通过 `HtmlLoadOptions` 将其传递给 `Document`,而不是直接从 URL 渲染。在我们下面的 r/nfl 测试中,输出几乎是空的:社区标志、一个标题和几个空框。IronPDF 的 Chromium 引擎直接渲染 URL,包括 JavaScript。
- **API 可用性**:Aspose.PDF 的 API 可能比较冗长,而 IronPDF 专注于开发者友好的体验,最大限度地减少设置时间并提高生产力。
- **输出保真度**:由于 IronPDF 使用 Chromium 渲染,PDF 与 Chrome 显示的相同 HTML 匹配,这使得高容量 PDF 生成的设计和调试变得可预测。
### Syncfusion PDF
- **API 复杂性**:Syncfusion PDF 是一个功能强大的库,具有更大的 API 表面需要学习。相比之下,IronPDF 提供了一个简单的 API 以实现快速集成。
- **渲染引擎**:Syncfusion 的 HTML 转换器现在使用 Chromium Blink 引擎;其旧的 WebKit 和 Internet Explorer 引擎在 Essential Studio 2022 Volume 3 中被标记为过时。在我们下面的 r/nfl 测试中,Syncfusion 的输出保留了主提要,但丢失了导航和社区面板,而 IronPDF 的 Chromium 引擎渲染了整个页面。
- **超越转换**:IronPDF 的包还涵盖数字签名、注释、表单填写和条形码盖章,因此同一个库处理文档工作流的其余部分。
### 渲染比较
为了比较这些库的 HTML 到 PDF 转换质量,我们使用了一个 Reddit 社区页面 r/nfl,其中包含动态内容、实时更新、现代 CSS 和基于 JavaScript 的元素:
`https://www.reddit.com/r/nfl/`

以下是每个库默认设置单次运行的结果。Syncfusion 和 Aspose.PDF 作为评估版本运行,这就是为什么它们的输出带有评估水印(*点击每个图像查看放大版*):
<div class="competitors-section__wrapper">
<div class="competitors__card half">
<p class="competitors__header">IronPDF</p>
<img
class="competitors__image img-popup"
src="/static-assets/pdf/tutorials/html-to-pdf/html-to-pdf-2.webp"
alt="IronPDF 将 r/nfl Reddit 页面从 HTML 转换为 PDF 的输出"
data-fullsize="/static-assets/pdf/tutorials/html-to-pdf/html-to-pdf-2.webp" />
<small><strong>格式良好且视觉上准确的 PDF,保留了动态内容和现代样式。</strong></small>
</div>
<div class="competitors__card half">
<p class="competitors__header">SyncFusion</p>
<img
class="competitors__image img-popup"
src="/static-assets/pdf/tutorials/html-to-pdf/html-to-pdf-3.webp"
alt="Syncfusion 将 r/nfl Reddit 页面从 HTML 转换为 PDF 的输出"
data-fullsize="/static-assets/pdf/tutorials/html-to-pdf/html-to-pdf-3.webp" />
<small><strong>使用试用版本转换。主提要、帖子内容和样式以窄单列布局显示,但左侧导航和右侧社区面板被丢弃。</strong></small>
</div>
</div>
<div class="competitors-section__wrapper">
<div class="competitors__card half">
<p class="competitors__header">Aspose.PDF</p>
<img
class="competitors__image img-popup"
src="/static-assets/pdf/tutorials/html-to-pdf/html-to-pdf-4.webp"
alt="Aspose.PDF 将 r/nfl Reddit 页面从 HTML 转换为 PDF 的输出"
data-fullsize="/static-assets/pdf/tutorials/html-to-pdf/html-to-pdf-4.webp" />
<small><strong>评估版本;需要先下载 HTML(Aspose.PDF 从流而不是 URL 加载 HTML)。输出几乎是空的:社区标志、一个标题和几个空框。</strong></small>
</div>
<div class="competitors__card half">
<p class="competitors__header">Wkhtmltopdf</p>
<img
class="competitors__image img-popup"
src="/static-assets/pdf/tutorials/html-to-pdf/html-to-pdf-5.webp"
alt="wkhtmltopdf 将 r/nfl Reddit 页面从 HTML 转换为 PDF 的输出"
data-fullsize="/static-assets/pdf/tutorials/html-to-pdf/html-to-pdf-5.webp" />
<small><strong>wkhtmltopdf 完成了转换,但结果是页面的文本和图像,没有其布局、样式、动态元素或交互性。这使得 wkhtmltopdf 不适合现代动态网页。</strong></small>
</div>
</div>
[{i:(PDFsharp 没有 HTML 渲染引擎,而 iText 仅通过其独立的 pdfHTML 插件转换 HTML,因此两者均未包含在此浏览器渲染测试中。)}]
### 结论
对于寻求现代可靠 PDF 解决方案的 .NET 开发人员,IronPDF 是一个强有力的选择。其基于 Chromium 的 HTML 到 PDF 转换、易用性、定期更新和广泛的功能集使其成为首选。无论您是在进行小型项目还是大型企业应用程序,IronPDF 都能提高生产力,同时避免使用过时或不受支持库的风险。IronPDF 专为商业应用设计,确保您的项目使用维护和支持的库。
在我们对真实世界动态网页的测试中,IronPDF 产生了最完整和准确的渲染。Syncfusion 丢失了导航和社区面板。Aspose.PDF 需要先下载 HTML,但几乎没有渲染页面。wkhtmltopdf 生成了文本和图像,但没有页面的样式,不适合现代网站。
对于现代 HTML 到 PDF 的工作流程,渲染准确性和小而可读的 API 的结合是 IronPDF 的独特之处。
**体验 IronPDF 的全功能套件,轻松将动态、重 CSS 的 HTML 转换为 PDF。立即通过我们的[免费试用](trial-license)进行测试。**
<hr class="separator" />
## 观看 C# 中的 HTML 到 PDF 教程视频
<a name="video"></a>
通过 PDF 文档,您可以访问以下链接以了解如何[设置 Chrome 在浏览器中打开 PDF 而不是下载它们](https://support.google.com/chrome/answer/114662)。
!!!--LIBRARY_GET_STARTED_WITH_PRODUCT_TRIAL_EXTENDED_BLOCK--!!!
作为 IronPDF 的开发者,我们深知 HTML 到 PDF 转换的重要性,它需要产生准确、高质量的结果以满足客户的期望。本 C# 教程将指导您为您的应用程序、项目和网站构建一个 HTML 到 PDF 转换器。我们将开发一个 C# HTML 到 PDF 转换器,IronPDF 输出的 PDF 文档将与 Google Chrome 浏览器生成的 PDF 完全一致。
如何:将 HTML 字符串转换为 PDF? 在 C# 中创建一个新的 PDF 文件是一项非常高效且有益的技能。
我们可以简单地使用 ChromePdfRenderer.RenderHtmlAsPdf 方法将任何 HTML (HTML5) 字符串转换为 PDF。C# HTML 到 PDF 渲染是由 IronPDF NuGet 包附带的 Google Chromium 引擎的完整功能版本进行的。
using IronPdf;// ChromePdfRenderer turns HTML into a PDF using IronPDF's embedded Chrome enginevar renderer = new ChromePdfRenderer();// Render an HTML string. The result is a PdfDocument held in memoryvar pdf = renderer.RenderHtmlAsPdf("<h1>Hello IronPdf</h1>");// Write the PDF to diskpdf.SaveAs("pixel-perfect.pdf");
using IronPdf;
// ChromePdfRenderer turns HTML into a PDF using IronPDF's embedded Chrome engine
var renderer = new ChromePdfRenderer();
// Render an HTML string. The result is a PdfDocument held in memory
var pdf = renderer.RenderHtmlAsPdf("<h1>Hello IronPdf</h1>");
// Write the PDF to disk
pdf.SaveAs("pixel-perfect.pdf");
ImportsIronPdf' ChromePdfRenderer turns HTML into a PDF using IronPDF's embedded Chrome engineDim renderer = New ChromePdfRenderer()' Render an HTML string. The result is a PdfDocument held in memoryDim pdf = renderer.RenderHtmlAsPdf("<h1>Hello IronPdf</h1>")' Write the PDF to diskpdf.SaveAs("pixel-perfect.pdf")
Imports IronPdf
' ChromePdfRenderer turns HTML into a PDF using IronPDF's embedded Chrome engine
Dim renderer = New ChromePdfRenderer()
' Render an HTML string. The result is a PdfDocument held in memory
Dim pdf = renderer.RenderHtmlAsPdf("<h1>Hello IronPdf</h1>")
' Write the PDF to disk
pdf.SaveAs("pixel-perfect.pdf")
RenderHtmlAsPdf 完全支持 HTML5、CSS3、JavaScript 和图像。如果这些资产在硬盘上,我们可能需要将 RenderHtmlAsPdf 的第二个参数设置为包含这些资产的目录。此方法返回一个 PdfDocument 对象,这是一个用于保存 PDF 信息的类。
IronPDF 将按 Chrome 中的显示方式渲染您的 HTML
我们有一个完整的教程,专门用于让您设置 Chrome 进行完整的 HTML 调试,以确保在编辑 HTML、CSS 和 JavaScript 时看到的更改与选择渲染时 IronPDF 的输出 PDF 完全一致。请在此处找到教程:如何在 Chrome 中调试 HTML 以创建像素完美的 PDF。
基本 URL 路径 (BaseUrlOrPath 参数):
using IronPdf;var renderer = new ChromePdfRenderer();// The second argument is the base path. Relative URLs in the HTML (the image// below, but also stylesheets, scripts and fonts) are resolved against it.var pdf = renderer.RenderHtmlAsPdf("<img src='image1.png'/>", @"C:\MyProject\Assets\");pdf.SaveAs(@"C:\MyProject\Assets\output.pdf");
using IronPdf;
var renderer = new ChromePdfRenderer();
// The second argument is the base path. Relative URLs in the HTML (the image
// below, but also stylesheets, scripts and fonts) are resolved against it.
var pdf = renderer.RenderHtmlAsPdf("<img src='image1.png'/>", @"C:\MyProject\Assets\");
pdf.SaveAs(@"C:\MyProject\Assets\output.pdf");
Dim renderer = New ChromePdfRenderer()' The second argument is the base path. Relative URLs in the HTML (the image' below, but also stylesheets, scripts and fonts) are resolved against it.Dim pdf = renderer.RenderHtmlAsPdf("<img src='image1.png'/>", "C:\MyProject\Assets\")pdf.SaveAs("C:\MyProject\Assets\output.pdf")
Dim renderer = New ChromePdfRenderer()
' The second argument is the base path. Relative URLs in the HTML (the image
' below, but also stylesheets, scripts and fonts) are resolved against it.
Dim pdf = renderer.RenderHtmlAsPdf("<img src='image1.png'/>", "C:\MyProject\Assets\")
pdf.SaveAs("C:\MyProject\Assets\output.pdf")
所有引用的 CSS 样式表、图像和 JavaScript 文件都将相对于该基本路径,并可以保持在一个整洁且逻辑的结构中。当然,您也可以选择在线引用图像、样式表和资产,包括 Google Fonts 等网络字体,甚至 jQuery。
使用现有 URL 导出 PDF | URL 到 PDF
使用 C# 将现有 URL 渲染为 PDF 非常高效且直观。这也允许团队将 PDF 设计和后端 PDF 渲染工作分配给多个团队。
让我们在以下示例中渲染 Wikipedia.com 的一个页面:
using IronPdf;var renderer = new ChromePdfRenderer();// Render a live web page straight from its URLvar pdf = renderer.RenderUrlAsPdf("https://en.wikipedia.org/wiki/PDF");// The PDF is written next to the executablepdf.SaveAs("wikipedia.pdf");
using IronPdf;
var renderer = new ChromePdfRenderer();
// Render a live web page straight from its URL
var pdf = renderer.RenderUrlAsPdf("https://en.wikipedia.org/wiki/PDF");
// The PDF is written next to the executable
pdf.SaveAs("wikipedia.pdf");
ImportsIronPdfDim renderer = New ChromePdfRenderer()' Render a live web page straight from its URLDim pdf = renderer.RenderUrlAsPdf("https://en.wikipedia.org/wiki/PDF")' The PDF is written next to the executablepdf.SaveAs("wikipedia.pdf")
Imports IronPdf
Dim renderer = New ChromePdfRenderer()
' Render a live web page straight from its URL
Dim pdf = renderer.RenderUrlAsPdf("https://en.wikipedia.org/wiki/PDF")
' The PDF is written next to the executable
pdf.SaveAs("wikipedia.pdf")
using IronPdf;using IronPdf.Rendering;var renderer = new ChromePdfRenderer();// Choose which CSS media type the page is rendered with.// Screen (the default) renders the page as a browser displays it;// Print applies the page's @media print rules instead.// renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Screen;renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print;
using IronPdf;
using IronPdf.Rendering;
var renderer = new ChromePdfRenderer();
// Choose which CSS media type the page is rendered with.
// Screen (the default) renders the page as a browser displays it;
// Print applies the page's @media print rules instead.
// renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Screen;
renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print;
ImportsIronPdfImportsIronPdf.RenderingDim renderer = New ChromePdfRenderer()' Choose which CSS media type the page is rendered with.' Screen (the default) renders the page as a browser displays it;' Print applies the page's @media print rules instead.' renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Screenrenderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print
Imports IronPdf
Imports IronPdf.Rendering
Dim renderer = New ChromePdfRenderer()
' Choose which CSS media type the page is rendered with.
' Screen (the default) renders the page as a browser displays it;
' Print applies the page's @media print rules instead.
' renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Screen
renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print
using IronPdf;var renderer = new ChromePdfRenderer();// Let the page's JavaScript run before the snapshot is takenrenderer.RenderingOptions.EnableJavaScript = true;// Give scripts and AJAX calls 500 milliseconds to finish before rendering.// For event-driven pages, WaitFor.NetworkIdle() or WaitFor.JavaScript() wait// for a signal instead of a fixed delay.renderer.RenderingOptions.WaitFor.RenderDelay(500);
using IronPdf;
var renderer = new ChromePdfRenderer();
// Let the page's JavaScript run before the snapshot is taken
renderer.RenderingOptions.EnableJavaScript = true;
// Give scripts and AJAX calls 500 milliseconds to finish before rendering.
// For event-driven pages, WaitFor.NetworkIdle() or WaitFor.JavaScript() wait
// for a signal instead of a fixed delay.
renderer.RenderingOptions.WaitFor.RenderDelay(500);
Dim renderer = New ChromePdfRenderer()' Let the page's JavaScript run before the snapshot is takenrenderer.RenderingOptions.EnableJavaScript = True' Give scripts and AJAX calls 500 milliseconds to finish before rendering.' For event-driven pages, WaitFor.NetworkIdle() or WaitFor.JavaScript() wait' for a signal instead of a fixed delay.renderer.RenderingOptions.WaitFor.RenderDelay(500)
Dim renderer = New ChromePdfRenderer()
' Let the page's JavaScript run before the snapshot is taken
renderer.RenderingOptions.EnableJavaScript = True
' Give scripts and AJAX calls 500 milliseconds to finish before rendering.
' For event-driven pages, WaitFor.NetworkIdle() or WaitFor.JavaScript() wait
' for a signal instead of a fixed delay.
renderer.RenderingOptions.WaitFor.RenderDelay(500)
using IronPdf;var renderer = new ChromePdfRenderer();// The chart is drawn by JavaScript, so let it run and give it a moment to finishrenderer.RenderingOptions.EnableJavaScript = true;renderer.RenderingOptions.WaitFor.RenderDelay(500);// Render the d3.js chord-diagram documentation page, whose charts are drawn by JavaScriptvar pdf = renderer.RenderUrlAsPdf("https://d3js.org/d3-chord");pdf.SaveAs("chart.pdf");
using IronPdf;
var renderer = new ChromePdfRenderer();
// The chart is drawn by JavaScript, so let it run and give it a moment to finish
renderer.RenderingOptions.EnableJavaScript = true;
renderer.RenderingOptions.WaitFor.RenderDelay(500);
// Render the d3.js chord-diagram documentation page, whose charts are drawn by JavaScript
var pdf = renderer.RenderUrlAsPdf("https://d3js.org/d3-chord");
pdf.SaveAs("chart.pdf");
ImportsIronPdfDim renderer = New ChromePdfRenderer()' The chart is drawn by JavaScript, so let it run and give it a moment to finishrenderer.RenderingOptions.EnableJavaScript = Truerenderer.RenderingOptions.WaitFor.RenderDelay(500)' Render the d3.js chord-diagram documentation page, whose charts are drawn by JavaScriptDim pdf = renderer.RenderUrlAsPdf("https://d3js.org/d3-chord")pdf.SaveAs("chart.pdf")
Imports IronPdf
Dim renderer = New ChromePdfRenderer()
' The chart is drawn by JavaScript, so let it run and give it a moment to finish
renderer.RenderingOptions.EnableJavaScript = True
renderer.RenderingOptions.WaitFor.RenderDelay(500)
' Render the d3.js chord-diagram documentation page, whose charts are drawn by JavaScript
Dim pdf = renderer.RenderUrlAsPdf("https://d3js.org/d3-chord")
pdf.SaveAs("chart.pdf")
响应式 CSS
在 .NET 中使用响应式 CSS 将 HTML 转换为 PDF!响应式网页 设计用于在浏览器中查看。IronPDF 不会在服务器的操作系统中打开真实的浏览器窗口。没有浏览器视口,响应式布局可能会回退到其最窄的断点。
我们建议使用 打印 CSS 媒体类型来解决此问题。打印 CSS 通常不应是响应式的。
using IronPdf;using IronPdf.Rendering;var renderer = new ChromePdfRenderer();// Responsive layouts are designed for a browser viewport, so render the page's// print stylesheet instead of its screen stylesheetrenderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print;
using IronPdf;
using IronPdf.Rendering;
var renderer = new ChromePdfRenderer();
// Responsive layouts are designed for a browser viewport, so render the page's
// print stylesheet instead of its screen stylesheet
renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print;
ImportsIronPdfImportsIronPdf.RenderingDim renderer As New ChromePdfRenderer()' Responsive layouts are designed for a browser viewport, so render the page's' print stylesheet instead of its screen stylesheetrenderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print
Imports IronPdf
Imports IronPdf.Rendering
Dim renderer As New ChromePdfRenderer()
' Responsive layouts are designed for a browser viewport, so render the page's
' print stylesheet instead of its screen stylesheet
renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print
从 HTML 页面生成 PDF
我们还可以将硬盘上的任何 HTML 页面渲染为 PDF。所有相对资产(如 CSS、图像和 js)将被渲染,就像文件是使用 file:// 协议打开的一样。
using IronPdf;var renderer = new ChromePdfRenderer();// Render an HTML file from disk. Relative CSS, image and script paths// resolve against the file's own folder, as if opened with file://var pdf = renderer.RenderHtmlFileAsPdf("Assets/TestInvoice1.html");pdf.SaveAs("Invoice.pdf");
using IronPdf;
var renderer = new ChromePdfRenderer();
// Render an HTML file from disk. Relative CSS, image and script paths
// resolve against the file's own folder, as if opened with file://
var pdf = renderer.RenderHtmlFileAsPdf("Assets/TestInvoice1.html");
pdf.SaveAs("Invoice.pdf");
Dim renderer = New ChromePdfRenderer()' Render an HTML file from disk. Relative CSS, image and script paths' resolve against the file's own folder, as if opened with file://Dim pdf = renderer.RenderHtmlFileAsPdf("Assets/TestInvoice1.html")pdf.SaveAs("Invoice.pdf")
Dim renderer = New ChromePdfRenderer()
' Render an HTML file from disk. Relative CSS, image and script paths
' resolve against the file's own folder, as if opened with file://
Dim pdf = renderer.RenderHtmlFileAsPdf("Assets/TestInvoice1.html")
pdf.SaveAs("Invoice.pdf")
这种方法的优点是允许开发人员在开发过程中在浏览器中测试 HTML 内容。我们推荐使用 Chrome,因为它是 IronPDF 的渲染引擎所基于的网络浏览器。
使用 IronPDF,页眉和页脚可以使用 TextHeaderFooter 类包含简单的基于文本的内容,或者使用 HtmlHeaderFooter 类包含图像和丰富的 HTML 内容。
using IronPdf;using IronPdf.Rendering;// Create a PDF from an existing HTML file with rendering options set up frontvar renderer = new ChromePdfRenderer{RenderingOptions = new ChromePdfRenderOptions { // Margins are in millimetersMarginTop = 50,MarginBottom = 50, // Render the page's print stylesheetCssMediaType = PdfCssMediaType.Print, // Plain-text header: the document title, centered, above a divider lineTextHeader = new TextHeaderFooter {CenterText = "{pdf-title}",DrawDividerLine = true,FontSize = 16 }, // Plain-text footer: date and time on the left, page numbers on the rightTextFooter = new TextHeaderFooter {LeftText = "{date} {time}",RightText = "Page {page} of {total-pages}",DrawDividerLine = true,FontSize = 14 } }};var pdf = renderer.RenderHtmlFileAsPdf("Assets/TestInvoice1.html");pdf.SaveAs("Invoice.pdf");// Open the result in the default PDF viewerSystem.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo{FileName = "Invoice.pdf",UseShellExecute = true});
using IronPdf;
using IronPdf.Rendering;
// Create a PDF from an existing HTML file with rendering options set up front
var renderer = new ChromePdfRenderer
{
RenderingOptions = new ChromePdfRenderOptions
{
// Margins are in millimeters
MarginTop = 50,
MarginBottom = 50,
// Render the page's print stylesheet
CssMediaType = PdfCssMediaType.Print,
// Plain-text header: the document title, centered, above a divider line
TextHeader = new TextHeaderFooter
{
CenterText = "{pdf-title}",
DrawDividerLine = true,
FontSize = 16
},
// Plain-text footer: date and time on the left, page numbers on the right
TextFooter = new TextHeaderFooter
{
LeftText = "{date} {time}",
RightText = "Page {page} of {total-pages}",
DrawDividerLine = true,
FontSize = 14
}
}
};
var pdf = renderer.RenderHtmlFileAsPdf("Assets/TestInvoice1.html");
pdf.SaveAs("Invoice.pdf");
// Open the result in the default PDF viewer
System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo
{
FileName = "Invoice.pdf",
UseShellExecute = true
});
ImportsIronPdfImportsIronPdf.Rendering' Create a PDF from an existing HTML file with rendering options set up frontDim renderer = New ChromePdfRendererWith { .RenderingOptions = New ChromePdfRenderOptionsWith { ' Margins are in millimeters .MarginTop = 50, .MarginBottom = 50, ' Render the page's print stylesheet .CssMediaType = PdfCssMediaType.Print, ' Plain-text header: the document title, centered, above a divider line .TextHeader = New TextHeaderFooterWith { .CenterText = "{pdf-title}", .DrawDividerLine = True, .FontSize = 16 }, ' Plain-text footer: date and time on the left, page numbers on the right .TextFooter = New TextHeaderFooterWith { .LeftText = "{date} {time}", .RightText = "Page {page} of {total-pages}", .DrawDividerLine = True, .FontSize = 14 } }}Dim pdf = renderer.RenderHtmlFileAsPdf("Assets/TestInvoice1.html")pdf.SaveAs("Invoice.pdf")' Open the result in the default PDF viewerSystem.Diagnostics.Process.Start(New System.Diagnostics.ProcessStartInfoWith { .FileName = "Invoice.pdf", .UseShellExecute = True})
Imports IronPdf
Imports IronPdf.Rendering
' Create a PDF from an existing HTML file with rendering options set up front
Dim renderer = New ChromePdfRenderer With {
.RenderingOptions = New ChromePdfRenderOptions With {
' Margins are in millimeters
.MarginTop = 50,
.MarginBottom = 50,
' Render the page's print stylesheet
.CssMediaType = PdfCssMediaType.Print,
' Plain-text header: the document title, centered, above a divider line
.TextHeader = New TextHeaderFooter With {
.CenterText = "{pdf-title}",
.DrawDividerLine = True,
.FontSize = 16
},
' Plain-text footer: date and time on the left, page numbers on the right
.TextFooter = New TextHeaderFooter With {
.LeftText = "{date} {time}",
.RightText = "Page {page} of {total-pages}",
.DrawDividerLine = True,
.FontSize = 14
}
}
}
Dim pdf = renderer.RenderHtmlFileAsPdf("Assets/TestInvoice1.html")
pdf.SaveAs("Invoice.pdf")
' Open the result in the default PDF viewer
System.Diagnostics.Process.Start(New System.Diagnostics.ProcessStartInfo With {
.FileName = "Invoice.pdf",
.UseShellExecute = True
})
using IronPdf;var renderer = new ChromePdfRenderer();// An HTML footer can carry markup, styles and images.// {page} and {total-pages} are filled in for every page.renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter{HtmlFragment = "<div style='text-align:right'><em style='color:pink'>page {page} of {total-pages}</em></div>"};
using IronPdf;
var renderer = new ChromePdfRenderer();
// An HTML footer can carry markup, styles and images.
// {page} and {total-pages} are filled in for every page.
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
HtmlFragment = "<div style='text-align:right'><em style='color:pink'>page {page} of {total-pages}</em></div>"
};
Dim renderer = New ChromePdfRenderer()' An HTML footer can carry markup, styles and images.' {page} and {total-pages} are filled in for every page.renderer.RenderingOptions.HtmlFooter = New HtmlHeaderFooterWith { .HtmlFragment = "<div style='text-align:right'><em style='color:pink'>page {page} of {total-pages}</em></div>"}
Dim renderer = New ChromePdfRenderer()
' An HTML footer can carry markup, styles and images.
' {page} and {total-pages} are filled in for every page.
renderer.RenderingOptions.HtmlFooter = New HtmlHeaderFooter With {
.HtmlFragment = "<div style='text-align:right'><em style='color:pink'>page {page} of {total-pages}</em></div>"
}
PDF 页眉和页脚中的动态数据
我们可以使用占位符将内容“邮件合并”到页眉和页脚的文本甚至 HTML 中,例如:
{page} 表示当前页码
{total-pages} 表示 PDF 的总页数
{url} 表示从网页渲染的 PDF 的 URL
{date} 表示今天的日期
{time} 表示当前时间
{html-title} 表示渲染的 HTML 文档的 <title>
{pdf-title} 表示文档标题,可以通过 ChromePdfRenderOptions 设置
C# HTML 到 PDF 转换设置
我们的用户和客户可能期望 PDF 内容呈现的方式有很多细微差别。 ChromePdfRenderer 类包含一个 RenderingOptions 属性,可用于设置这些选项。
例如,我们可能希望选择仅接受“print”样式的 CSS3 指令:
using IronPdf;using IronPdf.Rendering;var renderer = new ChromePdfRenderer();// Render the page's @media print CSS rather than its screen stylesrenderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print;renderer.RenderHtmlAsPdf("<html><body><h1>Hello, World!</h1></body></html>").SaveAs("Output.pdf");
using IronPdf;
using IronPdf.Rendering;
var renderer = new ChromePdfRenderer();
// Render the page's @media print CSS rather than its screen styles
renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print;
renderer.RenderHtmlAsPdf("<html><body><h1>Hello, World!</h1></body></html>").SaveAs("Output.pdf");
ImportsIronPdfImportsIronPdf.RenderingDim renderer = New ChromePdfRenderer()' Render the page's @media print CSS rather than its screen stylesrenderer.RenderingOptions.CssMediaType = PdfCssMediaType.Printrenderer.RenderHtmlAsPdf("<html><body><h1>Hello, World!</h1></body></html>").SaveAs("Output.pdf")
Imports IronPdf
Imports IronPdf.Rendering
Dim renderer = New ChromePdfRenderer()
' Render the page's @media print CSS rather than its screen styles
renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print
renderer.RenderHtmlAsPdf("<html><body><h1>Hello, World!</h1></body></html>").SaveAs("Output.pdf")
using IronPdf;var renderer = new ChromePdfRenderer();// Page margins in millimeters. Larger margins leave room for headers and// footers; set them to 0 for edge-to-edge brochures and posters.renderer.RenderingOptions.MarginTop = 50;renderer.RenderingOptions.MarginBottom = 50;renderer.RenderingOptions.MarginLeft = 20;renderer.RenderingOptions.MarginRight = 20;
using IronPdf;
var renderer = new ChromePdfRenderer();
// Page margins in millimeters. Larger margins leave room for headers and
// footers; set them to 0 for edge-to-edge brochures and posters.
renderer.RenderingOptions.MarginTop = 50;
renderer.RenderingOptions.MarginBottom = 50;
renderer.RenderingOptions.MarginLeft = 20;
renderer.RenderingOptions.MarginRight = 20;
ImportsIronPdfDim renderer = New ChromePdfRenderer()' Page margins in millimeters. Larger margins leave room for headers and' footers; set them to 0 for edge-to-edge brochures and posters.renderer.RenderingOptions.MarginTop = 50renderer.RenderingOptions.MarginBottom = 50renderer.RenderingOptions.MarginLeft = 20renderer.RenderingOptions.MarginRight = 20
Imports IronPdf
Dim renderer = New ChromePdfRenderer()
' Page margins in millimeters. Larger margins leave room for headers and
' footers; set them to 0 for edge-to-edge brochures and posters.
renderer.RenderingOptions.MarginTop = 50
renderer.RenderingOptions.MarginBottom = 50
renderer.RenderingOptions.MarginLeft = 20
renderer.RenderingOptions.MarginRight = 20
我们可能希望打开或关闭 HTML 元素的背景图像:
using IronPdf;var renderer = new ChromePdfRenderer();// Include CSS background colors and images in the PDF (set false to drop them)renderer.RenderingOptions.PrintHtmlBackgrounds = true;var pdf = renderer.RenderHtmlAsPdf("<h1 style='background:#eee'>Hello, PDF!</h1>");pdf.SaveAs("output.pdf");
using IronPdf;
var renderer = new ChromePdfRenderer();
// Include CSS background colors and images in the PDF (set false to drop them)
renderer.RenderingOptions.PrintHtmlBackgrounds = true;
var pdf = renderer.RenderHtmlAsPdf("<h1 style='background:#eee'>Hello, PDF!</h1>");
pdf.SaveAs("output.pdf");
ImportsIronPdfDim renderer = New ChromePdfRenderer()' Include CSS background colors and images in the PDF (set false to drop them)renderer.RenderingOptions.PrintHtmlBackgrounds = TrueDim pdf = renderer.RenderHtmlAsPdf("<h1 style='background:#eee'>Hello, PDF!</h1>")pdf.SaveAs("output.pdf")
Imports IronPdf
Dim renderer = New ChromePdfRenderer()
' Include CSS background colors and images in the PDF (set false to drop them)
renderer.RenderingOptions.PrintHtmlBackgrounds = True
Dim pdf = renderer.RenderHtmlAsPdf("<h1 style='background:#eee'>Hello, PDF!</h1>")
pdf.SaveAs("output.pdf")
还可以将输出 PDF 设置为在任何虚拟纸张尺寸上渲染,包括纵向和横向尺寸,甚至可以设置为以毫米或英寸为单位的自定义尺寸。
using IronPdf;using IronPdf.Rendering;var renderer = new ChromePdfRenderer();// Standard paper sizes and orientationrenderer.RenderingOptions.PaperSize = PdfPaperSize.A4;renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape;// Or a custom size, in millimeters or inches// renderer.RenderingOptions.SetCustomPaperSizeinMilimeters(210, 297);// renderer.RenderingOptions.SetCustomPaperSizeInInches(8.5, 11);
using IronPdf;
using IronPdf.Rendering;
var renderer = new ChromePdfRenderer();
// Standard paper sizes and orientation
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape;
// Or a custom size, in millimeters or inches
// renderer.RenderingOptions.SetCustomPaperSizeinMilimeters(210, 297);
// renderer.RenderingOptions.SetCustomPaperSizeInInches(8.5, 11);
ImportsIronPdfImportsIronPdf.RenderingDim renderer = New ChromePdfRenderer()' Standard paper sizes and orientationrenderer.RenderingOptions.PaperSize = PdfPaperSize.A4renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape' Or a custom size, in millimeters or inches' renderer.RenderingOptions.SetCustomPaperSizeinMilimeters(210, 297)' renderer.RenderingOptions.SetCustomPaperSizeInInches(8.5, 11)
Imports IronPdf
Imports IronPdf.Rendering
Dim renderer = New ChromePdfRenderer()
' Standard paper sizes and orientation
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4
renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape
' Or a custom size, in millimeters or inches
' renderer.RenderingOptions.SetCustomPaperSizeinMilimeters(210, 297)
' renderer.RenderingOptions.SetCustomPaperSizeInInches(8.5, 11)
与其模板化 PDF 文档本身,不如使用 IronPDF 我们可以使用现有的、经过验证的技术来模板化我们的 HTML。当 HTML 模板与查询字符串或数据库中的数据结合时,我们最终得到一个动态生成的 PDF 文档。
在最简单的情况下,使用 C# String.Format 方法对于基本示例是有效的。
using IronPdf;var renderer = new ChromePdfRenderer();// Insert a value into an HTML template with string.Formatstring html = string.Format("<h1>Hello {0}!</h1>", "World");var pdf = renderer.RenderHtmlAsPdf(html);pdf.SaveAs("Hello.pdf");
using IronPdf;
var renderer = new ChromePdfRenderer();
// Insert a value into an HTML template with string.Format
string html = string.Format("<h1>Hello {0}!</h1>", "World");
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("Hello.pdf");
Dim renderer As New ChromePdfRenderer()' Insert a value into an HTML template with string.FormatDim html AsString = String.Format("<h1>Hello {0}!</h1>", "World")Dim pdf = renderer.RenderHtmlAsPdf(html)pdf.SaveAs("Hello.pdf")
Dim renderer As New ChromePdfRenderer()
' Insert a value into an HTML template with string.Format
Dim html As String = String.Format("<h1>Hello {0}!</h1>", "World")
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("Hello.pdf")
如果 HTML 文件较长,通常我们可以使用任意占位符,例如 [[NAME]],并在稍后用真实数据替换它们。
以下示例将创建 3 个 PDF,每个 PDF 都个性化为一个用户。
using IronPdf;var renderer = new ChromePdfRenderer();// A template with a placeholder to replacevar htmlTemplate = "<p>[[NAME]]</p>";var names = new[] { "John", "James", "Jenny" };// One personalized PDF per nameforeach (var name in names){ var htmlInstance = htmlTemplate.Replace("[[NAME]]", name); var pdf = renderer.RenderHtmlAsPdf(htmlInstance); pdf.SaveAs(name + ".pdf");}
using IronPdf;
var renderer = new ChromePdfRenderer();
// A template with a placeholder to replace
var htmlTemplate = "<p>[[NAME]]</p>";
var names = new[] { "John", "James", "Jenny" };
// One personalized PDF per name
foreach (var name in names)
{
var htmlInstance = htmlTemplate.Replace("[[NAME]]", name);
var pdf = renderer.RenderHtmlAsPdf(htmlInstance);
pdf.SaveAs(name + ".pdf");
}
ImportsIronPdfDim renderer = New ChromePdfRenderer()' A template with a placeholder to replaceDim htmlTemplate = "<p>[[NAME]]</p>"Dim names = New String() {"John", "James", "Jenny"}' One personalized PDF per nameFor Each name In names Dim htmlInstance = htmlTemplate.Replace("[[NAME]]", name) Dim pdf = renderer.RenderHtmlAsPdf(htmlInstance) pdf.SaveAs(name & ".pdf")Next
Imports IronPdf
Dim renderer = New ChromePdfRenderer()
' A template with a placeholder to replace
Dim htmlTemplate = "<p>[[NAME]]</p>"
Dim names = New String() {"John", "James", "Jenny"}
' One personalized PDF per name
For Each name In names
Dim htmlInstance = htmlTemplate.Replace("[[NAME]]", name)
Dim pdf = renderer.RenderHtmlAsPdf(htmlInstance)
pdf.SaveAs(name & ".pdf")
Next
使用 Handlebars.NET 进行高级模板化
将 C# 数据与 HTML 合并以生成 PDF 的一种复杂方法是使用 Handlebars 模板语言。
using HandlebarsDotNet;// A Handlebars template with two placeholdersvar source = @"<div class=""entry""> <h1>{{title}}</h1> <div class=""body""> {{body}} </div> </div>";// Compile it once, then fill it with any object that has matching propertiesvar template = Handlebars.Compile(source);var data = new { title = "My new post", body = "This is my first post!" };string html = template(data);// html now contains://// <div class="entry">// <h1>My new post</h1>// <div class="body">// This is my first post!// </div>// </div>
using HandlebarsDotNet;
// A Handlebars template with two placeholders
var source =
@"<div class=""entry"">
<h1>{{title}}</h1>
<div class=""body"">
{{body}}
</div>
</div>";
// Compile it once, then fill it with any object that has matching properties
var template = Handlebars.Compile(source);
var data = new { title = "My new post", body = "This is my first post!" };
string html = template(data);
// html now contains:
//
// <div class="entry">
// <h1>My new post</h1>
// <div class="body">
// This is my first post!
// </div>
// </div>
ImportsHandlebarsDotNet' A Handlebars template with two placeholdersDim source = "<div class=""entry""> <h1>{{title}}</h1> <div class=""body""> {{body}} </div> </div>"' Compile it once, then fill it with any object that has matching propertiesDim template = Handlebars.Compile(source)Dim data = New With {.title = "My new post", .body = "This is my first post!"}Dim html AsString = template(data)' html now contains:'' <div class="entry">' <h1>My new post</h1>' <div class="body">' This is my first post!' </div>' </div>
Imports HandlebarsDotNet
' A Handlebars template with two placeholders
Dim source = "<div class=""entry"">
<h1>{{title}}</h1>
<div class=""body"">
{{body}}
</div>
</div>"
' Compile it once, then fill it with any object that has matching properties
Dim template = Handlebars.Compile(source)
Dim data = New With {.title = "My new post", .body = "This is my first post!"}
Dim html As String = template(data)
' html now contains:
'
' <div class="entry">
' <h1>My new post</h1>
' <div class="body">
' This is my first post!
' </div>
' </div>
要渲染此 HTML,我们可以简单地使用 RenderHtmlAsPdf 方法。
using HandlebarsDotNet;using IronPdf;// Fill the Handlebars template, then render the resulting HTMLvar template = Handlebars.Compile("<h1>{{title}}</h1><p>{{body}}</p>");string html = template(new { title = "My new post", body = "This is my first post!" });var renderer = new ChromePdfRenderer();var pdf = renderer.RenderHtmlAsPdf(html);pdf.SaveAs("Handlebars.pdf");
using HandlebarsDotNet;
using IronPdf;
// Fill the Handlebars template, then render the resulting HTML
var template = Handlebars.Compile("<h1>{{title}}</h1><p>{{body}}</p>");
string html = template(new { title = "My new post", body = "This is my first post!" });
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("Handlebars.pdf");
ImportsHandlebarsDotNetImportsIronPdf' Fill the Handlebars template, then render the resulting HTMLDim template = Handlebars.Compile("<h1>{{title}}</h1><p>{{body}}</p>")Dim html AsString = template(New With {.title = "My new post", .body = "This is my first post!"})Dim renderer = New ChromePdfRenderer()Dim pdf = renderer.RenderHtmlAsPdf(html)pdf.SaveAs("Handlebars.pdf")
Imports HandlebarsDotNet
Imports IronPdf
' Fill the Handlebars template, then render the resulting HTML
Dim template = Handlebars.Compile("<h1>{{title}}</h1><p>{{body}}</p>")
Dim html As String = template(New With {.title = "My new post", .body = "This is my first post!"})
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("Handlebars.pdf")
using IronPdf;var renderer = new ChromePdfRenderer();// The document body, rendered from a web pagevar pdf = renderer.RenderUrlAsPdf("https://www.nuget.org/packages/IronPdf/");// Prepend an existing PDF as the cover page. Merge returns a new document.var cover = PdfDocument.FromFile("CoverPage.pdf");var pdfMerged = PdfDocument.Merge(cover, pdf);pdfMerged.SaveAs("Combined.pdf");
using IronPdf;
var renderer = new ChromePdfRenderer();
// The document body, rendered from a web page
var pdf = renderer.RenderUrlAsPdf("https://www.nuget.org/packages/IronPdf/");
// Prepend an existing PDF as the cover page. Merge returns a new document.
var cover = PdfDocument.FromFile("CoverPage.pdf");
var pdfMerged = PdfDocument.Merge(cover, pdf);
pdfMerged.SaveAs("Combined.pdf");
ImportsIronPdfDim renderer = New ChromePdfRenderer()' The document body, rendered from a web pageDim pdf = renderer.RenderUrlAsPdf("https://www.nuget.org/packages/IronPdf/")' Prepend an existing PDF as the cover page. Merge returns a new document.Dim cover = PdfDocument.FromFile("CoverPage.pdf")Dim pdfMerged = PdfDocument.Merge(cover, pdf)pdfMerged.SaveAs("Combined.pdf")
Imports IronPdf
Dim renderer = New ChromePdfRenderer()
' The document body, rendered from a web page
Dim pdf = renderer.RenderUrlAsPdf("https://www.nuget.org/packages/IronPdf/")
' Prepend an existing PDF as the cover page. Merge returns a new document.
Dim cover = PdfDocument.FromFile("CoverPage.pdf")
Dim pdfMerged = PdfDocument.Merge(cover, pdf)
pdfMerged.SaveAs("Combined.pdf")
IronPDF 支持的最后一个 C# PDF 功能是为文档添加水印。这可以用于在每页上添加“机密”或“样本”的通知。
using IronPdf;using IronPdf.Editing;var renderer = new ChromePdfRenderer();var pdf = renderer.RenderUrlAsPdf("https://www.nuget.org/packages/IronPdf");// Stamp every page with a red "SAMPLE" in the middle, rotated 30 degrees at 50% opacity.// The watermark is HTML, so any markup, styling or image can be used.pdf.ApplyWatermark( "<h2 style='color:red; font-size:50px'>SAMPLE</h2>", rotation: 30, opacity: 50, verticalAlignment: VerticalAlignment.Middle, horizontalAlignment: HorizontalAlignment.Center);pdf.SaveAs(@"C:\Path\To\Watermarked.pdf");
using IronPdf;
using IronPdf.Editing;
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderUrlAsPdf("https://www.nuget.org/packages/IronPdf");
// Stamp every page with a red "SAMPLE" in the middle, rotated 30 degrees at 50% opacity.
// The watermark is HTML, so any markup, styling or image can be used.
pdf.ApplyWatermark(
"<h2 style='color:red; font-size:50px'>SAMPLE</h2>",
rotation: 30,
opacity: 50,
verticalAlignment: VerticalAlignment.Middle,
horizontalAlignment: HorizontalAlignment.Center);
pdf.SaveAs(@"C:\Path\To\Watermarked.pdf");
ImportsIronPdfImportsIronPdf.EditingDim renderer = New ChromePdfRenderer()Dim pdf = renderer.RenderUrlAsPdf("https://www.nuget.org/packages/IronPdf")' Stamp every page with a red "SAMPLE" in the middle, rotated 30 degrees at 50% opacity.' The watermark is HTML, so any markup, styling or image can be used.pdf.ApplyWatermark("<h2 style='color:red; font-size:50px'>SAMPLE</h2>", rotation:=30, opacity:=50, verticalAlignment:=VerticalAlignment.Middle, horizontalAlignment:=HorizontalAlignment.Center)pdf.SaveAs("C:\Path\To\Watermarked.pdf")
Imports IronPdf
Imports IronPdf.Editing
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderUrlAsPdf("https://www.nuget.org/packages/IronPdf")
' Stamp every page with a red "SAMPLE" in the middle, rotated 30 degrees at 50% opacity.
' The watermark is HTML, so any markup, styling or image can be used.
pdf.ApplyWatermark("<h2 style='color:red; font-size:50px'>SAMPLE</h2>", rotation:=30, opacity:=50, verticalAlignment:=VerticalAlignment.Middle, horizontalAlignment:=HorizontalAlignment.Center)
pdf.SaveAs("C:\Path\To\Watermarked.pdf")
请注意: PDFsharp 没有 HTML 渲染引擎,而 iText 仅通过其独立的 pdfHTML 插件转换 HTML,因此两者均未包含在此浏览器渲染测试中。
结论
对于寻求现代可靠 PDF 解决方案的 .NET 开发人员,IronPDF 是一个强有力的选择。其基于 Chromium 的 HTML 到 PDF 转换、易用性、定期更新和广泛的功能集使其成为首选。无论您是在进行小型项目还是大型企业应用程序,IronPDF 都能提高生产力,同时避免使用过时或不受支持库的风险。IronPDF 专为商业应用设计,确保您的项目使用维护和支持的库。
Jacob Mellor 是 Iron Software 的首席技术官,也是一位开创 C# PDF 技术的有远见的工程师。作为 Iron Software 核心代码库的原始开发者,他从公司成立之初就开始塑造公司的产品架构,与首席执行官 Cameron Rimington 一起将公司转变为一家拥有 50 多名员工的公司,为 NASA、特斯拉和全球政府机构提供服务。