Passer au contenu du pied de page
UTILISATION DE IRONPDF

Générer des relevés de compte mensuels au format PDF

Le problème de la génération de déclarations à grande échelle

Page d'accueil d'IronPDF Pour une petite base de clients, exporter un fichier CSV et le mettre en forme manuellement est fastidieux, mais faisable. Avec quelques centaines de clients, cela devient une tâche à part entière. À quelques milliers, cela devient un goulot d'étranglement qui bloque le cycle de facturation.

SSRS et Crystal Reports ont longtemps été la solution standard. Ils fonctionnent toujours, mais le résultat final semble dater de 2008 : difficile à personnaliser, coûteux à maintenir et en décalage avec le design visuel adopté par le reste du produit. La mise à jour d'une définition de rapport nécessite l'intervention d'un spécialiste, et le résultat final correspond rarement à l'esprit de la marque sans un effort considérable.

Les API tierces de génération de déclarations résolvent le problème d'apparence, mais en introduisent de nouveaux. La tarification par document évolue directement en fonction de la croissance de la clientèle, ce qui signifie que vos coûts d'infrastructure augmentent à chaque fois que l'entreprise prospère. Il existe également une dépendance réseau : si l'API n'est pas disponible pendant le cycle de facturation, l'ensemble du cycle est bloqué.

La dimension de la performance n'est pas négligeable. Une plateforme SaaS générant des résumés d'utilisation pour 10 000 clients le 1er du mois, un système de télécommunications produisant des relevés d'appels détaillés, un gestionnaire immobilier distribuant des registres de loyers à des centaines de locataires : tous ces systèmes ont une fenêtre dans laquelle l'exécution doit s'achever. Une approche qui n'est pas conçue pour le débit passera à côté de l'essentiel.

Les clients, quant à eux, s'attendent à un document à l'image de la marque, qui semble appartenir au produit pour lequel ils paient, et non à une simple exportation de données brutes sur laquelle un logo a été apposé.

Cet exemple IronPDF montre comment les applications .NET modernes peuvent générer automatiquement un document PDF personnalisé à partir d'un fichier HTML et le fournir à grande échelle aux clients. Grâce à la bibliothèque PDF IronPDF C#, les développeurs peuvent convertir du code HTML en fichiers PDF fiables au sein d'un projet .NET sans avoir recours à des services externes. L'approche présentée ici fonctionne sur plusieurs plateformes, s'intègre facilement à Visual Studio et utilise le modèle de distribution de fichiers PDF via la bibliothèque NuGet, auquel les développeurs .NET font déjà confiance.

La solution : génération de PDF par lots avec la bibliothèque PDF IronPDF C

IronPDF permet aux applications .NET de générer des relevés PDF personnalisés à partir de modèles HTML et CSS dans une boucle de traitement par lots ou une tâche en arrière-plan. Les données de chaque client sont renseignées dans le même modèle, ChromePdfRenderer génère le PDF, et l'application l'envoie par e-mail ou le publie sur un portail en libre-service.

Il n'y a aucune installation SSRS à gérer, aucune licence Crystal Reports à renouveler et aucun coût par document qui augmente avec le nombre de vos clients. IronPDF s'exécute au sein de votre application .NET existante sous la forme d'un seul package NuGet, sans processus externes. Le modèle HTML appartient à votre équipe, est stylisé avec le même CSS que celui utilisé pour le reste du produit et est mis à jour selon votre propre calendrier.

Installation du package NuGet IronPDF

La plupart des développeurs installent IronPDF via le gestionnaire de paquets NuGet dans Visual Studio. Ouvrez l'Explorateur de solutions de Visual Studio, cliquez avec le bouton droit sur Références, sélectionnez Gérer les packages NuGet, puis recherchez (Ctrl) IronPDF et cliquez sur Installer IronPDF.

Le logo NuGet apparaît à côté de la liste des paquets, confirmant que la dernière version de NuGet est disponible. Une fois installé, ajoutez l'espace de noms requis à votre projet :

using IronPdf;
using IronPdf;
Imports IronPdf
$vbLabelText   $csharpLabel

IronPDF est fourni sous la forme d'une DLL PDF C# distribuée via la bibliothèque NuGet C#, ce qui rend son installation simple pour tout flux de travail de documents .NET.

