如何使用 WaitFor 延迟 C# PDF 渲染

How to Use the WaitFor Class to Delay C# PDF Rendering

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

在渲染 PDF 文档时,一个常见的问题是渲染过程发生在所有必要的资产和 JavaScript 动画加载完成之前。 这可能导致 PDF 文档的呈现不完整或不正确。 最初,我们通过允许用户设置任意延迟来解决这个问题。 但是,依赖于任意延迟并不是一种可靠或有效的方法。

快速开始:使用 WaitFor 增强 PDF 渲染

IronPDF 的 WaitFor 功能允许开发人员通过管理异步计时来优化 PDF 渲染。 通过设置像 RenderDelay 这样的选项,可以确保在转换之前加载所有资产和脚本,防止 PDF 文档不完整。 本指南展示了如何在项目中轻松实现 WaitFor 以实现精确和高效的渲染。

Nuget IconGet started making PDFs with NuGet now:

  1. Install IronPDF with NuGet Package Manager

    PM > Install-Package IronPdf

  2. Copy and run this code snippet.

    new IronPdf.ChromePdfRenderer { RenderingOptions = { WaitFor = IronPdf.WaitFor.RenderDelay(3000) } }
        .RenderUrlAsPdf("https://example.com")
        .SaveAs("output.pdf");
  3. Deploy to test on your live environment

    Start using IronPDF in your project today with a free trial
    arrow pointer
class="hsg-featured-snippet">

最小工作流程(5 个步骤)

  1. 下载 C# IronPDF 库以延迟 PDF 渲染
  2. 从 HTML 字符串、文件或网页 URL 生成 PDF 文档
  3. 利用 WaitFor 的 JavaScript 方法从 JavaScript 函数触发渲染
  4. 根据网络活动的数量延迟渲染
  5. 等待特定的 HTML 元素以及所有字体都加载完成

WaitFor

为了提供更稳健的解决方案,我们实现了一个 WaitFor 类,以增强 PDF 渲染过程。 来自 RenderOptionsWaitFor 对象提供了多种选项,包括:

  • PageLoad:默认渲染,无需等待。
  • RenderDelay:设置任意的等待时间。
  • Fonts:等待直到所有字体已加载。
  • JavaScript:使用 JavaScript 函数触发渲染。
  • HTML elements:等待特定的 HTML 元素,例如元素 ID、名称、标签名和查询选择器以定位元素。
  • NetworkIdle:等待网络空闲(0、2或自定义数量)。

These features are available for converting HTML strings to PDF with IronPDF, HTML files to PDF with IronPDF, and web URLs to PDF with IronPDF. 让我们探讨这一新功能的关键方面。

默认立即渲染示例

默认情况下,渲染过程会在页面加载完成后立即发生。 如果您想正常渲染,则无需调用 PageLoad 方法。

: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>");
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

自定义渲染延迟示例

在需要在渲染 PDF 之前进行特定延迟的情况下,可以设置任意毫秒数作为延迟。 这提供了满足任何特定计时要求的灵活性。

此选项的工作方式与旧实施使用 RenderingOptions.RenderDelay 属性相同。 然而,旧属性已被弃用,建议使用新的 API,即 RenderingOptions.WaitFor.RenderDelay

: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>")
$vbLabelText   $csharpLabel

所有字体已加载示例

WaitFor 类中的 AllFontsLoaded 方法允许 PDF 渲染过程暂停,直到从 Google Fonts 或其他服务器加载所有字体为止。 这确保最终的 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);
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

自定义 JavaScript 执行示例

为了更好地控制渲染过程,我们的功能允许您指定在渲染 PDF 文档之前需要执行的自定义 JavaScript 函数。 这使您能够在启动渲染过程之前执行任何必要的任务或检查。 这让用户控制何时触发渲染。

在 JavaScript 中,使用函数 window.ironpdf.notifyRender() 来触发渲染任务。 一旦调用 notifyRender(),渲染过程将开始。 您可以完全控制何时调用该函数。

: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);
JAVASCRIPT

HTML 元素示例

通过这个选项,渲染过程可以被设置为等待特定的 HTML 元素,例如元素 ID、名称、标签名,甚至使用查询选择器来定位元素。

等待元素 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);
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

等待元素名称

在下面的代码示例中,渲染过程将等待特定的元素名称。

:path=/static-assets/pdf/content-code-examples/how-to/waitfor-html-element-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 h1Tag = document.createElement(""h1"");
		h1Tag.innerHTML = ""bla bla bla"";
		h1Tag.setAttribute(""name"", ""myName"");

        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.HtmlElementByName("myName", 5000);

