Passer au contenu du pied de page
UTILISATION DE IRONPDF

Comment afficher des PDF dans Blazor avec IronPDF

Le problème avec les collatéraux génériques et manuels

Page d'accueil d'IronPDF Une offre promotionnelle qui atteint chaque client dans la base de données, indépendamment de ce qu'ils ont acheté ou consulté, n'est pas tant une offre qu'un événement de bruit. Le client qui vient de dépenser 800 $ en bagages n'a pas besoin d'un coupon de 10 % sur les bagages. L'utilisateur d'essai qui n'a ouvert que les fonctionnalités de reporting ne veut pas recevoir un e-mail sur les outils de collaboration. La personnalisation n'est pas un luxe marketing, c'est la base pour des collatéraux qui convertissent véritablement.

Le fossé entre vouloir des collatéraux personnalisés et les produire à grande échelle est là où les choses se dégradent. Une entreprise de voyage avec dix segments de destinations, trois niveaux de clientèle et deux variantes régionales n'a pas 60 fichiers InDesign, elle a trois fichiers que quelqu'un avait l'intention de mettre à jour, et le reste se trouve dans un dossier partagé que personne ne touche. Une entreprise de services financiers produisant des résumés d'investissement sur mesure pour différents profils de risque ne peut pas demander à un designer de réaliser chaque document à la main. Une plateforme e-commerce avec des campagnes de reconquête de clients désaffectés a besoin d'offres générées par destinataire, non par segment.

L'ingénierie est impliquée chaque fois que le marketing a besoin " juste d'une version de plus ". L'export PDF est reconstruit, le modèle est dupliqué, le pipeline de données est étendu, et au moment de l'expédition, la fenêtre de la campagne s'est rétrécie. La prochaine campagne commence le même cycle.

Les plateformes de personnalisation tierces abstraient une partie de cela mais ajoutent une tarification par document ou par destinataire qui évolue directement en fonction de la taille de la campagne, les campagnes avec la plus large portée étant les plus coûteuses à exécuter.

La solution : personnalisation en temps réel des données client au document PDF

IronPDF permet aux applications .NET de générer des offres et brochures PDF personnalisées en fusionnant les données clients et la logique de segmentation avec le contenu HTML et les modèles marketing CSS en temps réel. Le système de campagne identifie le destinataire et ses attributs, sélectionne la variante de modèle appropriée, la remplit avec le contenu spécifique au client, et ChromePdfRenderer produit le PDF.

Le marketing possède et met à jour les modèles HTML. L'ingénierie possède le pipeline de données et la logique de segmentation. Ni l'un ni l'autre ne bloque l'autre, un designer peut modifier la disposition du modèle, mettre à jour l'imagerie ou réécrire le texte sans toucher une ligne de C#, et la prochaine exécution prend automatiquement la modification. Aucune exportation d'outil de design, aucuns frais de prestataire par document, aucune variation manuelle par campagne. Le rendu s'exécute dans l'application .NET existante sous forme d'un seul package NuGet.

Comment ça marche en pratique

1. Le déclencheur de campagne identifie le destinataire et son profil

La génération se déclenche lorsqu'une tâche de campagne programmée s'exécute pour un segment cible, qu'un utilisateur atteint une étape du cycle de vie (trente jours depuis le dernier achat, jour d'essai 14, première connexion après un intervalle) ou qu'un représentant commercial génère une offre de départ pour un prospect spécifique dans le CRM. Les trois chemins produisent la même entrée : un ID client et le contexte qui a déclenché la campagne.

L'application récupère le profil du destinataire dans la base de données client, nom, étiquette de segment, historique des achats, affinités produits, niveau de fidélité et tous les signaux comportementaux pertinents pour l'offre. Les destinations consultées par un client de voyages, la catégorie la plus récente d'un acheteur en ligne, les fonctionnalités les plus utilisées d'un utilisateur d'essai SaaS. Ce sont les données qui font que le document semble spécifique plutôt que générique.

2. La logique de segmentation choisit le modèle et le contenu

Un sélecteur de modèle associe le segment et les attributs du client à une variante de modèle. Un client fidèle dépensant beaucoup obtient le modèle premium avec le niveau de remise le plus élevé et un ton " membre estimé ". Un segment sensible au prix obtient une variante adaptée au budget avec un titre et une proposition de valeur différents. Un client désaffecté obtient un cadrage de reconquête.

Les recommandations de produits, les pourcentages d'offres, les dates d'expiration, et les codes de remboursement sont calculés à cette étape, dérivés du modèle d'affinité du client, du niveau de fidélité et de la configuration de la campagne. Le code de rédemption unique ou l'URL de suivi rattache le document spécifique au destinataire pour l'attribution lorsque l'offre est rachetée.

