フッターコンテンツにスキップ
IRONPDFの使用

IronPDFを使用してBlazorでPDFを表示する方法

ジェネリックおよび手動の担保の問題

IronPDF ホームページ 何を購入したか、何を閲覧したかに関係なく、データベースのすべての顧客に行う割引提供は提案というよりはノイズイベントに過ぎません。 つい800ドルをラゲッジに使ったばかりの顧客は、ラゲッジの10%クーポンを必要としていません。 レポート機能しか開いたことのないトライアルユーザーは、コラボレーションツールについてのメールを求めていません。 パーソナライゼーションはマーケティングの贅沢ではなく、実際にコンバートするための基本線です。

パーソナライズされた担保を望むこととそれを大規模に生産することのギャップがあるところで、物事は崩壊します。 10の目的地セグメント、3つの顧客層、2つの地域バリエーションを持つ旅行会社は60のInDesignファイルを持っているわけではなく、誰もさわらない共有ドライブフォルダに意図された3つのファイルがあります。 異なるリスクプロファイルに応じた投資サマリーを作成する金融サービス会社は、デザイナーに手作りでそれぞれを作らせることはできません。 停止した顧客復帰キャンペーンを持つEコマースプラットフォームには、セグメントごとではなく、受信者ごとに生成されたオファーが必要です。

マーケティングが"もう一つのバージョンが必要だ"と言うたびに、エンジニアリングはギャップに引っ張られます。PDF出力は再構築され、テンプレートは複製され、データパイプラインは拡張され、出荷の時点でキャンペーンの窓は狭まっています。 次のキャンペーンは同じサイクルを開始します。

サードパーティのパーソナライゼーションプラットフォームはこれの一部を抽象化しますが、各ドキュメントまたは各受取者の料金を加算し、キャンペーンサイズに直接比例してスケールします。

ソリューション:クライアントデータからPDFドキュメントへのランタイムパーソナライゼーション

IronPDFを使用すれば、.NETアプリケーションは顧客データとセグメンテーションロジックをHTMLコンテンツとCSSマーケティングテンプレートと統合して、パーソナライズされたPDFオファーやパンフレットを生成できます。キャンペーンシステムは受信者とその属性を特定し、適切なテンプレートバリアントを選択し、顧客固有のコンテンツでそれを埋め、 ChromePdfRendererがPDFを生成します。

マーケティングはHTMLテンプレートを持ち、更新します。 エンジニアリングはデータパイプラインとセグメンテーションロジックを持ちます。 いずれも他をブロックせず、デザイナーはテンプレートレイアウトを変更し、画像を更新し、コピーを書き換えることができ、C#の一行にも触れず、次のレンダリングが自動的にその変更を取り込みます。 デザインツールのエクスポートも、各ドキュメントごとのベンダー料金も、キャンペーンごとの手動バリエーションもありません。 レンダリングは、単一のNuGetパッケージとして既存 for .NETアプリケーション内で実行されます。

実際の使用方法

1. キャンペーントリガーが受信者とそのプロファイルを特定します

世代がトリガーされるのは、あるターゲットセグメントに対してスケジュールされたキャンペーンジョブが実行されたとき、ユーザーがライフサイクルマイルストーンに達したとき(最後の購入から30日、試用14日目、ギャップ後の初回ログインなど)、または営業担当者がCRMで特定の見込み客のための置き結合オファーを生成するときです。 3つのパスすべてが同じ入力を生成します:顧客IDとキャンペーンを引き起こしたコンテキストです。

アプリケーションは顧客データベースから受信者のプロファイルを取得し、名前、セグメントラベル、購入履歴、製品アフィニティ、ロイヤリティ階層、提案に関連する行動シグナルを含みます。 旅行顧客の閲覧した目的地、Eコマースショッパーの最近のカテゴリー、SaaSトライアルユーザーの最も使用された機能。 これは文書を具体的に感じさせるデータです。

2. セグメンテーションロジックがテンプレートとコンテンツを選択します

テンプレートセレクターが顧客のセグメントと属性をテンプレートバリアントにマッピングします。 高支出ロイヤリティ顧客は最大割引層と"価値あるメンバー"トーンを持つプレミアムテンプレートが割り当てられます。 価格に敏感なセグメントには別の見出しと価値提案を備えた予算に優しいバリアントが与えられます。 停止した顧客には復活を促すフレーミングが与えられます。

製品推奨、オファー割合、有効期限、割引コードはこのステップで計算され、顧客のアフィニティモデル、ロイヤリティ階層、キャンペーン構成から導かれます。 固有の割引コードまたはトラッキングURLが特定のドキュメントと受信者を関連付け、オファーが利用されたときにアトリビューションを行います。

