Passer au contenu du pied de page
UTILISATION DE IRONPDF

Génération dynamique de PDF en C# : Guide d'implémentation complet

IronPDF permet la création dynamique de PDF en C# en convertissant le contenu HTML en PDF lors de l'exécution grâce au rendu basé sur Chrome. Cela permet la création de documents personnalisés avec des données variables provenant de bases de données, d'API ou de saisies utilisateur pour les factures, les rapports et les formulaires dans les applications .NET.

Les applications web modernes nécessitent plus que la simple création de documents statiques. Qu'il s'agisse de générer des factures personnalisées, de créer des rapports PDF basés sur des données ou de produire des champs de formulaire personnalisés , des outils fiables sont indispensables pour la génération dynamique de documents PDF. IronPDF est une solution de pointe offrant un rendu efficace sous Chrome pour la création de documents PDF, avec une intégration C# fluide pour la génération dynamique de PDF dans les environnements .NET Framework .

La bannière promotionnelle de la bibliothèque IronPDF C# PDF présente ses principales fonctionnalités : conversion HTML vers PDF, API d'édition PDF, options de déploiement cloud et offre d'essai gratuit.

Qu'est-ce que la génération dynamique de PDF en C# ?

La génération dynamique de PDF en C# consiste à créer des documents PDF à l'exécution en utilisant des données variables provenant de bases de données, d'API ou de saisies utilisateur. Contrairement aux fichiers PDF statiques, la génération dynamique permet un contenu personnalisé, des sections conditionnelles et des mises en page basées sur les données. Ces fonctionnalités sont essentielles pour les factures, les rapports PDF , les certificats et les formulaires qui s'adaptent à l'évolution des besoins. Cette approche est devenue cruciale pour les applications modernes .NET Framework et .NET Core . La documentation d'IronPDF fournit des guides complets pour implémenter ces fonctionnalités dans vos applications C# .

Tableau de compatibilité multiplateforme d'IronPDF indiquant la prise en charge de plusieurs versions de .NET, langages de programmation, systèmes d'exploitation et environnements de déploiement, y compris les plateformes cloud.

Quand faut-il utiliser la génération dynamique de PDF ?

La génération dynamique de PDF est essentielle lorsque votre application nécessite des documents personnalisés qui changent en fonction des données utilisateur ou de la logique métier. Les scénarios courants incluent la génération de rapports mensuels avec mises à jour automatiques des données, la création de factures avec des informations spécifiques au client, la production de certificats avec des noms de destinataires uniques et la création de formulaires préremplis en fonction des profils des utilisateurs. Si votre contenu varie à chaque requête ou nécessite une intégration de données en temps réel, la génération dynamique est plus efficace que les modèles statiques. Pour les scénarios à volume élevé, envisagez le traitement asynchrone d'IronPDF et explorez les techniques d'optimisation des performances pour les applications d'entreprise.

Qu'est-ce qui différencie les PDF dynamiques des PDF statiques ?

Les fichiers PDF statiques restent inchangés après leur création, à l'instar des documents papier traditionnels enregistrés numériquement. Les PDF dynamiques génèrent un contenu actualisé à chaque requête, en puisant dans des sources de données en temps réel. Par exemple, un catalogue de produits statique nécessite des mises à jour et une redistribution manuelles, tandis qu'un catalogue dynamique inclut automatiquement les prix, les niveaux de stock et les descriptions de produits les plus récents. Les PDF dynamiques peuvent également inclure des éléments interactifs , du contenu conditionnel et des mises en page personnalisées en fonction des préférences ou des autorisations de l'utilisateur. Découvrez-en davantage sur la gestion des métadonnées PDF et les fonctionnalités de sécurité pour améliorer vos documents dynamiques.

Quels secteurs tirent le plus grand profit de la génération de PDF dynamiques ?

Les services financiers utilisent des PDF dynamiques pour les relevés de compte, les documents de prêt et les rapports réglementaires qui exigent une précision en temps réel. Les prestataires de soins de santé génèrent des dossiers de patients, des résultats de laboratoire et des formulaires d'assurance avec une sécurité conforme à la loi HIPAA . Les plateformes de commerce électronique créent des confirmations de commande, des étiquettes d'expédition et des autorisations de retour. Les établissements d'enseignement produisent des relevés de notes , des certificats et du matériel pédagogique personnalisé. Les organismes gouvernementaux simplifient les demandes de permis, les formulaires fiscaux et les documents de conformité grâce à la génération automatisée. Les démonstrations d'IronPDF illustrent des applications concrètes dans ces secteurs d'activité.

Comment commencer avec IronPDF ?

Commencez par installer le package NuGet IronPDF via la console du gestionnaire de packages dans Visual Studio :

Install-Package IronPdf
Install-Package IronPdf
SHELL

! Fenêtre de la console du gestionnaire de packages affichant le processus d'installation du package NuGet IronPDF, indiquant les téléchargements des dépendances et la taille de leurs fichiers

Vous pouvez également utiliser l'interface du gestionnaire de packages NuGet pour télécharger et installer. Initialisez le ChromePdfRenderer pour une génération de PDF au pixel près :

using IronPdf;
// Create Chrome renderer instance
var renderer = new ChromePdfRenderer();
// Configure rendering options for PDF format
renderer.RenderingOptions.MarginTop = 50;
renderer.RenderingOptions.MarginBottom = 50;
renderer.RenderingOptions.PrintHtmlBackgrounds = true;
using IronPdf;
// Create Chrome renderer instance
var renderer = new ChromePdfRenderer();
// Configure rendering options for PDF format
renderer.RenderingOptions.MarginTop = 50;
renderer.RenderingOptions.MarginBottom = 50;
renderer.RenderingOptions.PrintHtmlBackgrounds = true;
Imports IronPdf

' Create Chrome renderer instance
Dim renderer As New ChromePdfRenderer()

' Configure rendering options for PDF format
renderer.RenderingOptions.MarginTop = 50
renderer.RenderingOptions.MarginBottom = 50
renderer.RenderingOptions.PrintHtmlBackgrounds = True
$vbLabelText   $csharpLabel

La classe ChromePdfRenderer permet de générer des PDF à l'exécution. La définition des marges garantit l'espace nécessaire pour les en-têtes et les pieds de page , tandis que PrintHtmlBackgrounds préserve les éléments de mise en page. Cette configuration aide à créer des documents PDF basés sur le contenu HTML exactement. Découvrez plus d' options de rendu pour personnaliser vos documents PDF, notamment les formats de papier personnalisés et l'orientation des pages .

