Comment utiliser la classe WaitFor pour retarder le rendu des PDF en C
Lors du rendu de documents PDF, un problème courant se pose lorsque le processus de rendu se produit avant que toutes les ressources et animations JavaScript nécessaires n'aient fini de se charger. Cela peut entraîner un rendu incomplet ou incorrect du document PDF. Dans un premier temps, nous avons abordé ce problème en permettant à l'utilisateur de fixer un délai arbitraire comme solution. Cependant, se fier à un délai arbitraire n'est pas une approche fiable ou efficace.
Pour fournir une solution plus robuste, nous avons mis en place une classe WaitFor qui améliore le processus de rendu des PDF. L'objet WaitFor de RenderOptions offre plusieurs options, notamment :
Chargement de la page
: Rendu par défaut sans attente.Délai de rendu
: Fixer un temps d'attente arbitraire.Polices de caractères
: Attend que toutes les polices soient chargées.JavaScript
: Déclencher le rendu avec une fonction JavaScript.Éléments HTML
: 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.Mise en veille du réseau
: Attente de l'inactivité du réseau (0, 2 ou un montant personnalisé).Ces fonctionnalités sont disponibles pour la conversionChaînes HTML vers PDF avec IronPDF, Conversion de fichiers HTML en fichiers PDF avec IronPDFetuRL web en PDF avec IronPDF. Examinons les principaux aspects de cette nouvelle fonctionnalité.
Comment utiliser WaitFor pour retarder le rendu d'un PDF en C#
- Télécharger la bibliothèque C# IronPDF pour retarder le rendu des PDF
- Générer un document PDF à partir d'une chaîne HTML, d'un fichier ou d'une URL web
- Utiliser la méthode JavaScript WaitFor pour déclencher le rendu à partir d'une fonction JavaScript
- Retarder le rendu en fonction du nombre d'activités sur le réseau
- Attendre des éléments HTML spécifiques ainsi que pour toutes les polices à charger
Commencez avec IronPDF
Commencez à utiliser IronPDF dans votre projet dès aujourd'hui avec un essai gratuit.
Exemple de rendu immédiat par défaut
Par défaut, le processus de 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 si vous souhaitez effectuer un rendu normal.
: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
Exemple de délai de rendu personnalisé
Dans les cas où un délai spécifique est nécessaire avant le rendu du PDF, vous pouvez définir un nombre arbitraire de millisecondes comme délai. Cela permet de répondre avec souplesse à toutes les exigences spécifiques en matière de délais.
Cette option fonctionne de la même manière que l'ancienne implémentation en utilisant la propriété RenderingOptions.RenderDelay. Cependant, l'ancienne propriété est obsolète et il est fortement recommandé d'utiliser 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>");
Imports IronPdf
Private renderer As New ChromePdfRenderer()
' Render after 3000ms
renderer.RenderingOptions.WaitFor.RenderDelay(3000)
Dim pdf As PdfDocument = renderer.RenderHtmlAsPdf("<h1>testing</h1>")
Toutes les polices chargées Exemple
Les AllFontsLoaded
dans la méthode Attendre permet d'interrompre le processus de rendu du PDF jusqu'à ce que toutes les polices soient chargées à partir de sources externes telles que Google Fonts ou d'autres serveurs. Cela permet de s'assurer que le PDF final comprend toutes les polices requises, préservant ainsi la typographie et l'aspect visuel du document.
: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
Exemple d'exécution personnalisée de JavaScript
Pour mieux contrôler le processus de rendu, notre fonctionnalité vous permet de spécifier une fonction JavaScript personnalisée qui doit être exécutée avant le rendu du document PDF. Cela vous permet d'effectuer toutes les tâches ou vérifications nécessaires avant de lancer le processus d'équarrissage. Cela permet à l'utilisateur de contrôler le moment où le rendu est déclenché.
En JavaScript, la fonction window.IronPDF.notifyRender()
est utilisé pour déclencher la tâche de rendu. Une fois que `notifyRender()est invoqué, le processus de rendu démarre. Vous avez un contrôle total sur le moment où vous invoquez 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);
IRON VB CONVERTER ERROR developers@ironsoftware.com
Exemple d'éléments HTML
Cette option permet de configurer le processus de rendu pour qu'il attende des éléments HTML spécifiques, tels que les ID d'éléments, les noms, les noms de balises, et même d'utiliser des sélecteurs de requête pour cibler les éléments.
Attendre l'ID de l'élément
Dans l'exemple de code ci-dessous, le rendu attendra 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);
IRON VB CONVERTER ERROR developers@ironsoftware.com
Attendre le nom de l'élément
Dans l'exemple de code ci-dessous, le processus de rendu attendra un nom d'élément spécifique.
: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
Attendre le nom de l'étiquette de l'élément
Dans l'exemple de code ci-dessous, le processus de rendu attendra 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);
IRON VB CONVERTER ERROR developers@ironsoftware.com
Utiliser le sélecteur de requête
Dans l'exemple de code ci-dessous, le processus de rendu attendra l'élément sélectionné par le sélecteur de requête. La méthode HtmlQuerySelector
attendra une balise img avec un id de 'myid' et une class 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);
IRON VB CONVERTER ERROR developers@ironsoftware.com
Exemple d'inactivité du réseau
Pas d'activité réseau
Ce type d'inactivité réseau vous permet d'attendre qu'il n'y ait pas d'activité réseau, ce qui indique généralement que le contenu a été entièrement chargé. Ceci est adapté à une application à page unique(SPA) ou une simple page web qui n'a pas de requêtes réseau de longue durée ou d'activité réseau continue.
Le processus de rendu ne commencera que lorsqu'il n'y aura 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>");
IRON VB CONVERTER ERROR developers@ironsoftware.com
Deux activités de réseau autorisées
La méthode NetworkIdle2
est adaptée aux applications web ou aux pages web qui ont des requêtes réseau de longue durée ou des pings de battements de cœur. En général, il y a 1 à 2 demandes. Dans ce cas, même si ces demandes sont en cours, elles ne seront pas considérées comme invalidant le déclenchement de l'événement d'inactivité du réseau, car il est acceptable qu'il y en ait au maximum deux.
Avant de lancer le processus de rendu, il doit y avoir au plus deux activités réseau restantes pendant au moins 500 ms. Cette option permet une configuration rapide pour gérer un nombre fixe d'activités de 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>");
IRON VB CONVERTER ERROR developers@ironsoftware.com
Personnaliser l'allocation d'activité réseau
Dans les cas où plusieurs demandes de réseau sont impliquées, vous avez la possibilité de personnaliser à la fois la durée d'inactivité du réseau et le nombre de demandes de réseau autorisées qui n'invalident pas le déclenchement de l'événement d'inactivité du réseau. Cette option convient aux applications web ou aux pages web ayant des exigences spécifiques qui ne correspondent pas aux deux méthodes précédentes. En offrant cette personnalisation, nous nous assurons de répondre à 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>");
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>")
Définir le temps d'attente maximum
De plus, les méthodes JavaScript
, NetworkIdle
, NetworkIdle0
, et NetworkIdle2
vous permettent également de fixer un temps d'attente maximum pour s'assurer que l'attente ne sera pas indéfinie. Le paramètre maxWaitTime de ces méthodes peut être utilisé à cette fin.