例えば:

予算用オファー例テンプレート

HTML 入力テンプレート1

標準オファー例テンプレート

HTML 入力テンプレート2

プレミアムオファー例テンプレート

HTML 入力テンプレート3

3. HTMLから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

生成されたPDFの例

IronPDF 例の出力 ChromePdfRendererはテンプレートの完全な視覚的忠実度を処理し、製品画像、@font-faceを介してロードされた独自のマーケティングフォント、複数列のレイアウト、およびスタイル付きのコールトゥアクションボタンを、マーケティングチームがデザインしたとおりにレンダリングします。 出力はテンプレートのダウングレードバージョンではありません; それはテンプレートです。

4.キャンペーンセグメントのためのバッチ生成

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

IronPDFライブラリで生成された2つのPDFオファー

生成された複数のPDFの例 各レンダリングされたPDFは、キャンペーンディレクトリの顧客IDに基づいて保存され、送信メールに添付する準備が整い、パーソナライズされたランディングページのダウンロードリンクとして提供され、または営業担当者が印刷した置き結合として引き渡すために準備が整います。 キャンペーン分析は、どのコードが利用されたかを追跡し、特定のオファードキュメントが各受信者が受け取ったアトリビューションを閉じます。

実世界の利点

スケールでのカスタマイズ。各受信者は、彼ら自身のデータ、セグメント、行動、購入歴史、ロイヤリティ層から作られたドキュメントを取得します。 同じパイプラインが、10の見込み客のリストまたは5万のキャンペーンセグメントを提供します。

有形形式。 PDFはダウンロードフォルダーに保存され、同僚に転送され、印刷されてピン留めされます。メール本文のテキストにはない持続性を持ち、追加の努力なしにオファーの寿命を延ばします。

マーケティングの柔軟性。 HTMLおよびCSSテンプレートは、マーケティングやデザインチームが直接編集し、画像を更新し、コピーを改訂し、新しいレイアウトにしました。 変更が次のレンダリングに影響を及ぼし、エンジニアリングの展開は必要ありません。

アトリビューション。 各受信者ごとに埋め込まれた固有の割引コードまたはトラッキングURLが、変換を顧客が受け取った特定のドキュメントに関連付けます。 キャンペーンパフォーマンスは集計クリック率から推測されるのではなく、個別のオファーに追跡可能です。

セグメントの柔軟性。 新しいセグメントを追加することは、新しいテンプレートバリアントを追加することまたはセレクターロジックを調整することを意味します。 生成パイプラインは変更されません。 エンジニアリングは、新しい顧客層やキャンペーンテーマをサポートするために何かを再構築する必要はありません。

ドキュメントごとの費用はかかりません。レンダリングはインプロセスで実行されます。 サードパーティのパーソナライゼーションAPIも、各受信者ごとの料金も、大規模なキャンペーン実行をペナルティー化する料金モデルもありません。

結び

パーソナライズされたPDF担保は、顧客が実際に反応するもの、つまり、彼らに特に関連するものとして感じられるものと、メールよりもはるかに遠くへ移動するフォーマットの交差点にあります。 静的爆破と各受信者に合わせて作成されたドキュメントの間のギャップは、データパイプラインとテンプレートであり、別のプラットフォームではありません。

既存 for .NETキャンペーンシステム内にそのパイプラインを構築することは、テンプレートファイル、データポピュレーションステップ、レンダリングコールを取ります。 ironpdf.comでIronPDFはC#でのPDF生成のフルライフサイクルを処理し、HTMLコンテンツのレンダリングから保存、レポートの生成、ストリーミング、ドキュメントの操作まで対応します。 パーソナライズされた担保生成を自分の顧客セグメントとキャンペーンデータでテストする準備ができたら、無料の30日間トライアルを開始し、次のキャンペーンが開始される前に動作するパイプラインを手に入れましょう。

Curtis Chau
テクニカルライター

Curtis Chauは、カールトン大学でコンピュータサイエンスの学士号を取得し、Node.js、TypeScript、JavaScript、およびReactに精通したフロントエンド開発を専門としています。直感的で美しいユーザーインターフェースを作成することに情熱を持ち、Curtisは現代のフレームワークを用いた開発や、構造の良い視覚的に魅力的なマニュアルの作成を楽しんでいます。

開発以外にも、CurtisはIoT(Internet of Things)への強い関心を持ち、ハードウェアとソフトウェアの統合方法を模索しています。余暇には、ゲームをしたりDiscordボットを作成したりして、技術に対する愛情と創造性を組み合わせています。

アイアンサポートチーム

私たちは週5日、24時間オンラインで対応しています。
チャット
メール
電話してね