Comment utiliser WaitFor pour retarder le rendu PDF C#

Utilisation de la classe WaitFor de C# pour retarder le rendu PDF

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

La classe WaitFor de C# dans IronPDF aide les développeurs à retarder le rendu PDF jusqu'à ce que toutes les ressources, polices et JavaScript soient chargées, évitant ainsi les rendus incomplets grâce à des méthodes telles que RenderDelay , NetworkIdle et les déclencheurs JavaScript.

Démarrage rapide : Utiliser WaitFor pour améliorer le rendu PDF

La fonctionnalité WaitFor d'IronPDF permet aux développeurs d'améliorer le rendu PDF en gérant la synchronisation asynchrone. En définissant des options comme RenderDelay, vous pouvez vous assurer que tous les éléments et scripts sont chargés avant la conversion, évitant ainsi des documents PDF incomplets. Ce guide montre comment mettre en œuvre WaitFor dans vos projets pour un rendu précis et efficace.

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

Qu'est-ce que la classe WaitFor et ses options ?

Pour un rendu PDF aux performances optimales , la classe WaitFor améliore le processus de rendu PDF. L'objet WaitFor de RenderOptions offre plusieurs options :

  • PageLoad: Rendu par défaut sans attente.
  • RenderDelay : Définit un temps d'attente arbitraire.
  • Fonts : Attend que toutes les polices soient chargées.
  • JavaScript : déclenche le rendu avec une fonction JavaScript.
  • Eléments HTML: Attend des éléments HTML spécifiques, tels que les identifiants d'éléments, les noms, les noms de balises et les sélecteurs de requêtes pour cibler des éléments.
  • NetworkIdle : Attend que le réseau soit inactif (0, 2 ou une valeur personnalisée).

Ces fonctionnalités fonctionnent lors de la conversion de chaînes HTML en PDF avec IronPDF, fichiers HTML en PDF avec IronPDF, et URL web en PDF avec IronPDF.

Comment rendre les PDF immédiatement et sans attente?

Par défaut, le rendu se produit immédiatement après la fin du chargement de la page. La méthode PageLoad n'a pas besoin d'être appelée pour un rendu normal. Cette approche fonctionne bien pour un contenu HTML simple, sans JavaScript complexe ni ressources externes.

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

Comment ajouter un délai personnalisé avant le rendu du PDF?

Lorsqu'un délai spécifique est requis avant le rendu du PDF, vous pouvez définir un nombre arbitraire de millisecondes comme délai. Cela offre une certaine flexibilité pour les exigences spécifiques en matière de délais, notamment lorsqu'il s'agit de contenu à forte teneur en JavaScript.

Cette option fonctionne de la même manière que l'ancienne implémentation en utilisant la propriété RenderingOptions.RenderDelay. Toutefois, l'ancienne propriété a été supprimée. Utilisez la nouvelle 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>");
$vbLabelText   $csharpLabel

Le mécanisme de retard est utile lorsque votre HTML contient des animations, du contenu chargé paresseusement ou nécessite du temps pour la génération de contenu dynamique. Pour les scénarios de rendu complexes, explorez les options de rendu personnalisées.

Comment attendre le chargement de toutes les polices avant d'effectuer le rendu?

La méthode AllFontsLoaded de la classe WaitFor interrompt le rendu du PDF jusqu'à ce que toutes les polices soient chargées à partir de sources externes telles que Google Fonts. Cela permet de s'assurer que le PDF final inclut toutes les polices de caractères requises, préservant ainsi la typographie et l'aspect visuel du document. Cette fonctionnalité permet de maintenir une qualité de sortie PDF professionnelle.

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

Pour plus d'informations sur la gestion des polices dans les PDF, notamment sur les options d'incorporation et de sous-ensemble, consultez le guide sur la gestion des polices dans les PDF.

Comment déclencher le rendu d'un PDF à l'aide d'un JavaScript personnalisé?

Pour mieux contrôler le processus de rendu, vous pouvez spécifier une fonction JavaScript personnalisée qui s'exécute avant le rendu du document PDF. Cela vous permet d'effectuer les tâches ou les vérifications nécessaires avant de lancer le processus de rendu, ce qui vous donne le contrôle sur le moment de déclencher le rendu.