PdfDocument pdf = renderer.RenderHtmlAsPdf(htmlContent);
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

等待元素标签名

在下面的代码示例中,渲染过程将等待特定的元素标签名。

: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);
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

使用查询选择器

在下面的代码示例中,渲染过程将等待由查询选择器选定的元素。 HtmlQuerySelector 方法将等待一个具有 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);
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

网络空闲示例

没有网络活动

这种类型的网络空闲允许您等待,直到没有网络活动,通常表明内容已完全加载。 这适合用于单页应用程序(SPA)或没有长轮询网络请求或持续网络活动的简单网页。

渲染过程将在至少 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>");
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

允许两个网络活动

NetworkIdle2 方法适用于具有长轮询网络请求或心跳 ping 的 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>");
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

自定义网络活动许可

在涉及多个网络请求的情况下,您可以灵活地自定义网络空闲持续时间允许的网络数量请求,而不会让网络空闲事件触发无效。 此选项适用于具有特定需求的 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>")
$vbLabelText   $csharpLabel

设置最长等待时间

此外,JavaScriptNetworkIdleNetworkIdle0NetworkIdle2 方法还允许您设置最长等待时间,以确保等待不会无限期。可以使用这些方法的 maxWaitTime 参数。

请注意所有指定的时间值都被视为毫秒。

准备好看看您还能做些什么吗? 查看我们的教程页面:额外功能

常见问题解答

什么是PDF渲染库中的WaitFor类?

IronPDF中的WaitFor类用于管理PDF渲染期间异步操作的时间,确保在渲染文档之前加载所有必要的资产和JavaScript动画。

如何延迟PDF渲染直到所有页面资产都加载完毕?

在IronPDF中,您可以使用WaitFor类选项如PageLoad、RenderDelay或AllFontsLoaded,以确保在渲染PDF文档之前加载所有必要的页面资产。

WaitFor类中有哪些选项可用于管理渲染延迟?

IronPDF的WaitFor类包括诸如PageLoad、RenderDelay、Fonts、JavaScript、HTML元素和NetworkIdle等选项,每个选项都允许您在渲染PDF之前等待特定条件。

WaitFor类中的PageLoad选项如何影响PDF渲染?

IronPDF的WaitFor类中的PageLoad选项允许PDF在页面加载完成后立即渲染,无需额外等待。

如何设置在渲染PDF之前的特定延迟时间?

在IronPDF中,您可以使用WaitFor类中的RenderDelay选项来指定任意毫秒数的延迟渲染,以符合特定的时间需求。

AllFontsLoaded方法在PDF渲染中的作用是什么?

IronPDF的AllFontsLoaded方法确保PDF渲染过程暂停,直到所有外部来源的字体完全加载,保证最终的PDF包含所需的所有字体。

可以使用JavaScript来控制PDF渲染时间吗?

是的,在IronPDF中,您可以在WaitFor类中使用自定义JavaScript函数来控制何时触发PDF渲染过程。

WaitFor类中的NetworkIdle选项有什么作用?

IronPDF的WaitFor类中的NetworkIdle选项会延迟PDF渲染,直到指定的网络活动水平停止,确保所有内容完全加载。

是否可以在PDF渲染中自定义网络活动设置?

IronPDF允许您自定义WaitFor类中的网络活动设置,包括渲染期间的网络空闲持续时间和允许的网络请求数量。

如何防止在PDF渲染过程中无限等待?

您可以在IronPDF的WaitFor类中使用maxWaitTime参数与JavaScript、NetworkIdle、NetworkIdle0和NetworkIdle2等方法设置最大等待时间。

WaitFor 功能是否完全兼容 .NET 10?

是的——IronPDF 的 WaitFor 类在 .NET 10 上可以无缝运行。IronPDF 与 .NET 10 项目完全兼容,因此在面向 .NET 10 时,您可以直接使用所有 WaitFor 选项,例如 PageLoad、RenderDelay、NetworkIdle 等,无需任何修改。

Chaknith Bin
软件工程师
Chaknith 在 IronXL 和 IronBarcode 工作。他在 C# 和 .NET 方面有着深厚的专业知识,帮助改进软件并支持客户。他从用户互动中获得的见解有助于更好的产品、文档和整体体验。
准备开始了吗?
Nuget 下载 16,154,058 | 版本: 2025.11 刚刚发布