Quelles sont les exigences système pour IronPDF ?

IronPDF prend en charge les environnements Windows , Linux et macOS avec .NET Framework 4.6.2+ ou .NET Core 3.1+ . Pour un déploiement sous Windows , assurez-vous que Visual C++ Runtime est installé. Les systèmes Linux nécessitent libgdiplus et des dépendances supplémentaires. Les conteneurs Docker nécessitent des images de base spécifiques avec des bibliothèques graphiques. Les plateformes cloud comme Azure nécessitent un niveau B1 ou supérieur, tandis que les fonctions AWS Lambda requièrent des environnements d'exécution personnalisés. Consultez le guide d'installation pour connaître les exigences spécifiques à la plateforme et obtenir des conseils de dépannage . Envisagez d'utiliser IronPdf.Slim pour les environnements où la taille des paquets est limitée.

Comment configurer ChromePdfRenderer pour obtenir les meilleurs résultats ?

Améliorez votre moteur de rendu grâce à ces paramètres essentiels :

var renderer = new ChromePdfRenderer();

// Set paper size and orientation
renderer.RenderingOptions.PaperSize = PdfPaperSize.Letter;
renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Portrait;

// Configure margins (in millimeters)
renderer.RenderingOptions.MarginTop = 25;
renderer.RenderingOptions.MarginBottom = 25;
renderer.RenderingOptions.MarginLeft = 20;
renderer.RenderingOptions.MarginRight = 20;

// Enable JavaScript execution
renderer.RenderingOptions.EnableJavaScript = true;
renderer.RenderingOptions.RenderDelay = 500; // milliseconds

// Set custom CSS media type
renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print;

// Configure image quality
renderer.RenderingOptions.ImageQuality = 90;
var renderer = new ChromePdfRenderer();

// Set paper size and orientation
renderer.RenderingOptions.PaperSize = PdfPaperSize.Letter;
renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Portrait;

// Configure margins (in millimeters)
renderer.RenderingOptions.MarginTop = 25;
renderer.RenderingOptions.MarginBottom = 25;
renderer.RenderingOptions.MarginLeft = 20;
renderer.RenderingOptions.MarginRight = 20;

// Enable JavaScript execution
renderer.RenderingOptions.EnableJavaScript = true;
renderer.RenderingOptions.RenderDelay = 500; // milliseconds

// Set custom CSS media type
renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print;

// Configure image quality
renderer.RenderingOptions.ImageQuality = 90;
Dim renderer = New ChromePdfRenderer()

' Set paper size and orientation
renderer.RenderingOptions.PaperSize = PdfPaperSize.Letter
renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Portrait

' Configure margins (in millimeters)
renderer.RenderingOptions.MarginTop = 25
renderer.RenderingOptions.MarginBottom = 25
renderer.RenderingOptions.MarginLeft = 20
renderer.RenderingOptions.MarginRight = 20

' Enable JavaScript execution
renderer.RenderingOptions.EnableJavaScript = True
renderer.RenderingOptions.RenderDelay = 500 ' milliseconds

' Set custom CSS media type
renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print

' Configure image quality
renderer.RenderingOptions.ImageQuality = 90
$vbLabelText   $csharpLabel

La propriété RenderDelay permet à JavaScript de terminer son exécution avant le rendu. La sélection du type de média CSS garantit l'application des styles d'amélioration d'impression. Les paramètres de qualité d'image permettent d'équilibrer la taille du fichier et la fidélité visuelle. Explorez les options de rendu avancées pour répondre à des exigences spécifiques telles que les formats de papier personnalisés ou les paramètres de la fenêtre d'affichage . Découvrez le rendu JavaScript pour le contenu dynamique et la gestion des polices pour un contrôle typographique optimal.

Quels sont les problèmes d'installation courants à surveiller ?

La plupart des problèmes d'installation sont dus à des dépendances manquantes. Sous Windows, installez les redistribuables Visual C++ . Les utilisateurs Linux doivent installer libgdiplus et les paquets de polices . Les déploiements Docker nécessitent des images de base spécifiques avec prise en charge graphique. Les plans de consommation doivent être désactivés pour Azure Functions . Vérifiez les paramètres du pare-feu pour la validation de la licence. Examinez les scénarios de dépannage courants et activez la journalisation pour obtenir des diagnostics détaillés. Prenez en compte les bonnes pratiques de sécurité d'IronPDF pour les déploiements en production.

Comment créer dynamiquement des documents PDF à partir de modèles ?

Créez des modèles HTML réutilisables avec des espaces réservés pour l'injection de données dynamiques :