Comment cela fonctionne en pratique : utiliser IronPDF dans vos projets .NET

1. Une tâche planifiée déclenche le cycle de facturation

Un BackgroundService, une tâche récurrente Hangfire ou un planificateur Quartz.NET se déclenche au début de chaque période de facturation, généralement à minuit le 1er du mois. La tâche interroge la base de données de facturation pour récupérer tous les clients actifs et leurs données de période : lignes de commande, frais, crédits, solde courant et indicateurs d'utilisation.

La requête renvoie un ensemble d'enregistrements par client. À partir de là, la génération de déclarations se fait en boucle.

2. Le modèle HTML est rempli en fonction du client

Le modèle est une chaîne HTML standard ou une vue Razor rendue. Elle contient le logo de l'entreprise (intégré sous forme d'URI de données base64 pour un rendu sécurisé lors du déploiement), le numéro de compte du client, la période de facturation et tous les détails de facturation organisés en sections : répartition de l'utilisation, frais, crédits et solde de clôture.

Le modèle constitue la seule référence en matière de présentation de chaque phrase. Lorsque l'équipe juridique a besoin d'un nouveau pied de page de divulgation ou que l'équipe de conception met à jour la palette de couleurs, un seul fichier est modifié et toutes les déclarations futures en tiennent compte.

3. ChromePdfRenderer affiche chaque instruction

Dans cet exemple IronPDF, ChromePdfRenderer convertit du contenu HTML dynamique en un document PDF généré, démontrant ainsi comment un lecteur PDF moderne tel qu'Adobe Reader peut afficher le contenu PDF final exactement tel qu'il a été conçu.

using IronPdf;

var renderer = new ChromePdfRenderer();

renderer.RenderingOptions.PaperSize = IronPdf.Rendering.PdfPaperSize.A4;

renderer.RenderingOptions.MarginTop = 20;

renderer.RenderingOptions.MarginBottom = 20;

foreach (var customer in activeCustomers)

{
    string html = $@"
        <h1>Account Statement — {customer.StatementPeriod}</h1>
        <p><strong>Account:</strong> {customer.AccountNumber}</p>
        <p><strong>Name:</strong> {customer.FullName}</p>
        <hr/>
        <h2>Charges This Period</h2>
        {customer.LineItemsHtml}
        <p><strong>Closing Balance:</strong> {customer.ClosingBalance:C}</p>";

    PdfDocument statement = renderer.RenderHtmlAsPdf(html);
    await DeliverStatementAsync(customer, statement);
}
using IronPdf;

var renderer = new ChromePdfRenderer();

renderer.RenderingOptions.PaperSize = IronPdf.Rendering.PdfPaperSize.A4;

renderer.RenderingOptions.MarginTop = 20;

renderer.RenderingOptions.MarginBottom = 20;

foreach (var customer in activeCustomers)

{
    string html = $@"
        <h1>Account Statement — {customer.StatementPeriod}</h1>
        <p><strong>Account:</strong> {customer.AccountNumber}</p>
        <p><strong>Name:</strong> {customer.FullName}</p>
        <hr/>
        <h2>Charges This Period</h2>
        {customer.LineItemsHtml}
        <p><strong>Closing Balance:</strong> {customer.ClosingBalance:C}</p>";

    PdfDocument statement = renderer.RenderHtmlAsPdf(html);
    await DeliverStatementAsync(customer, statement);
}
Imports IronPdf

Dim renderer As New ChromePdfRenderer()

renderer.RenderingOptions.PaperSize = IronPdf.Rendering.PdfPaperSize.A4

renderer.RenderingOptions.MarginTop = 20

renderer.RenderingOptions.MarginBottom = 20

For Each customer In activeCustomers

    Dim html As String = $"
        <h1>Account Statement — {customer.StatementPeriod}</h1>
        <p><strong>Account:</strong> {customer.AccountNumber}</p>
        <p><strong>Name:</strong> {customer.FullName}</p>
        <hr/>
        <h2>Charges This Period</h2>
        {customer.LineItemsHtml}
        <p><strong>Closing Balance:</strong> {customer.ClosingBalance:C}</p>"

    Dim statement As PdfDocument = renderer.RenderHtmlAsPdf(html)
    Await DeliverStatementAsync(customer, statement)
Next
$vbLabelText   $csharpLabel

Document PDF généré

