Using the C# WaitFor Class to Delay PDF Rendering
IronPDF 中的 C# WaitFor 类可帮助开发人员延迟 PDF 渲染,直至所有资源、字体和 JavaScript 加载完毕,通过使用 NetworkIdle 以及 JavaScript 触发器等方法,防止渲染不完整。
快速入门:使用 WaitFor 提升 PDF 渲染效果
IronPDF 的 WaitFor 功能允许开发者通过管理异步时序来优化 PDF 渲染效果。 通过设置 RenderDelay 等选项,可确保所有资源和脚本在转换前加载完毕,从而避免生成不完整的 PDF 文档。 本指南将展示如何在您的项目中实现 WaitFor,以实现精确高效的渲染。
new IronPdf.ChromePdfRenderer { RenderingOptions = { WaitFor = IronPdf.WaitFor.RenderDelay(3000) } }
.RenderUrlAsPdf("https://example.com")
.SaveAs("output.pdf");
new IronPdf.ChromePdfRenderer { RenderingOptions = { WaitFor = IronPdf.WaitFor.RenderDelay(3000) } }
.RenderUrlAsPdf("https://example.com")
.SaveAs("output.pdf");
简易工作流程(5个步骤)
- 下载 C# IronPDF 库以延迟 PDF 渲染
- 从 HTML 字符串、文件或网页 URL 生成 PDF 文档
- 使用 JavaScript 方法
WaitFor来从 JavaScript 函数中触发渲染 - 根据网络活动数量延迟渲染
- 等待特定 HTML 元素以及所有字体加载完毕
什么是 WaitFor 类及其选项?
为了以最佳性能渲染 PDF,WaitFor 类可优化 PDF 渲染过程。 来自 RenderOptions 的 WaitFor 对象提供了多种选项:
PageLoad:默认渲染,不等待。RenderDelay:设置任意等待时间。Fonts:等待所有字体加载完毕。JavaScript: 通过 JavaScript 函数触发渲染。HTML elements:等待特定的 HTML 元素,例如元素 ID、名称、标签名和查询选择器,以定位目标元素。NetworkIdle:等待网络空闲(0、2 或自定义时长)。
这些功能适用于使用 IronPDF 将 HTML 字符串转换为 PDF、将 HTML 文件转换为 PDF,以及将网页 URL 转换为 PDF。
如何立即渲染 PDF 文件而无需等待?
默认情况下,页面加载完成后会立即进行渲染。 对于常规渲染,无需调用 `` 方法。 此方法适用于不含复杂 JavaScript 或外部资源的简单 HTML 内容。
:path=/static-assets/pdf/content-code-examples/how-to/waitfor-pageload.cs
using IronPdf;
ChromePdfRenderer renderer = new ChromePdfRenderer();
// Render as soon as the page is loaded
renderer.RenderingOptions.WaitFor.PageLoad();
PdfDocument pdf = renderer.RenderHtmlAsPdf("<h1>testing</h1>");
Imports IronPdf
Dim renderer As New ChromePdfRenderer()
' Render as soon as the page is loaded
renderer.RenderingOptions.WaitFor.PageLoad()
Dim pdf As PdfDocument = renderer.RenderHtmlAsPdf("<h1>testing</h1>")
如何在 PDF 渲染前添加自定义延迟?
若在渲染 PDF 之前需要特定的延迟,您可以设置任意毫秒数作为延迟时间。 这为特定的时间要求提供了灵活性,特别是在处理大量 JavaScript 内容时。
此选项的工作原理与旧版实现相同,均使用 属性。 不过,该旧属性已被废弃。 使用新 API:。
:path=/static-assets/pdf/content-code-examples/how-to/waitfor-delay-time.cs
using IronPdf;
ChromePdfRenderer renderer = new ChromePdfRenderer();
// Render after 3000ms
renderer.RenderingOptions.WaitFor.RenderDelay(3000);
PdfDocument pdf = renderer.RenderHtmlAsPdf("<h1>testing</h1>");
Imports IronPdf
Private renderer As New ChromePdfRenderer()
' Render after 3000ms
renderer.RenderingOptions.WaitFor.RenderDelay(3000)
Dim pdf As PdfDocument = renderer.RenderHtmlAsPdf("<h1>testing</h1>")
当您的 HTML 包含动画、延迟加载的内容,或需要时间生成动态内容时,延迟机制会非常有用。 对于复杂的渲染场景,请探索自定义渲染选项。
如何在渲染前等待所有字体加载完毕?
类中的 方法会暂停 PDF 渲染,直到所有字体(例如来自 Google Fonts 等外部来源的字体)加载完毕。 这可确保最终生成的 PDF 包含所有必需的字体,从而保留文档预期的排版和视觉效果。 此功能可确保专业的PDF输出质量。
:path=/static-assets/pdf/content-code-examples/how-to/waitfor-all-fonts.cs
using IronPdf;
string htmlContent = @"
<!DOCTYPE html>
<html lang=""en"">
<head>
<meta charset=""UTF-8"">
<title>Test Registration of Extension</title>
<!-- for google web fonts -->
<link rel=""preconnect"" href=""https://fonts.googleapis.com"">
<link rel=""preconnect"" href=""https://fonts.gstatic.com"" crossorigin>
<link rel=""stylesheet"" href=""https://fonts.googleapis.com/css2?family=Roboto:wght@400;700&display=swap"" >
<style>
/* for remote fonts */
@font-face {
font-family: 'CustomFont';
src: url('https://stage.gradfinale.co.uk/tcpdf/fonts/avgr65wttf.ttf');
}
p#p1 { font-family: CustomFont, sans-serif; }
/* for local fonts */
@font-face {
font-family: 'LocalCustomFont';
src: local('Arial');
}
p#p3 { font-family: LocalCustomFont, sans-serif; }
</style>
</head>
<body>
<h1>This is Delayed Render Test!</h1>
<p style=""font-family: Roboto, monospace;"">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla scelerisque ligula venenatis erat <strong>scelerisque</strong> auctor.</p>
<p id=""p1"">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla scelerisque ligula venenatis erat <strong>scelerisque</strong> auctor.</p>
<p id=""p3"">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla scelerisque ligula venenatis erat <strong>scelerisque</strong> auctor.</p>
</body>
</html>)";
ChromePdfRenderer renderer = new ChromePdfRenderer();
renderer.RenderingOptions.WaitFor.AllFontsLoaded(10000);
PdfDocument pdf = renderer.RenderHtmlAsPdf(htmlContent);
Imports IronPdf
Dim htmlContent As String = "
<!DOCTYPE html>
<html lang=""en"">
<head>
<meta charset=""UTF-8"">
<title>Test Registration of Extension</title>
<!-- for google web fonts -->
<link rel=""preconnect"" href=""https://fonts.googleapis.com"">
<link rel=""preconnect"" href=""https://fonts.gstatic.com"" crossorigin>
<link rel=""stylesheet"" href=""https://fonts.googleapis.com/css2?family=Roboto:wght@400;700&display=swap"" >
<style>
/* for remote fonts */
@font-face {
font-family: 'CustomFont';
src: url('https://stage.gradfinale.co.uk/tcpdf/fonts/avgr65wttf.ttf');
}
p#p1 { font-family: CustomFont, sans-serif; }
/* for local fonts */
@font-face {
font-family: 'LocalCustomFont';
src: local('Arial');
}
p#p3 { font-family: LocalCustomFont, sans-serif; }
</style>
</head>
<body>
<h1>This is Delayed Render Test!</h1>
<p style=""font-family: Roboto, monospace;"">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla scelerisque ligula venenatis erat <strong>scelerisque</strong> auctor.</p>
<p id=""p1"">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla scelerisque ligula venenatis erat <strong>scelerisque</strong> auctor.</p>
<p id=""p3"">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla scelerisque ligula venenatis erat <strong>scelerisque</strong> auctor.</p>
</body>
</html>"
Dim renderer As New ChromePdfRenderer()
renderer.RenderingOptions.WaitFor.AllFontsLoaded(10000)
Dim pdf As PdfDocument = renderer.RenderHtmlAsPdf(htmlContent)
有关 PDF 中字体管理的更多信息(包括嵌入和子集选项),请参阅 PDF 字体管理指南。
如何使用自定义 JavaScript 触发 PDF 渲染?
若需更精细地控制渲染过程,您可以指定一个自定义 JavaScript 函数,该函数将在渲染 PDF 文档之前执行。 这使您能够在启动渲染过程之前执行必要的任务或检查,从而让您能够控制何时触发渲染。
在 JavaScript 中,函数会触发渲染任务。 一旦调用,渲染过程即开始。 您可以自行控制何时调用该函数。
:path=/static-assets/pdf/content-code-examples/how-to/waitfor-javascript.cs
using IronPdf;
string html = @"<!DOCTYPE html>
<html>
<body>
<h1>Testing</h1>
<script type='text/javascript'>
// Set delay
setTimeout(function() {
window.ironpdf.notifyRender();
}, 1000);
</script>
</body>
</html>";
ChromePdfRenderOptions renderingOptions = new ChromePdfRenderOptions();
// Set rendering to wait for the notifyRender function
renderingOptions.WaitFor.JavaScript(5000);
PdfDocument pdf = ChromePdfRenderer.StaticRenderHtmlAsPdf(html, renderingOptions);
这种方法在结合 AJAX 请求使用时,或在确保动态生成的内容完全加载后再进行渲染时,效果尤为显著。 有关高级 JavaScript 场景,请参阅在 PDF 中执行自定义 JavaScript 的指南。
如何在渲染前等待特定的 HTML 元素?
使用此选项时,渲染过程会等待特定的 HTML 元素(例如元素 ID、名称、标签名和查询选择器)以定位目标元素。 此功能在处理单页应用程序(SPAs)或异步加载的内容时非常有用。
如何通过 ID 等待一个元素?
在下面的代码示例中,渲染操作会等待特定元素的ID。
:path=/static-assets/pdf/content-code-examples/how-to/waitfor-html-element-id.cs
using IronPdf;
string htmlContent = @"
<!DOCTYPE html>
<html lang=""en"">
<head>
<meta charset=""UTF-8"">
<title>Delayed render tests</title>
<script type=""text/javascript"">
setTimeout(function() {
var h1Tag = document.createElement(""h1"");
h1Tag.innerHTML = ""bla bla bla"";
h1Tag.setAttribute(""id"", ""myid"");
var block = document.querySelector(""div#x"");
block.appendChild(h1Tag);
}, 1000);
</script>
</head>
<body>
<h1>This is Delayed Render Test!</h1>
<div id=""x""></div>
</body>
</html>";
ChromePdfRenderer renderer = new ChromePdfRenderer();
renderer.RenderingOptions.WaitFor.HtmlElementById("myid", 5000);
PdfDocument pdf = renderer.RenderHtmlAsPdf(htmlContent);
Imports IronPdf
Dim htmlContent As String = "
<!DOCTYPE html>
<html lang=""en"">
<head>
<meta charset=""UTF-8"">
<title>Delayed render tests</title>
<script type=""text/javascript"">
setTimeout(function() {
var h1Tag = document.createElement(""h1"");
h1Tag.innerHTML = ""bla bla bla"";
h1Tag.setAttribute(""id"", ""myid"");
var block = document.querySelector(""div#x"");
block.appendChild(h1Tag);
}, 1000);
</script>
</head>
<body>
<h1>This is Delayed Render Test!</h1>
<div id=""x""></div>
</body>
</html>"
Dim renderer As New ChromePdfRenderer()
renderer.RenderingOptions.WaitFor.HtmlElementById("myid", 5000)
Dim pdf As PdfDocument = renderer.RenderHtmlAsPdf(htmlContent)
如何通过 name 属性等待某个元素?
在下面的代码示例中,渲染过程会等待一个特定的元素名称。
:path=/static-assets/pdf/content-code-examples/how-to/waitfor-html-element-id.cs
using IronPdf;
string htmlContent = @"
<!DOCTYPE html>
<html lang=""en"">
<head>
<meta charset=""UTF-8"">
<title>Delayed render tests</title>
<script type=""text/javascript"">
setTimeout(function() {
var h1Tag = document.createElement(""h1"");
h1Tag.innerHTML = ""bla bla bla"";
h1Tag.setAttribute(""id"", ""myid"");
var block = document.querySelector(""div#x"");
block.appendChild(h1Tag);
}, 1000);
</script>
</head>
<body>
<h1>This is Delayed Render Test!</h1>
<div id=""x""></div>
</body>
</html>";
ChromePdfRenderer renderer = new ChromePdfRenderer();
renderer.RenderingOptions.WaitFor.HtmlElementById("myid", 5000);
PdfDocument pdf = renderer.RenderHtmlAsPdf(htmlContent);
Imports IronPdf
Dim htmlContent As String = "
<!DOCTYPE html>
<html lang=""en"">
<head>
<meta charset=""UTF-8"">
<title>Delayed render tests</title>
<script type=""text/javascript"">
setTimeout(function() {
var h1Tag = document.createElement(""h1"");
h1Tag.innerHTML = ""bla bla bla"";
h1Tag.setAttribute(""id"", ""myid"");
var block = document.querySelector(""div#x"");
block.appendChild(h1Tag);
}, 1000);
</script>
</head>
<body>
<h1>This is Delayed Render Test!</h1>
<div id=""x""></div>
</body>
</html>"
Dim renderer As New ChromePdfRenderer()
renderer.RenderingOptions.WaitFor.HtmlElementById("myid", 5000)
Dim pdf As PdfDocument = renderer.RenderHtmlAsPdf(htmlContent)
如何按标签名称等待元素?
在下面的代码示例中,渲染过程会等待特定的元素标签名。
:path=/static-assets/pdf/content-code-examples/how-to/waitfor-html-element-tag-name.cs
using IronPdf;
string htmlContent = @"
<!DOCTYPE html>
<html lang=""en"">
<head>
<meta charset=""UTF-8"">
<title>Delayed render tests</title>
<script type=""text/javascript"">
setTimeout(function() {
var newElem = document.createElement(""h2"");
newElem.innerHTML = ""bla bla bla"";
var block = document.querySelector(""div#x"");
block.appendChild(newElem);
}, 1000);
</script>
</head>
<body>
<h1>This is Delayed Render Test!</h1>
<div id=""x""></div>
</body>
</html>";
ChromePdfRenderer renderer = new ChromePdfRenderer();
renderer.RenderingOptions.WaitFor.HtmlElementByTagName("h2", 5000);
PdfDocument pdf = renderer.RenderHtmlAsPdf(htmlContent);
Imports IronPdf
Dim htmlContent As String = "
<!DOCTYPE html>
<html lang=""en"">
<head>
<meta charset=""UTF-8"">
<title>Delayed render tests</title>
<script type=""text/javascript"">
setTimeout(function() {
var newElem = document.createElement(""h2"");
newElem.innerHTML = ""bla bla bla"";
var block = document.querySelector(""div#x"");
block.appendChild(newElem);
}, 1000);
</script>
</head>
<body>
<h1>This is Delayed Render Test!</h1>
<div id=""x""></div>
</body>
</html>"
Dim renderer As New ChromePdfRenderer()
renderer.RenderingOptions.WaitFor.HtmlElementByTagName("h2", 5000)
Dim pdf As PdfDocument = renderer.RenderHtmlAsPdf(htmlContent)
如何使用查询选择器等待元素?
在下面的代码示例中,渲染过程会等待查询选择器所选定的元素。 方法等待一个img 标签具有id 为 'myid'且class 为 'blablastyle'的img 标签@@-
:path=/static-assets/pdf/content-code-examples/how-to/waitfor-html-element-query-selector.cs
using IronPdf;
string htmlContent = @"
<!DOCTYPE html>
<html lang=""en"">
<head>
<meta charset=""UTF-8"">
<title>Test Registration of Extension</title>
<script type=""text/javascript"">
setTimeout(function() {
var img = document.createElement(""img"");
img.onload = function() {
img.setAttribute(""id"", ""myid"");
img.setAttribute(""class"", ""blablastyle"");
var block = document.getElementById(""x"");
block.appendChild(img);
};
img.src = ""https://www.w3schools.com/images/picture.jpg""; // .src after .onload to ignore cached, if any
}, 1000);
</script>
</head>
<body>
<h1>This is Delayed Render Test!</h1>
<div id=""x""></div>
</body>
</html>";
ChromePdfRenderer renderer = new ChromePdfRenderer();
renderer.RenderingOptions.WaitFor.HtmlQuerySelector("img#myid.blablastyle", 5000);
PdfDocument pdf = renderer.RenderHtmlAsPdf(htmlContent);
Imports IronPdf
Dim htmlContent As String = "
<!DOCTYPE html>
<html lang=""en"">
<head>
<meta charset=""UTF-8"">
<title>Test Registration of Extension</title>
<script type=""text/javascript"">
setTimeout(function() {
var img = document.createElement(""img"");
img.onload = function() {
img.setAttribute(""id"", ""myid"");
img.setAttribute(""class"", ""blablastyle"");
var block = document.getElementById(""x"");
block.appendChild(img);
};
img.src = ""https://www.w3schools.com/images/picture.jpg""; // .src after .onload to ignore cached, if any
}, 1000);
</script>
</head>
<body>
<h1>This is Delayed Render Test!</h1>
<div id=""x""></div>
</body>
</html>"
Dim renderer As New ChromePdfRenderer()
renderer.RenderingOptions.WaitFor.HtmlQuerySelector("img#myid.blablastyle", 5000)
Dim pdf As PdfDocument = renderer.RenderHtmlAsPdf(htmlContent)
如何等待网络活动完成?
在渲染需要通过网络请求获取资源、数据或调用 API 的网页时,请确保所有网络活动完成之后再生成 PDF。 IronPDF 提供了多种方法来处理不同的网络场景。
何时应等待网络活动归零?
此类网络空闲状态会等待直至网络活动完全停止,这通常表示内容已加载完毕。 这适用于单页应用程序(SPAs)或不包含长轮询网络请求或持续网络活动的简单网页。
当网络活动停止至少 500 毫秒后,渲染过程即开始。
:path=/static-assets/pdf/content-code-examples/how-to/waitfor-network-idle-0.cs
using IronPdf;
ChromePdfRenderer renderer = new ChromePdfRenderer();
// Render unless there has been no network activity for at least 500ms
renderer.RenderingOptions.WaitFor.NetworkIdle0();
PdfDocument pdf = renderer.RenderHtmlAsPdf("<h1>testing</h1>");
Imports IronPdf
Dim renderer As New ChromePdfRenderer()
' Render unless there has been no network activity for at least 500ms
renderer.RenderingOptions.WaitFor.NetworkIdle0()
Dim pdf As PdfDocument = renderer.RenderHtmlAsPdf("<h1>testing</h1>")
何时应允许两项网络活动?
`` 方法适用于包含长轮询网络请求或心跳检测的 Web 应用程序或网页。 通常涉及 1-2 个请求。 即使这些请求处于进行中,也不会导致网络空闲事件失效,因为最多存在两个此类请求是可接受的。
在启动渲染过程之前,剩余的网络活动数量应不超过两项,且每项活动应至少持续 500 毫秒。 此选项提供快速配置,用于处理固定数量的网络活动。
:path=/static-assets/pdf/content-code-examples/how-to/waitfor-network-idle-2.cs
using IronPdf;
ChromePdfRenderer renderer = new ChromePdfRenderer();
// Render unless there are at most 2 network activities for at least 500ms
renderer.RenderingOptions.WaitFor.NetworkIdle2();
PdfDocument pdf = renderer.RenderHtmlAsPdf("<h1>testing</h1>");
Imports IronPdf
Dim renderer As New ChromePdfRenderer()
' Render unless there are at most 2 network activities for at least 500ms
renderer.RenderingOptions.WaitFor.NetworkIdle2()
Dim pdf As PdfDocument = renderer.RenderHtmlAsPdf("<h1>testing</h1>")
如何自定义网络活动阈值?
当涉及多个网络请求时,您可以自定义网络空闲时长以及不导致网络空闲事件失效的允许网络请求数量。 此选项适用于具有特定需求且不适合前两种方法的 Web 应用程序或网页。 此定制方案可满足不同情境下的广泛应用场景。
:path=/static-assets/pdf/content-code-examples/how-to/waitfor-customize-network.cs
using IronPdf;
ChromePdfRenderer renderer = new ChromePdfRenderer();
// Render unless there are at most 5 network activities for at least 1000ms
renderer.RenderingOptions.WaitFor.NetworkIdle(1000, 5);
PdfDocument pdf = renderer.RenderHtmlAsPdf("<h1>testing</h1>");
Imports IronPdf
Private renderer As New ChromePdfRenderer()
' Render unless there are at most 5 network activities for at least 1000ms
renderer.RenderingOptions.WaitFor.NetworkIdle(1000, 5)
Dim pdf As PdfDocument = renderer.RenderHtmlAsPdf("<h1>testing</h1>")
在处理保持持久连接或具有可预测后台网络活动模式的复杂 Web 应用程序时,这种级别的定制化非常有价值。
如何设置最大等待时间?
方法允许您设置最大等待时间,以确保等待不会无限期持续。 这些方法中的 参数即用于此目的。 这可防止在预期条件从未发生时,应用程序无限期卡死。
所有指定的时间值均以毫秒为单位。
在实施这些等待策略时,需在确保内容完全加载与保持合理性能之间取得平衡。 对于需要精确时间控制的应用程序,请探索异步 PDF 生成技术。
准备好探索更多可能了吗? 请在此处查看教程页面:附加功能,或探索使用 IronPDF 创建 PDF 以掌握更多高级技巧。
常见问题解答
什么是 WaitFor 类,为什么要使用它?
IronPDF 中的 WaitFor 类允许开发人员延迟 PDF 渲染,直到所有资产、字体和 JavaScript 加载完毕。这可以防止不完整的渲染,并确保复杂的网页在转换为 PDF 之前已完全加载,从而生成更准确、更完整的 PDF 文档。
有哪些不同的 WaitFor 选项?
IronPDF 的 WaitFor 类提供了多个选项:PageLoad(默认立即渲染)、RenderDelay(以毫秒为单位的自定义延迟)、Fonts(等待所有字体加载)、JavaScript(通过 JavaScript 函数触发渲染)、HTML 元素(通过 ID、名称、标签或查询选择器等待特定元素)和 NetworkIdle(等待网络活动停止)。
如何在 PDF 渲染前添加自定义延迟?
您可以使用 IronPDF 中的 RenderDelay 方法添加自定义延迟。只需以毫秒为单位指定延迟时间即可:`new ChromePdfRenderer { RenderingOptions = { WaitFor = WaitFor.RenderDelay(3000) }。}`.这对于需要额外时间来执行的 JavaScript 内容尤其有用。
我能否等待特定 HTML 元素加载后再进行渲染?
是的,IronPDF 允许您使用元素 ID、名称、标签名称或查询选择器来等待特定的 HTML 元素。这可确保在 PDF 转换开始之前页面上存在关键内容,从而避免在最终 PDF 文档中丢失元素。
NetworkIdle 是什么,何时使用?
IronPDF 中的 NetworkIdle 会等待网络活动停止后再渲染 PDF。您可以将其设置为等待 0、2 或自定义数量的网络连接。这非常适合通过 AJAX 调用或其他异步网络请求动态加载内容的页面。
如何从 JavaScript 触发 PDF 渲染?
IronPDF 的 WaitFor JavaScript 选项允许您从 JavaScript 函数触发渲染过程。这让您可以完全控制 PDF 生成的时间,非常适合需要精确控制时间的单页应用程序或复杂的 JavaScript 驱动型网站。