En JavaScript, la fonction window.IronPDF.notifyRender() déclenche la tâche de rendu. Une fois que notifyRender() est invoqué, le processus de rendu commence. C'est vous qui décidez quand invoquer la fonction.

: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

Cette approche est efficace lorsqu'elle est combinée avec des requêtes AJAX ou lorsqu'elle permet de garantir que le contenu généré dynamiquement est entièrement chargé avant le rendu. Pour les scénarios JavaScript avancés, consultez le guide sur l'exécution de JavaScript personnalisé dans les PDF.

Comment puis-je attendre que des éléments HTML spécifiques soient rendus ?

Avec cette option, le processus de rendu attend des éléments HTML spécifiques, tels que les ID d'éléments, les noms, les noms de balises et les sélecteurs de requête pour cibler les éléments. Cette fonctionnalité est utile lorsque l'on travaille avec des applications à page unique (SPA) ou du contenu qui se charge de manière asynchrone.

Comment attendre un élément par son ID?

Dans l'exemple de code ci-dessous, le rendu attend l'ID d'un élément spécifique.

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

Comment attendre un élément par son attribut de nom?

Dans l'exemple de code ci-dessous, le processus de rendu attend un nom d'élément spécifique.

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

Comment attendre des éléments par nom de balise?

Dans l'exemple de code ci-dessous, le processus de rendu attend un nom de balise d'élément spécifique.

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

Comment utiliser les sélecteurs de requête pour attendre des éléments?

Dans l'exemple de code ci-dessous, le processus de rendu attend l'élément sélectionné par le sélecteur de requête. La méthode HtmlQuerySelector attend une balise img avec un id de 'myid' et une classe de 'blablastyle'.

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

Comment attendre la fin d'une activité réseau?

Lors du rendu de pages web qui font des demandes de ressources, de données ou d'appels d'API sur le réseau, assurez-vous que toute l'activité du réseau est terminée avant de générer le PDF. IronPDF propose plusieurs méthodes pour gérer différents scénarios de réseau.

Quand dois-je attendre qu'il n'y ait plus d'activité sur le réseau?

Ce type d'attente attend qu'il n'y ait pas d'activité sur le réseau, ce qui indique généralement que le contenu a été entièrement chargé. Elle convient aux applications à page unique (SPA) ou aux pages web simples sans requêtes réseau de longue durée ou sans activité réseau continue.

Le processus de rendu commence dès qu'il n'y a aucune activité réseau en cours pendant au moins 500 ms.

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

Quand dois-je autoriser deux activités en réseau ?

La méthode NetworkIdle2 convient aux applications web ou aux pages web avec des requêtes réseau de longue durée ou des pings de battements de cœur. Il s'agit généralement d'une à deux demandes. Même si ces demandes sont permanentes, elles n'invalideront pas le déclenchement de l'événement d'inactivité du réseau, car deux au maximum sont acceptables.

Avant d'amorcer le processus de rendu, il devrait y avoir au plus deux activités réseau restantes pour au moins 500ms. Cette option permet une configuration rapide pour gérer un nombre fixe d'activités réseau.

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

Comment personnaliser les seuils d'activité du réseau ?

Lorsque plusieurs requêtes réseau sont impliquées, vous pouvez personnaliser à la fois la durée d'inactivité du réseau et le nombre de requêtes réseau autorisées qui n'invalident pas l'événement d'inactivité du réseau. Cette option convient aux applications web ou aux pages web dont les exigences spécifiques ne correspondent pas aux deux méthodes précédentes. Cette personnalisation répond à un large éventail de cas d'utilisation dans différentes circonstances.

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

Ce niveau de personnalisation est précieux lorsque l'on travaille avec des applications web complexes qui maintiennent des connexions persistantes ou qui ont des modèles d'activité réseau prévisibles en arrière-plan.

Comment définir un temps d'attente maximum?