Exemple de sortie PDF générée par IronPDF La réutilisation de la même instance de ChromePdfRenderer tout au long de la boucle évite les surcoûts liés à une initialisation redondante. Pour les bases de données clients comptant des milliers d'entrées, le système peut partitionner la liste et exécuter des lots en parallèle sur tous les cœurs disponibles afin de respecter les délais de facturation.

ConseilsPour le traitement par lots en parallèle, instanciez un ChromePdfRenderer distinct par thread plutôt que de partager une seule instance. Le moteur de rendu n'est pas thread-safe, mais plusieurs instances s'exécutent simultanément sans conflit.

4. PDF envoyé par e-mail et stocké pour un accès via le portail

Le PdfDocument expose BinaryData, qui écrit directement dans un MemoryStream pour les pièces jointes aux e-mails, sans nécessiter d'écriture sur le système de fichiers :

using System.Net.Mail;
using System.IO;

async Task DeliverStatementAsync(CustomerRecord customer, PdfDocument statement)
{
    var pdfBytes = statement.BinaryData;
    // Store in blob storage for portal download
    await _blobClient.UploadAsync(
        $"statements/{customer.AccountNumber}/{customer.StatementPeriod}.pdf",
        new BinaryData(pdfBytes)
    );

    // Email to customer
    using var stream = new MemoryStream(pdfBytes);
    using var attachment = new Attachment(stream,
        $"Statement-{customer.StatementPeriod}.pdf", "application/pdf");
    var message = new MailMessage("billing@yourcompany.com", customer.Email)
    {
        Subject = $"Your {customer.StatementPeriod} Statement",
        Body = $"Dear {customer.FullName}, your statement for {customer.StatementPeriod} is attached."
    };

    message.Attachments.Add(attachment);

    using var smtp = new SmtpClient("smtp.yourprovider.com");

    await smtp.SendMailAsync(message);
}
using System.Net.Mail;
using System.IO;

async Task DeliverStatementAsync(CustomerRecord customer, PdfDocument statement)
{
    var pdfBytes = statement.BinaryData;
    // Store in blob storage for portal download
    await _blobClient.UploadAsync(
        $"statements/{customer.AccountNumber}/{customer.StatementPeriod}.pdf",
        new BinaryData(pdfBytes)
    );

    // Email to customer
    using var stream = new MemoryStream(pdfBytes);
    using var attachment = new Attachment(stream,
        $"Statement-{customer.StatementPeriod}.pdf", "application/pdf");
    var message = new MailMessage("billing@yourcompany.com", customer.Email)
    {
        Subject = $"Your {customer.StatementPeriod} Statement",
        Body = $"Dear {customer.FullName}, your statement for {customer.StatementPeriod} is attached."
    };

    message.Attachments.Add(attachment);

    using var smtp = new SmtpClient("smtp.yourprovider.com");

    await smtp.SendMailAsync(message);
}
Imports System.Net.Mail
Imports System.IO

Async Function DeliverStatementAsync( _
    customer As CustomerRecord, _
    statement As PdfDocument) As Task

    Dim pdfBytes = statement.BinaryData
    ' Store in blob storage for portal download
    Await _blobClient.UploadAsync( _
        $"statements/{customer.AccountNumber}/{customer.StatementPeriod}.pdf", _
        New BinaryData(pdfBytes) _
    )

    ' Email to customer
    Using stream As New MemoryStream(pdfBytes)
        Using attachment As New Attachment(stream, _
            $"Statement-{customer.StatementPeriod}.pdf", "application/pdf")
            Dim message As New MailMessage("billing@yourcompany.com", customer.Email) With { _
                .Subject = $"Your {customer.StatementPeriod} Statement", _
                .Body = $"Dear {customer.FullName}, your statement for {customer.StatementPeriod} is attached." _
            }

            message.Attachments.Add(attachment)

            Using smtp As New SmtpClient("smtp.yourprovider.com")
                Await smtp.SendMailAsync(message)
            End Using
        End Using
    End Using
End Function
$vbLabelText   $csharpLabel

Exemple d'e-mail avec facture PDF en pièce jointe

Email avec PDF attaché Le stockage Blob indexe le fichier par numéro de compte et par période, ce qui facilite la recherche sur le portail. Les clients téléchargent leurs relevés actuels et historiques sans avoir à contacter le support.