Par exemple :

Exemple de modèle d'offre budget

Modèle d'entrée HTML Un

Exemple de modèle d'offre standard

Modèle d'entrée HTML Deux

Exemple de modèle d'offre premium

Modèle d'entrée HTML Trois

3. Modèle rempli et rendu en conversion HTML en PDF

using IronPdf;

var renderer = new ChromePdfRenderer();

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

renderer.RenderingOptions.MarginTop = 0;

renderer.RenderingOptions.MarginBottom = 0;

string templateFile = customer.Segment switch
{
    "HighValue"     => "Templates/offer-premium.html",
    "PriceSensitive"=> "Templates/offer-budget.html",
    _               => "Templates/offer-standard.html"
};

string productRows = string.Concat(customer.Recommendations.Take(3).Select(p =>

    $"<div class='product'><img src='{p.ImageUrl}'><p><strong>{p.Name}</strong></p><p>{p.Price:C}</p></div>"));

string html = (await File.ReadAllTextAsync(templateFile))
    .Replace("{{CustomerName}}", customer.FirstName)
    .Replace("{{DiscountPct}}", customer.LoyaltyDiscount.ToString())
    .Replace("{{OfferCode}}", customer.UniqueOfferCode)
    .Replace("{{Expiry}}", campaign.ExpiryDate.ToString("MMMM d, yyyy"))
    .Replace("{{ProductRecommendations}}", productRows);

PdfDocument offer = renderer.RenderHtmlAsPdf(html);

offer.SaveAs($"offers/{campaign.Id}/{customer.Id}.pdf");
using IronPdf;

var renderer = new ChromePdfRenderer();

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

renderer.RenderingOptions.MarginTop = 0;

renderer.RenderingOptions.MarginBottom = 0;

string templateFile = customer.Segment switch
{
    "HighValue"     => "Templates/offer-premium.html",
    "PriceSensitive"=> "Templates/offer-budget.html",
    _               => "Templates/offer-standard.html"
};

string productRows = string.Concat(customer.Recommendations.Take(3).Select(p =>

    $"<div class='product'><img src='{p.ImageUrl}'><p><strong>{p.Name}</strong></p><p>{p.Price:C}</p></div>"));

string html = (await File.ReadAllTextAsync(templateFile))
    .Replace("{{CustomerName}}", customer.FirstName)
    .Replace("{{DiscountPct}}", customer.LoyaltyDiscount.ToString())
    .Replace("{{OfferCode}}", customer.UniqueOfferCode)
    .Replace("{{Expiry}}", campaign.ExpiryDate.ToString("MMMM d, yyyy"))
    .Replace("{{ProductRecommendations}}", productRows);

PdfDocument offer = renderer.RenderHtmlAsPdf(html);

offer.SaveAs($"offers/{campaign.Id}/{customer.Id}.pdf");
Imports IronPdf
Imports System.IO
Imports System.Linq

Dim renderer As New ChromePdfRenderer()

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

renderer.RenderingOptions.MarginTop = 0

renderer.RenderingOptions.MarginBottom = 0

Dim templateFile As String = If(customer.Segment = "HighValue", "Templates/offer-premium.html", If(customer.Segment = "PriceSensitive", "Templates/offer-budget.html", "Templates/offer-standard.html"))

Dim productRows As String = String.Concat(customer.Recommendations.Take(3).Select(Function(p) $"<div class='product'><img src='{p.ImageUrl}'><p><strong>{p.Name}</strong></p><p>{p.Price:C}</p></div>"))

Dim html As String = (Await File.ReadAllTextAsync(templateFile)).
    Replace("{{CustomerName}}", customer.FirstName).
    Replace("{{DiscountPct}}", customer.LoyaltyDiscount.ToString()).
    Replace("{{OfferCode}}", customer.UniqueOfferCode).
    Replace("{{Expiry}}", campaign.ExpiryDate.ToString("MMMM d, yyyy")).
    Replace("{{ProductRecommendations}}", productRows)

Dim offer As PdfDocument = renderer.RenderHtmlAsPdf(html)

offer.SaveAs($"offers/{campaign.Id}/{customer.Id}.pdf")
$vbLabelText   $csharpLabel

Exemple de PDF généré

Exemple de sortie IronPDF ChromePdfRenderer gère la pleine fidélité visuelle du modèle, les images de produit, les polices marketing personnalisées chargées via @font-face, les mises en page multi-colonnes et les boutons appel à l'action stylisés se rendent exactement comme l'équipe marketing les a conçus. La sortie n'est pas une version dégradée du modèle ; c'est le modèle.

4. Génération par lot pour les segments de campagne