Les méthodes JavaScript, NetworkIdle, NetworkIdle0 et NetworkIdle2 vous permettent de définir un temps d'attente maximal afin de garantir que l'attente ne sera pas indéfinie. Le paramètre maxWaitTime de ces méthodes sert à cette fin. Cela permet d'éviter que votre application ne reste indéfiniment en suspens si les conditions prévues ne se produisent jamais.

Toutes les valeurs temporelles spécifiées sont exprimées en millisecondes.

Lors de la mise en œuvre de ces stratégies d'attente, il convient de trouver un équilibre entre le chargement complet du contenu et le maintien de performances raisonnables. Pour les applications nécessitant un contrôle précis du timing, explorez les techniques de génération de PDF asynchrones.

Prêt à voir ce que vous pouvez faire d'autre? Consultez la page du tutoriel ici : Fonctionnalités supplémentaires ou explorez la création de PDF avec IronPDF pour des techniques plus avancées.

Questions Fréquemment Posées

Qu'est-ce que la classe WaitFor et pourquoi devrais-je l'utiliser ?

La classe WaitFor d'IronPDF permet aux développeurs de retarder le rendu du PDF jusqu'à ce que tous les actifs, polices et JavaScript aient fini de se charger. Cela permet d'éviter les rendus incomplets et de s'assurer que les pages web complexes sont entièrement chargées avant d'être converties en PDF, ce qui permet d'obtenir des documents PDF plus précis et plus complets.

Quelles sont les différentes options de WaitFor disponibles ?

La classe WaitFor d'IronPDF offre plusieurs options : PageLoad (rendu immédiat par défaut), RenderDelay (délai personnalisé en millisecondes), Fonts (attend le chargement de toutes les polices), JavaScript (déclenche le rendu via une fonction JavaScript), HTML elements (attend des éléments spécifiques par ID, nom, balise ou sélecteur de requête), et NetworkIdle (attend la fin de l'activité du réseau).

Comment ajouter un délai personnalisé avant le rendu du PDF ?

Vous pouvez ajouter un délai personnalisé à l'aide de la méthode RenderDelay d'IronPDF. Il suffit de spécifier le délai en millisecondes : `new ChromePdfRenderer { RenderingOptions = { WaitFor = WaitFor.RenderDelay(3000) } }`. Ceci est particulièrement utile pour les contenus à forte teneur en JavaScript qui ont besoin de plus de temps pour s'exécuter.

Puis-je attendre le chargement d'éléments HTML spécifiques avant d'effectuer le rendu ?

Oui, IronPDF vous permet d'attendre des éléments HTML spécifiques en utilisant des ID d'éléments, des noms, des noms de balises ou des sélecteurs de requêtes. Cela permet de s'assurer que le contenu essentiel est présent sur la page avant que la conversion PDF ne commence, évitant ainsi les éléments manquants dans votre document PDF final.

Qu'est-ce que NetworkIdle et quand dois-je l'utiliser ?

NetworkIdle dans IronPDF attend que l'activité du réseau cesse avant de rendre le PDF. Vous pouvez le configurer pour qu'il attende 0, 2 ou un nombre personnalisé de connexions réseau. Cette fonction est idéale pour les pages qui chargent le contenu de manière dynamique par le biais d'appels AJAX ou d'autres requêtes réseau asynchrones.

Comment puis-je déclencher le rendu d'un PDF à partir de JavaScript ?

L'option JavaScript WaitFor d'IronPDF vous permet de déclencher le processus de rendu à partir d'une fonction JavaScript. Vous avez ainsi un contrôle total sur le moment où le PDF est généré, ce qui est parfait pour les applications à page unique ou les sites web complexes pilotés par JavaScript, pour lesquels vous avez besoin d'un contrôle précis de la synchronisation.

Curtis Chau
Rédacteur technique

Curtis Chau détient un baccalauréat en informatique (Université de Carleton) et se spécialise dans le développement front-end avec expertise en Node.js, TypeScript, JavaScript et React. Passionné par la création d'interfaces utilisateur intuitives et esthétiquement plaisantes, Curtis aime travailler avec des frameworks modernes ...

Lire la suite
Prêt à commencer?
Nuget Téléchargements 17,012,929 | Version : 2025.12 vient de sortir