Avis Réels

Échelle. IronPDF affiche chaque instruction en quelques millisecondes. Un cycle de facturation pour 5 000 clients s'effectue en quelques minutes lorsqu'il est parallélisé sur plusieurs cœurs, ce qui s'inscrit largement dans une fenêtre de facturation nocturne classique.

Cohérence de la marque. Chaque élément comporte le même logo, la même palette de couleurs, la même typographie et la même mise en page. Il n'y a aucun risque d'exportation incohérente ou de déclaration qui semble différente parce qu'elle a été générée par un autre membre de l'équipe.

Libre-service client. Les relevés stockés dans le stockage blob sont disponibles au téléchargement sur le portail immédiatement après la fin du cycle de facturation. Les clients récupèrent eux-mêmes leurs relevés actuels et passés, ce qui réduit d'autant le volume de tickets d'assistance pour les demandes du type " pouvez-vous me renvoyer mon relevé ? ".

Conformité et archivage. IronPDF prend en charge la sortie au format PDF/A, le format normalisé ISO pour l'archivage à long terme des documents. Pour les institutions financières et les secteurs réglementés, les relevés au format PDF/A répondent aux exigences en matière de conservation des documents sans nécessiter d'étape d'archivage distincte. L'activation de cette fonctionnalité se fait via une simple option de rendu.

Réutilisation des modèles. Le modèle HTML et CSS est géré par votre équipe parallèlement au reste du code de l'application. Sa mise à jour nécessite les mêmes compétences que pour mettre à jour n'importe quelle autre vue — pas de concepteur de rapports, pas de format de définition propriétaire.

Pas de frais par document. Le rendu s'effectue en cours de traitement. Il n'y a pas d'appels API vers un fournisseur de services, pas d'utilisation facturée à la consommation à suivre, et aucune ligne sur votre facture d'infrastructure qui évolue en fonction de la croissance de votre clientèle.

Commencer avec IronPDF

Les développeurs peuvent tester la bibliothèque à l'aide d'une version d'essai gratuite et entièrement fonctionnelle, qui comprend une clé d'essai disponible après la création d'un compte via le formulaire d'essai. Pendant la période d'évaluation, aucun test ne nécessite de carte de crédit, ce qui signifie que les équipes peuvent explorer les fonctionnalités clés sans aucun engagement.

IronPDF fait partie de la suite Iron, souvent représentée par le logo Iron Suite Enterprise et l'image de marque associée à Iron Suite sur les logos des clients d'Iron Software. Cette boîte à outils aide les entreprises à résoudre les problèmes liés au flux de travail documentaire dans les applications .NET et les systèmes Enterprise.

Si vous souhaitez une présentation détaillée, vous pouvez demander une démonstration en direct, une démonstration personnalisée ou une démonstration des produits Iron Software auprès de l'équipe chargée des démonstrations de produits logiciels. L'équipe commerciale organise des réunions au cours desquelles l'équipe de conseil aux entreprises de Iron Software et les spécialistes en conseil aux entreprises fournissent des recommandations sur les fonctionnalités spécifiques au projet et répondent aux questions techniques.

Conclusion

La génération de relevés mensuels semble être un problème résolu jusqu'à ce que l'on tente de la mettre en œuvre à grande échelle avec une image de marque cohérente et une livraison fiable. Les outils qui étaient la norme il y a dix ans produisent des résultats qui ne correspondent plus à l'apparence actuelle des produits, et les alternatives SaaS troquent un ensemble de contraintes contre un autre.

Une boucle de traitement par lots optimisée par IronPDF remplace tout cela par un modèle HTML, un moteur de rendu et une étape de livraison, le tout s'exécutant au sein de l'application que votre équipe possède et exploite déjà. IronPDF couvre l'ensemble du cycle de vie des tâches PDF en C# — du rendu et de la génération de documents à leur enregistrement, leur diffusion en continu et leur manipulation — le tout à partir de la même bibliothèque sur ironpdf.com. Si vous créez ou refontez un pipeline de relevés, commencez votre essai gratuit de 30 jours et effectuez un cycle de facturation complet sur vos propres données avant de vous engager.

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

Équipe de soutien Iron

Nous sommes en ligne 24 heures sur 24, 5 jours sur 7.
Chat
Email
Appelez-moi