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

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

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 Icon立即开始使用 NuGet 创建 PDF 文件:

  1. 使用 NuGet 包管理器安装 IronPDF

    PM > Install-Package IronPdf

  2. 复制并运行这段代码。

    new IronPdf.ChromePdfRenderer { RenderingOptions = { WaitFor = IronPdf.WaitFor.RenderDelay(3000) } }
        .RenderUrlAsPdf("https://example.com")
        .SaveAs("output.pdf");
  3. 部署到您的生产环境中进行测试

    立即开始在您的项目中使用 IronPDF,免费试用!
    arrow pointer

WaitFor

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

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

这些功能可用于将 HTML 字符串转换为 PDFHTML 文件转换为 PDF网页 URL 转换为 PDF。 让我们探讨这一新功能的关键方面。

默认立即渲染示例

默认情况下,渲染过程会在页面加载完成后立即发生。 如果您想正常渲染,则无需调用 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,493,056 | Version: 2025.11 刚刚发布