// Define HTML string template with placeholders
string invoiceTemplate = @"
<html>
<head>
    <style>
        body { font-family: Arial, sans-serif; margin: 40px; }
        .header { background-color: #f0f0f0; padding: 20px; }
        table { width: 100%; border-collapse: collapse; }
        th, td { padding: 10px; text-align: left; border-bottom: 1px solid #ddd; }
    </style>
</head>
<body>
    <div class='header'>
        <h1>Invoice #[[INVOICE_NUMBER]]</h1>
        <p>Date: [[DATE]]</p>
        <p>Customer: [[CUSTOMER_NAME]]</p>
    </div>
    <table>
        <tr><th>Item</th><th>Quantity</th><th>Price</th></tr>
        [[ITEMS]]
    </table>
    <p><strong>Total: $[[TOTAL]]</strong></p>
</body>
</html>";

// Replace placeholders with dynamic data
var invoiceData = new {
    InvoiceNumber = "INV-2025-001",
    Date = DateTime.Now.ToString("yyyy-MM-dd"),
    CustomerName = "John Doe",
    Total = 1250.00m
};

// Build items dynamically
var itemsHtml = new StringBuilder();
itemsHtml.Append("<tr><td>Web Development</td><td>40 hours</td><td>$1000.00</td></tr>");
itemsHtml.Append("<tr><td>Design Services</td><td>10 hours</td><td>$250.00</td></tr>");

string finalHtml = invoiceTemplate
    .Replace("[[INVOICE_NUMBER]]", invoiceData.InvoiceNumber)
    .Replace("[[DATE]]", invoiceData.Date)
    .Replace("[[CUSTOMER_NAME]]", invoiceData.CustomerName)
    .Replace("[[ITEMS]]", itemsHtml.ToString())
    .Replace("[[TOTAL]]", invoiceData.Total.ToString());

// Generate PDF from populated HTML content
var PDF = renderer.RenderHtmlAsPdf(finalHtml);
PDF.SaveAs("invoice.pdf");
// Define HTML string template with placeholders
string invoiceTemplate = @"
<html>
<head>
    <style>
        body { font-family: Arial, sans-serif; margin: 40px; }
        .header { background-color: #f0f0f0; padding: 20px; }
        table { width: 100%; border-collapse: collapse; }
        th, td { padding: 10px; text-align: left; border-bottom: 1px solid #ddd; }
    </style>
</head>
<body>
    <div class='header'>
        <h1>Invoice #[[INVOICE_NUMBER]]</h1>
        <p>Date: [[DATE]]</p>
        <p>Customer: [[CUSTOMER_NAME]]</p>
    </div>
    <table>
        <tr><th>Item</th><th>Quantity</th><th>Price</th></tr>
        [[ITEMS]]
    </table>
    <p><strong>Total: $[[TOTAL]]</strong></p>
</body>
</html>";

// Replace placeholders with dynamic data
var invoiceData = new {
    InvoiceNumber = "INV-2025-001",
    Date = DateTime.Now.ToString("yyyy-MM-dd"),
    CustomerName = "John Doe",
    Total = 1250.00m
};

// Build items dynamically
var itemsHtml = new StringBuilder();
itemsHtml.Append("<tr><td>Web Development</td><td>40 hours</td><td>$1000.00</td></tr>");
itemsHtml.Append("<tr><td>Design Services</td><td>10 hours</td><td>$250.00</td></tr>");

string finalHtml = invoiceTemplate
    .Replace("[[INVOICE_NUMBER]]", invoiceData.InvoiceNumber)
    .Replace("[[DATE]]", invoiceData.Date)
    .Replace("[[CUSTOMER_NAME]]", invoiceData.CustomerName)
    .Replace("[[ITEMS]]", itemsHtml.ToString())
    .Replace("[[TOTAL]]", invoiceData.Total.ToString());

// Generate PDF from populated HTML content
var PDF = renderer.RenderHtmlAsPdf(finalHtml);
PDF.SaveAs("invoice.pdf");
' Define HTML string template with placeholders
Dim invoiceTemplate As String = "
<html>
<head>
    <style>
        body { font-family: Arial, sans-serif; margin: 40px; }
        .header { background-color: #f0f0f0; padding: 20px; }
        table { width: 100%; border-collapse: collapse; }
        th, td { padding: 10px; text-align: left; border-bottom: 1px solid #ddd; }
    </style>
</head>
<body>
    <div class='header'>
        <h1>Invoice #[[INVOICE_NUMBER]]</h1>
        <p>Date: [[DATE]]</p>
        <p>Customer: [[CUSTOMER_NAME]]</p>
    </div>
    <table>
        <tr><th>Item</th><th>Quantity</th><th>Price</th></tr>
        [[ITEMS]]
    </table>
    <p><strong>Total: $[[TOTAL]]</strong></p>
</body>
</html>"

' Replace placeholders with dynamic data
Dim invoiceData = New With {
    .InvoiceNumber = "INV-2025-001",
    .Date = DateTime.Now.ToString("yyyy-MM-dd"),
    .CustomerName = "John Doe",
    .Total = 1250.0D
}

' Build items dynamically
Dim itemsHtml = New StringBuilder()
itemsHtml.Append("<tr><td>Web Development</td><td>40 hours</td><td>$1000.00</td></tr>")
itemsHtml.Append("<tr><td>Design Services</td><td>10 hours</td><td>$250.00</td></tr>")

Dim finalHtml As String = invoiceTemplate _
    .Replace("[[INVOICE_NUMBER]]", invoiceData.InvoiceNumber) _
    .Replace("[[DATE]]", invoiceData.Date) _
    .Replace("[[CUSTOMER_NAME]]", invoiceData.CustomerName) _
    .Replace("[[ITEMS]]", itemsHtml.ToString()) _
    .Replace("[[TOTAL]]", invoiceData.Total.ToString())

' Generate PDF from populated HTML content
Dim PDF = renderer.RenderHtmlAsPdf(finalHtml)
PDF.SaveAs("invoice.pdf")
$vbLabelText   $csharpLabel

Cette approche de modèle sépare la présentation des données, permettant aux designers de modifier des mises en page complexes tandis que les développeurs se concentrent sur l'intégration des données. La méthode Replace remplace les espaces réservés par des valeurs dynamiques, créant ainsi des documents PDF personnalisés. Pour convertir du contenu HTML avec des sections répétitives, construisez le HTML dynamiquement en utilisant des boucles avant la conversion en PDF. Explorez davantage d'exemples de conversion HTML vers PDF pour découvrir des techniques de modélisation avancées, notamment le style CSS et l'intégration JavaScript . Envisagez la conversion des fichiers HTML en PDF pour la gestion des modèles externes.

Sortie

! Visionneuse PDF affichant une facture générée portant le numéro INV-2025-001, indiquant les détails du client et un montant total de 1 250,00 $, avec les filigranes Iron Software visibles.

Pourquoi utiliser la génération de PDF à partir de modèles ?

La génération basée sur des modèles sépare la logique métier de la présentation, permettant ainsi des flux de travail de développement parallèles. Les concepteurs peuvent perfectionner les mises en page HTML à l'aide d'outils familiers tandis que les développeurs mettent en œuvre la liaison de données. Les modèles prennent en charge le contrôle de version , les tests A/B et la localisation sans modification du code. Les composants réutilisables permettent de réduire les coûts de duplication et de maintenance. Les requêtes média CSS garantissent que les designs responsifs se traduisent parfaitement en sortie PDF. Cette approche s'adapte aussi bien aux simples lettres qu'aux rapports complexes de plusieurs pages, tout en conservant une image de marque cohérente. Apprenez-en davantage sur les éléments d'arrière-plan et de premier plan pour améliorer la conception visuelle et explorez les techniques de filigrane pour répondre aux exigences en matière de marque.

Comment gérer des structures de données complexes dans les modèles ?

Traiter les données hiérarchiques en construisant des sections HTML par programmation avant l'injection du modèle. Utilisez les requêtes LINQ pour transformer les collections en tableaux ou listes HTML. Implémentez le rendu conditionnel avec des instructions if qui incluent ou excluent des sections de modèle. Pour les données imbriquées, créez des sous-modèles qui construisent le contenu de manière récursive. Envisagez d'utiliser la syntaxe Razor pour la logique complexe au sein des modèles. La sérialisation JSON permet de transmettre des données structurées aux modèles JavaScript-improve . Créez des méthodes d'assistance qui convertissent les objets de domaine en fragments HTML pour une organisation du code plus propre. Explorez la génération de tables des matières pour l'organisation de documents complexes.

Quelles sont les meilleures pratiques pour la conception d'espaces réservés aux modèles ?

Choisissez une syntaxe d'espace réservé distinctive qui ne soit pas en conflit avec HTML ou CSS, comme [[FIELD_NAME]] ou {{field}} . Utilisez des noms descriptifs indiquant les types de données et les attentes en matière de formatage. Regroupez les espaces réservés liés avec des préfixes ( CUSTOMER_NAME , CUSTOMER_EMAIL ). Documentez les espaces réservés disponibles et leurs sources de données à titre de référence pour l'équipe. Mettez en place des valeurs de repli pour les champs optionnels afin d'éviter les erreurs d'affichage. Envisagez d'utiliser l'encodage HTML pour le contenu généré par les utilisateurs afin de prévenir les attaques par injection. Créez des méthodes de validation de modèles qui vérifient que tous les espaces réservés possèdent des valeurs de données correspondantes. Vérifiez la configuration de l'URL de base pour un chargement correct des ressources dans les modèles.## Comment pouvez-vous faire évoluer la génération de PDF avec le traitement asynchrone ?

Augmentez la capacité de génération de PDF grâce aux méthodes asynchrones pour le traitement de volumes importants :

// Async batch generation for multiple PDF documents
public async Task GenerateMonthlyReportsAsync(List<Customer> customers)
{
    var renderer = new ChromePdfRenderer();

    // Configure for batch processing
    renderer.RenderingOptions.EnableJavaScript = false; // Faster without JS
    renderer.RenderingOptions.RenderDelay = 0; // No delay needed

    var semaphore = new SemaphoreSlim(5); // Limit concurrent operations
    var tasks = new List<Task>();

    foreach (var customer in customers)
    {
        tasks.Add(Task.Run(async () =>
        {
            await semaphore.WaitAsync();
            try
            {
                // Create HTML content with dynamic data
                string HTML = $@"
                    <html>
                    <head>
                        <style>
                            body {{ font-family: Arial; margin: 40px; }}
                            .header {{ color: #333; border-bottom: 2px solid #4CAF50; }}
                            .metrics {{ margin: 20px 0; }}
                            .metric-box {{ 
                                display: inline-block; 
                                padding: 20px; 
                                margin: 10px;
                                background: #f5f5f5;
                                border-radius: 5px;
                            }}
                        </style>
                    </head>
                    <body>
                        <div class='header'>
                            <h2>Monthly Report - {customer.Name}</h2>
                            <p>Report Period: {DateTime.Now:MMMM yyyy}</p>
                        </div>
                        <div class='metrics'>
                            <div class='metric-box'>
                                <h3>Account Balance</h3>
                                <p style='font-size: 24px; color: #4CAF50;'>${customer.Balance:F2}</p>
                            </div>
                            <div class='metric-box'>
                                <h3>Total Transactions</h3>
                                <p style='font-size: 24px; color: #2196F3;'>{customer.TransactionCount}</p>
                            </div>
                        </div>
                        <div style='page-break-after: always;'></div>
                    </body>
                    </html>";

                // Convert HTML to PDF format
                var document = await renderer.RenderHtmlAsPdfAsync(HTML);

                // Add metadata
                document.MetaData.Author = "Reporting System";
                document.MetaData.Title = $"Monthly Report - {customer.Name}";
                document.MetaData.CreationDate = DateTime.Now;

                await document.SaveAs($"reports/{customer.Id}_report_{DateTime.Now:yyyyMM}.pdf");
            }
            finally
            {
                semaphore.Release();
            }
        }));
    }

    await Task.WhenAll(tasks);
}
// Async batch generation for multiple PDF documents
public async Task GenerateMonthlyReportsAsync(List<Customer> customers)
{
    var renderer = new ChromePdfRenderer();

    // Configure for batch processing
    renderer.RenderingOptions.EnableJavaScript = false; // Faster without JS
    renderer.RenderingOptions.RenderDelay = 0; // No delay needed

    var semaphore = new SemaphoreSlim(5); // Limit concurrent operations
    var tasks = new List<Task>();

    foreach (var customer in customers)
    {
        tasks.Add(Task.Run(async () =>
        {
            await semaphore.WaitAsync();
            try
            {
                // Create HTML content with dynamic data
                string HTML = $@"
                    <html>
                    <head>
                        <style>
                            body {{ font-family: Arial; margin: 40px; }}
                            .header {{ color: #333; border-bottom: 2px solid #4CAF50; }}
                            .metrics {{ margin: 20px 0; }}
                            .metric-box {{ 
                                display: inline-block; 
                                padding: 20px; 
                                margin: 10px;
                                background: #f5f5f5;
                                border-radius: 5px;
                            }}
                        </style>
                    </head>
                    <body>
                        <div class='header'>
                            <h2>Monthly Report - {customer.Name}</h2>
                            <p>Report Period: {DateTime.Now:MMMM yyyy}</p>
                        </div>
                        <div class='metrics'>
                            <div class='metric-box'>
                                <h3>Account Balance</h3>
                                <p style='font-size: 24px; color: #4CAF50;'>${customer.Balance:F2}</p>
                            </div>
                            <div class='metric-box'>
                                <h3>Total Transactions</h3>
                                <p style='font-size: 24px; color: #2196F3;'>{customer.TransactionCount}</p>
                            </div>
                        </div>
                        <div style='page-break-after: always;'></div>
                    </body>
                    </html>";

                // Convert HTML to PDF format
                var document = await renderer.RenderHtmlAsPdfAsync(HTML);

                // Add metadata
                document.MetaData.Author = "Reporting System";
                document.MetaData.Title = $"Monthly Report - {customer.Name}";
                document.MetaData.CreationDate = DateTime.Now;

                await document.SaveAs($"reports/{customer.Id}_report_{DateTime.Now:yyyyMM}.pdf");
            }
            finally
            {
                semaphore.Release();
            }
        }));
    }

    await Task.WhenAll(tasks);
}
Imports System
Imports System.Collections.Generic
Imports System.Threading
Imports System.Threading.Tasks

' Async batch generation for multiple PDF documents
Public Class ReportGenerator
    Public Async Function GenerateMonthlyReportsAsync(customers As List(Of Customer)) As Task
        Dim renderer = New ChromePdfRenderer()

        ' Configure for batch processing
        renderer.RenderingOptions.EnableJavaScript = False ' Faster without JS
        renderer.RenderingOptions.RenderDelay = 0 ' No delay needed

        Dim semaphore = New SemaphoreSlim(5) ' Limit concurrent operations
        Dim tasks = New List(Of Task)()

        For Each customer In customers
            tasks.Add(Task.Run(Async Function()
                                   Await semaphore.WaitAsync()
                                   Try
                                       ' Create HTML content with dynamic data
                                       Dim HTML As String = $"
                    <html>
                    <head>
                        <style>
                            body {{ font-family: Arial; margin: 40px; }}
                            .header {{ color: #333; border-bottom: 2px solid #4CAF50; }}
                            .metrics {{ margin: 20px 0; }}
                            .metric-box {{ 
                                display: inline-block; 
                                padding: 20px; 
                                margin: 10px;
                                background: #f5f5f5;
                                border-radius: 5px;
                            }}
                        </style>
                    </head>
                    <body>
                        <div class='header'>
                            <h2>Monthly Report - {customer.Name}</h2>
                            <p>Report Period: {DateTime.Now:MMMM yyyy}</p>
                        </div>
                        <div class='metrics'>
                            <div class='metric-box'>
                                <h3>Account Balance</h3>
                                <p style='font-size: 24px; color: #4CAF50;'>${customer.Balance:F2}</p>
                            </div>
                            <div class='metric-box'>
                                <h3>Total Transactions</h3>
                                <p style='font-size: 24px; color: #2196F3;'>{customer.TransactionCount}</p>
                            </div>
                        </div>
                        <div style='page-break-after: always;'></div>
                    </body>
                    </html>"

                                       ' Convert HTML to PDF format
                                       Dim document = Await renderer.RenderHtmlAsPdfAsync(HTML)

                                       ' Add metadata
                                       document.MetaData.Author = "Reporting System"
                                       document.MetaData.Title = $"Monthly Report - {customer.Name}"
                                       document.MetaData.CreationDate = DateTime.Now

                                       Await document.SaveAs($"reports/{customer.Id}_report_{DateTime.Now:yyyyMM}.pdf")
                                   Finally
                                       semaphore.Release()
                                   End Try
                               End Function))
        Next

        Await Task.WhenAll(tasks)
    End Function
End Class

Public Class Customer
    Public Property Name As String
    Public Property Balance As Decimal
    Public Property TransactionCount As Integer
    Public Property Id As Integer
End Class

Public Class ChromePdfRenderer
    Public Property RenderingOptions As New RenderingOptions()

    Public Async Function RenderHtmlAsPdfAsync(html As String) As Task(Of PdfDocument)
        ' Simulated async PDF rendering
        Return Await Task.FromResult(New PdfDocument())
    End Function
End Class

Public Class RenderingOptions
    Public Property EnableJavaScript As Boolean
    Public Property RenderDelay As Integer
End Class

Public Class PdfDocument
    Public Property MetaData As New PdfMetaData()

    Public Async Function SaveAs(filePath As String) As Task
        ' Simulated async save
        Await Task.CompletedTask
    End Function
End Class

Public Class PdfMetaData
    Public Property Author As String
    Public Property Title As String
    Public Property CreationDate As DateTime
End Class
$vbLabelText   $csharpLabel

Le modèle asynchrone permet la génération simultanée de PDF, améliorant considérablement le débit lors de la génération de documents PDF par lots. Tâche. WhenAll vérifie que tous les fichiers PDF sont complets avant de poursuivre. Le code utilise les propriétés de saut de page CSS pour contrôler la pagination, garantissant ainsi que le rapport de chaque client commence sur une nouvelle page. SemaphoreSlim prévient l'épuisement de la mémoire en limitant les opérations simultanées. Consultez la documentation relative à la génération asynchrone de PDF pour les applications Web d'entreprise, notamment les stratégies de traitement parallèle . Envisagez la génération multithread pour les charges de travail gourmandes en ressources CPU.

Quand faut-il utiliser la génération de PDF asynchrone ?

Le traitement asynchrone est idéal pour les applications web où les opérations bloquantes ont un impact sur l'expérience utilisateur. Utilisez des méthodes asynchrones pour générer plusieurs documents simultanément, traiter des fichiers HTML volumineux ou intégrer des API externes lentes. Les services en arrière-plan tirent parti des modèles asynchrones pour la génération de rapports planifiés . Les gestionnaires de webhook peuvent traiter les requêtes sans délai d'expiration. Les opérations par lots, comme la facturation mensuelle, sont réalisées plus rapidement grâce au traitement parallèle. Cependant, la génération simple de documents uniques pourrait ne pas bénéficier de cette complexité supplémentaire. Explorez des exemples asynchrones pour découvrir des modèles d'implémentation.

Comment gérez-vous l'utilisation de la mémoire lors du traitement par lots ?

Mettre en œuvre des procédures d'élimination des ressources afin de les libérer rapidement. Utilisez les flux de mémoire plutôt que les opérations sur les fichiers pour le stockage temporaire. Configurer le nettoyage de la mémoire pour les charges de travail du serveur. Limitez les opérations simultanées avec SemaphoreSlim ou des mécanismes de limitation similaires. Surveillez l'utilisation de la mémoire à l'aide de compteurs de performance . Envisagez de diviser les grands ensembles de données en lots plus petits. Compressez les fichiers PDF de sortie afin de réduire les besoins de stockage. Consultez les guides d'optimisation des performances pour découvrir d'autres stratégies, notamment la linéarisation pour la diffusion Web.

Quels indicateurs de performance devez-vous surveiller ?

Suivre le temps de génération des PDF par document afin d'identifier les goulots d'étranglement. Surveiller la consommation de mémoire pendant les pics de charge. Mesurer l'utilisation du processeur lors des opérations de rendu . Consignez les générations ayant échoué avec les détails des erreurs pour faciliter le dépannage. Calculer le débit en documents par minute. Surveillez les E/S disque pour détecter les contraintes de stockage. Surveillez la latence du réseau lors du rendu d'URL externes. Configurez des alertes pour les délais d'attente de rendu ou la saturation de la mémoire. Utilisez la journalisation personnalisée pour capturer des indicateurs détaillés. Mettez en place un système de surveillance des performances tout au long de votre chaîne de génération de PDF.

Comment créer des formulaires PDF interactifs de manière dynamique ?

Transformez les pages web avec formulaires HTML en PDFs remplissables de manière programmatique :

// Enable form fields creation in rendering options
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.CreatePdfFormsFromHtml = true;

// Define HTML string with form elements
string formHtml = @"
<html>
<head>
    <style>
        body { font-family: Arial, sans-serif; margin: 40px; }
        form { background: #f9f9f9; padding: 30px; border-radius: 8px; }
        h2 { color: #333; margin-bottom: 20px; }
        label { display: block; margin: 15px 0 5px; font-weight: bold; }
        input[type='text'], input[type='email'], textarea, select {
            width: 100%;
            padding: 10px;
            border: 1px solid #ddd;
            border-radius: 4px;
            box-sizing: border-box;
        }
        textarea { height: 100px; resize: vertical; }
        input[type='checkbox'] { margin-right: 8px; }
        .checkbox-group { margin: 15px 0; }
        button { 
            background: #4CAF50; 
            color: white; 
            padding: 12px 24px;
            border: none;
            border-radius: 4px;
            cursor: pointer;
            margin-top: 20px;
        }
    </style>
</head>
<body>
    <form>
        <h2>Customer Survey Form</h2>

        <label for='name'>Full Name:</label>
        <input type='text' id='name' name='name' required>

        <label for='email'>Email Address:</label>
        <input type='email' id='email' name='email' required>

        <label for='satisfaction'>Overall Satisfaction:</label>
        <select id='satisfaction' name='satisfaction'>
            <option value=''>Please select...</option>
            <option value='excellent'>Excellent</option>
            <option value='good'>Good</option>
            <option value='fair'>Fair</option>
            <option value='poor'>Poor</option>
        </select>

        <div class='checkbox-group'>
            <label>Services Used:</label>
            <label><input type='checkbox' name='services' value='support'> Technical Support</label>
            <label><input type='checkbox' name='services' value='training'> Training</label>
            <label><input type='checkbox' name='services' value='consulting'> Consulting</label>
        </div>

        <label for='comments'>Additional Comments:</label>
        <textarea id='comments' name='comments' placeholder='Share your feedback...'></textarea>

        <button type='submit'>Submit Survey</button>
    </form>
</body>
</html>";

// Create a PDF with interactive form fields
var pdfDocument = renderer.RenderHtmlAsPdf(formHtml);

// Optional: Set form field properties programmatically
var formManager = pdfDocument.Form;
formManager.FindField("name").Value = ""; // Pre-populate if needed
formManager.FindField("email").Required = true;

// Save the interactive PDF
pdfDocument.SaveAs("customer_survey_form.pdf");
// Enable form fields creation in rendering options
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.CreatePdfFormsFromHtml = true;

// Define HTML string with form elements
string formHtml = @"
<html>
<head>
    <style>
        body { font-family: Arial, sans-serif; margin: 40px; }
        form { background: #f9f9f9; padding: 30px; border-radius: 8px; }
        h2 { color: #333; margin-bottom: 20px; }
        label { display: block; margin: 15px 0 5px; font-weight: bold; }
        input[type='text'], input[type='email'], textarea, select {
            width: 100%;
            padding: 10px;
            border: 1px solid #ddd;
            border-radius: 4px;
            box-sizing: border-box;
        }
        textarea { height: 100px; resize: vertical; }
        input[type='checkbox'] { margin-right: 8px; }
        .checkbox-group { margin: 15px 0; }
        button { 
            background: #4CAF50; 
            color: white; 
            padding: 12px 24px;
            border: none;
            border-radius: 4px;
            cursor: pointer;
            margin-top: 20px;
        }
    </style>
</head>
<body>
    <form>
        <h2>Customer Survey Form</h2>

        <label for='name'>Full Name:</label>
        <input type='text' id='name' name='name' required>

        <label for='email'>Email Address:</label>
        <input type='email' id='email' name='email' required>

        <label for='satisfaction'>Overall Satisfaction:</label>
        <select id='satisfaction' name='satisfaction'>
            <option value=''>Please select...</option>
            <option value='excellent'>Excellent</option>
            <option value='good'>Good</option>
            <option value='fair'>Fair</option>
            <option value='poor'>Poor</option>
        </select>

        <div class='checkbox-group'>
            <label>Services Used:</label>
            <label><input type='checkbox' name='services' value='support'> Technical Support</label>
            <label><input type='checkbox' name='services' value='training'> Training</label>
            <label><input type='checkbox' name='services' value='consulting'> Consulting</label>
        </div>

        <label for='comments'>Additional Comments:</label>
        <textarea id='comments' name='comments' placeholder='Share your feedback...'></textarea>

        <button type='submit'>Submit Survey</button>
    </form>
</body>
</html>";

// Create a PDF with interactive form fields
var pdfDocument = renderer.RenderHtmlAsPdf(formHtml);

// Optional: Set form field properties programmatically
var formManager = pdfDocument.Form;
formManager.FindField("name").Value = ""; // Pre-populate if needed
formManager.FindField("email").Required = true;

// Save the interactive PDF
pdfDocument.SaveAs("customer_survey_form.pdf");
Imports IronPdf

' Enable form fields creation in rendering options
Dim renderer As New ChromePdfRenderer()
renderer.RenderingOptions.CreatePdfFormsFromHtml = True

' Define HTML string with form elements
Dim formHtml As String = "
<html>
<head>
    <style>
        body { font-family: Arial, sans-serif; margin: 40px; }
        form { background: #f9f9f9; padding: 30px; border-radius: 8px; }
        h2 { color: #333; margin-bottom: 20px; }
        label { display: block; margin: 15px 0 5px; font-weight: bold; }
        input[type='text'], input[type='email'], textarea, select {
            width: 100%;
            padding: 10px;
            border: 1px solid #ddd;
            border-radius: 4px;
            box-sizing: border-box;
        }
        textarea { height: 100px; resize: vertical; }
        input[type='checkbox'] { margin-right: 8px; }
        .checkbox-group { margin: 15px 0; }
        button { 
            background: #4CAF50; 
            color: white; 
            padding: 12px 24px;
            border: none;
            border-radius: 4px;
            cursor: pointer;
            margin-top: 20px;
        }
    </style>
</head>
<body>
    <form>
        <h2>Customer Survey Form</h2>

        <label for='name'>Full Name:</label>
        <input type='text' id='name' name='name' required>

        <label for='email'>Email Address:</label>
        <input type='email' id='email' name='email' required>

        <label for='satisfaction'>Overall Satisfaction:</label>
        <select id='satisfaction' name='satisfaction'>
            <option value=''>Please select...</option>
            <option value='excellent'>Excellent</option>
            <option value='good'>Good</option>
            <option value='fair'>Fair</option>
            <option value='poor'>Poor</option>
        </select>

        <div class='checkbox-group'>
            <label>Services Used:</label>
            <label><input type='checkbox' name='services' value='support'> Technical Support</label>
            <label><input type='checkbox' name='services' value='training'> Training</label>
            <label><input type='checkbox' name='services' value='consulting'> Consulting</label>
        </div>

        <label for='comments'>Additional Comments:</label>
        <textarea id='comments' name='comments' placeholder='Share your feedback...'></textarea>

        <button type='submit'>Submit Survey</button>
    </form>
</body>
</html>"

' Create a PDF with interactive form fields
Dim pdfDocument = renderer.RenderHtmlAsPdf(formHtml)

' Optional: Set form field properties programmatically
Dim formManager = pdfDocument.Form
formManager.FindField("name").Value = "" ' Pre-populate if needed
formManager.FindField("email").Required = True

' Save the interactive PDF
pdfDocument.SaveAs("customer_survey_form.pdf")
$vbLabelText   $csharpLabel

Le paramètre CreatePdfFormsFromHtml convertit les éléments de formulaire HTML en champs de formulaire PDF interactifs . Les utilisateurs peuvent remplir, enregistrer, et soumettre ces documents PDF électroniquement. Cette fonctionnalité simplifie les flux de travail en éliminant les formulaires papier tout en conservant les modèles de développement HTML familiers. L' objet PDFDocument permet de manipuler les champs de formulaire par programmation. Découvrez comment manipuler les formulaires PDF pour des implémentations avancées, notamment les signatures numériques . Explorez des exemples de données de formulaire pour des implémentations pratiques.

Sortie

Visionneuse PDF affichant un formulaire d'enquête client avec des champs pour le nom, l'adresse e-mail, une liste déroulante de satisfaction réglée sur " Excellent " et une section de commentaires, avec les filigranes Iron Software visibles.

Quels éléments de formulaire HTML sont pris en charge ?

IronPDF prend en charge tous les éléments de formulaire HTML standard, y compris les champs de texte, les zones de texte, les cases à cocher, les boutons radio , les listes déroulantes et les boutons. Les champs de mot de passe sont convertis en champs de saisie de texte sécurisés . Les champs de téléchargement de fichiers deviennent des espaces réservés aux pièces jointes . Les champs cachés préservent les données du formulaire sans les afficher. Les types d'entrée HTML5 comme email, tel et number conservent des règles de validation. Le style personnalisé s'applique à l'apparence du formulaire. Consultez la documentation des formulaires pour connaître les comportements et les limitations spécifiques à chaque élément. Tenez compte des fonctionnalités d'accessibilité pour la conformité du formulaire.

Comment valider les données d'un formulaire PDF ?

Mettez en œuvre une validation côté client à l'aide de JavaScript avant la génération du PDF. Définissez les attributs obligatoires des champs de formulaire pour la validation intégrée. Utilisez des expressions régulières pour la correspondance de modèles sur les entrées de texte. Configurer les plages numériques pour les champs numériques. Ajoutez des scripts de validation personnalisés aux formulaires PDF à l'aide d'Acrobat JavaScript. Mettre en œuvre une validation côté serveur lors du traitement des formulaires soumis . Envisagez l'utilisation de signatures numériques pour garantir l'intégrité des documents soumis. Créez des résumés de validation qui affichent clairement les erreurs. Explorez les écouteurs de messages JavaScript pour les scénarios de validation avancés.

Est-il possible de préremplir dynamiquement les champs de formulaire ?

Accédez aux champs du formulaire via la propriété Form après le rendu. Définissez les valeurs des champs à l'aide de FindField ("fieldName").Value. Alimenter à partir de bases de données ou de réponses d'API. Mettre en œuvre l'intégration des profils utilisateurs pour le remplissage automatique. Créez des modèles avec des valeurs par défaut . Prise en charge de la génération de formulaires en masse avec des données uniques par PDF. Activer les calculs des champs de formulaire pour les valeurs calculées. Tenez compte des implications en matière de sécurité liées aux données sensibles préremplies. Découvrez la gestion des champs de formulaire pour les scénarios complexes.

Pourquoi choisir IronPDF plutôt que d'autres bibliothèques PDF ?

La licence commence à $799 pour les licences de développeur unique, avec des options pour les équipes et entreprises. Chaque formule offre des avantages uniques, et l'investissement est rentabilisé grâce aux gains de temps de développement. Accédez instantanément à votre clé API après l'achat. Consultez les options de licence pour trouver le bon package NuGet pour votre projet.

Le moteur de rendu Chrome d'IronPDF garantit une précision au pixel près lors de la création de PDF, éliminant ainsi les compromis des anciennes solutions de moteur de rendu WebKit . Contrairement aux alternatives open source qui nécessitent des exécutables externes ou des configurations de navigateur sans interface graphique, IronPDF s'intègre parfaitement sans aucune dépendance. Son API fluide et sa conception de haut niveau la rendent supérieure aux classes intégrées ou aux implémentations complexes de Crystal Reports. Comparez IronPDF à ses concurrents pour comprendre ses avantages.

! Aperçu des fonctionnalités d'IronPDF présentant quatre catégories principales : Créer des PDF, Convertir des PDF, Modifier des PDF et Signer et sécuriser des PDF, avec des listes de fonctionnalités détaillées sous chaque catégorie sur fond violet foncé

Quels sont les principaux avantages d'IronPDF pour la génération dynamique de PDF ?

Les fonctionnalités avancées incluent le filigrane , les signatures numériques , la création de formulaires , la conformité PDF/A et le chiffrement . L' intégration .NET prend en charge tous les types de projets, des applications console aux fonctions Azure . La compatibilité multiplateforme garantit des résultats cohérents sous Windows , Linux et macOS . Les optimisations de performance permettent de gérer efficacement la production à l'échelle de l'entreprise. Explorez les fonctionnalités d'IronPDF pour découvrir toutes ses capacités.

IronPDF offre un aperçu de ses trois principaux avantages : un rendu d'une précision pixel parfaite grâce à la prise en charge HTML/CSS/JS de qualité Chromium, une installation en 5 minutes via le gestionnaire de paquets et une compatibilité multiplateforme avec Windows, Linux, macOS et les services cloud.

Comment IronPDF se compare-t-il aux alternatives gratuites ?

Les bibliothèques libres manquent souvent de soutien commercial , pourtant essentiel pour les applications de production. IronPDF propose une assistance technique 24h/24 et 5j/7 assurée par des ingénieurs dédiés. Les alternatives open source peuvent comporter des restrictions de licence incompatibles avec une utilisation commerciale. IronPDF propose des licences flexibles pour tous les cas de figure. Les tests de performance montrent qu'IronPDF génère des PDF 3 à 5 fois plus rapidement que wkhtmltopdf. Le moteur de rendu de Chrome offre des résultats supérieurs aux moteurs plus anciens. Des mises à jour régulières garantissent la compatibilité avec les dernières normes web. Examinez en détail les comparaisons entre concurrents pour des alternatives spécifiques.

Pourquoi IronPDF vaut-il l'investissement ?

Calculez le retour sur investissement grâce aux gains de temps de développement : les développeurs constatent une implémentation 40 % plus rapide que les solutions alternatives. Éliminez les coûts de maintenance grâce à la gestion des dépendances et aux mises à jour automatiques . Les fonctionnalités d'entreprise telles que la signature HSM et la conformité PDF/UA coûtent des milliers de dollars dans les produits concurrents. La distribution sans redevances supprime les frais par document. Une documentation complète et des exemples de code facilitent l'apprentissage. La prise en charge multiplateforme élimine les implémentations spécifiques à chaque plateforme. Envisagez des extensions de licence pour bénéficier de mises à jour et d'un support continus.

Les licences commencent à $799 pour les licences mono-développeur, avec des options pour équipes et entreprises disponibles. Chaque formule offre des avantages uniques, et l'investissement est rentabilisé grâce aux gains de temps de développement. Accédez instantanément à votre clé API après l'achat. Consultez les options de licence pour trouver le forfait adapté à votre projet. Explorez les options de mise à niveau de licence à mesure que vos besoins évoluent.

La page de licences d'IronPDF présente quatre niveaux de tarification (Lite : 749 $, Plus : 999 $, Professionnel : 1 999 $ et Illimité : 3 999 $), avec des limites de développeur, de localisation et de projet pour chaque niveau.

Quelles sont les prochaines étapes pour la génération de PDF dynamiques ?

La génération dynamique de PDF en C# révolutionne la façon dont les applications distribuent des documents personnalisés à l'exécution. IronPDF fournit les outils essentiels pour créer des fichiers PDF à partir de contenu HTML , de pages web et de sources de données. Son rendu basé sur Chrome garantit que vos PDF correspondent exactement aux spécifications de conception, tandis que la prise en charge asynchrone permet un traitement à grande échelle. Consultez les tutoriels pour obtenir des instructions étape par étape sur la mise en œuvre de ces fonctionnalités.

La commande suivante lance votre processus : Install-Package IronPdf. Avec IronPDF, vous pouvez convertir des chaînes HTML , créer des PDF complexes avec des images et des tableaux , ajouter des numéros de page , contrôler la taille des polices et générer des rapports PDF à partir de n'importe quelle source de données. Chaque nouveau document bénéficie d' un rendu au pixel près , qu'il s'agisse de créer une page simple ou des mises en page complexes avec plusieurs instances de documents. Pour des besoins supplémentaires en matière de sécurité des documents, pensez à IronSecuredDoc .

Commencez par un essai gratuit de 30 jours d'IronPDF pour découvrir ces fonctionnalités. Explorez la documentation complète, consultez les références aux espaces de noms dans la documentation de l'API et étudiez les exemples de code pour accélérer vos projets de génération de fichiers PDF. Pour des besoins supplémentaires en matière de traitement de documents, notamment la manipulation de fichiers Excel et la reconnaissance optique de caractères (OCR) , envisagez la suite IronSuite . Consultez les mises à jour du produit pour rester informé des dernières fonctionnalités et améliorations.

Questions Fréquemment Posées

Qu'est-ce que la génération dynamique de PDF en C#?

La génération dynamique de PDF en C# consiste à créer des documents PDF de manière programmatique au moment de l'exécution, ce qui permet de créer des contenus personnalisés tels que des factures, des rapports et des formulaires.

Comment IronPDF aide-t-il à générer des PDF de manière dynamique ?

IronPDF offre de puissantes fonctionnalités de rendu basées sur Chrome qui permettent une intégration transparente avec C# pour créer efficacement des documents PDF dynamiques.

IronPDF peut-il être utilisé avec le .NET Framework ?

Oui, IronPDF est entièrement compatible avec le .NET Framework, ce qui en fait un outil robuste pour la génération dynamique de PDF dans cet environnement.

Quels sont les cas d'utilisation de la génération dynamique de PDF ?

La génération dynamique de PDF est utile pour créer des factures personnalisées, des rapports axés sur les données et des champs de formulaire personnalisés dans les applications web modernes.

Pourquoi le rendu basé sur Chrome est-il important pour la génération de PDF ?

Le rendu basé sur Chrome garantit une apparence de document de haute qualité et cohérente, et prend en charge les normes et styles web modernes dans la génération de PDF.

IronPDF est-il adapté à la création de rapports PDF axés sur les données ?

Oui, IronPDF est bien adapté à la création de rapports PDF axés sur les données, permettant aux développeurs d'intégrer dynamiquement des données dans leurs documents PDF.

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