using IronPdf;

var renderer = new ChromePdfRenderer();

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

await Parallel.ForEachAsync(campaignRecipients,

    new ParallelOptions { MaxDegreeOfParallelism = 4 },

    async (customer, _) =>
    {
        string html = await BuildPersonalizedHtmlAsync(customer, campaign);
        PdfDocument pdf = renderer.RenderHtmlAsPdf(html);
        pdf.SaveAs($"offers/{campaign.Id}/{customer.Id}.pdf");
    });
using IronPdf;

var renderer = new ChromePdfRenderer();

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

await Parallel.ForEachAsync(campaignRecipients,

    new ParallelOptions { MaxDegreeOfParallelism = 4 },

    async (customer, _) =>
    {
        string html = await BuildPersonalizedHtmlAsync(customer, campaign);
        PdfDocument pdf = renderer.RenderHtmlAsPdf(html);
        pdf.SaveAs($"offers/{campaign.Id}/{customer.Id}.pdf");
    });
Imports IronPdf

Dim renderer As New ChromePdfRenderer()

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

Await Parallel.ForEachAsync(campaignRecipients, 
    New ParallelOptions With {.MaxDegreeOfParallelism = 4}, 
    Async Function(customer, _) 
        Dim html As String = Await BuildPersonalizedHtmlAsync(customer, campaign)
        Dim pdf As PdfDocument = renderer.RenderHtmlAsPdf(html)
        pdf.SaveAs($"offers/{campaign.Id}/{customer.Id}.pdf")
    End Function)
$vbLabelText   $csharpLabel

Deux offres PDF générées avec la bibliothèque IronPDF

Exemple de génération de plusieurs PDFs Chaque PDF rendu est stocké avec clé par ID client sous le répertoire de campagne, prêt à être attaché à l'e-mail sortant, servi comme lien de téléchargement dans une page de destination personnalisée ou remis à un représentant commercial comme une offre imprimée. Les analyses de campagne suivent quels codes sont rachetés, fermant l'attribution au document d'offre spécifique que chaque destinataire a reçu.

Avis Réels

Personnalisation à grande échelle. Chaque destinataire reçoit un document construit à partir de ses propres données, segment, comportement, historique d'achats, niveau de fidélité. Le même pipeline dessert une liste de dix prospects ou un segment de campagne de cinquante mille.

Format tangible. Un PDF est sauvegardé dans un dossier de téléchargements, transféré à un collègue ou imprimé et épinglé. Il persiste au-delà de la boîte de réception d'une manière que le texte du corps de l'e-mail ne fait pas, prolongeant la durée de vie de l'offre sans effort supplémentaire.

Agilité marketing. Le modèle HTML et CSS est édité par l'équipe marketing ou de design directement, imagerie mise à jour, texte révisé, nouvelle mise en page. Les modifications prennent effet lors de la prochaine exécution sans qu'un déploiement d'ingénierie soit requis.

Attribution. Un code de rédemption unique ou une URL de suivi intégrée par destinataire relie les conversions au document spécifique que le client a reçu. La performance de la campagne n'est pas déduite à partir des taux de clics agrégés, elle est traçable à chacune des offres individuelles.

Flexibilité des segments. Ajouter un nouveau segment signifie ajouter une nouvelle variante de modèle ou ajuster la logique du sélecteur. Le pipeline de génération ne change pas. L'ingénierie n'a pas besoin de reconstruire quoi que ce soit pour supporter un nouveau niveau de client ou un thème de campagne.

Pas de frais par document. Le rendu s'effectue en cours de traitement. Il n'y a pas d'API de personnalisation tierce, pas de frais par destinataire, et pas de modèle de tarification qui pénalise les grandes exécutions de campagne.

Conclusion

Le matériel promotionnel PDF personnalisé est à l'intersection de ce à quoi les clients répondent réellement — quelque chose qui leur semble spécifiquement pertinent — et un format qui voyage plus loin qu'un e-mail. Le fossé entre une diffusion statique et un document adapté à chaque destinataire est un pipeline de données et un modèle, pas une plateforme distincte.

Construire ce pipeline à l'intérieur d'un système de campagne .NET existant prend un fichier modèle, une étape de population de données, et un appel de rendu. IronPDF gère le cycle de vie complet de la génération PDF en C# chez ironpdf.com, de la restitution du contenu HTML à l'enregistrement, la génération de rapports, le streaming et la manipulation de documents. Si vous êtes prêt à tester la génération de matériel promotionnel personnalisé contre vos propres segments de clients et données de campagne, commencez votre essai gratuit de 30 jours et ayez un pipeline opérationnel avant l'ouverture de votre prochaine fenêtre de campagne.

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