푸터 콘텐츠로 바로가기
IRONPDF 사용하기

IronPDF로 Blazor에서 PDF를 표시하는 방법

일반적이며 수동적인 담보의 문제점

IronPDF 홈페이지 모든 고객에게 보낸 할인 제안은 그들이 무엇을 구매했는지 또는 어떤 상품을 검색했는지와 상관없이 제안보다는 노이즈 이벤트에 더 가깝습니다. 방금 $800를 지출한 고객은 가방에 대한 10% 쿠폰이 필요하지 않습니다. 보고 기능만 열었던 체험판 사용자는 협업 도구에 대한 이메일을 원하지 않습니다. 개인화는 마케팅 사치가 아니라, 실제로 전환하는 담보의 기준선입니다.

개인화된 담보를 원하고 대규모로 생산하려는 간극에서 문제가 발생합니다. 10개의 목적지 세그먼트, 세 가지 고객 티어, 두 가지 지역 변형을 가진 여행 회사는 60개의 InDesign파일을 보유한 것이 아니라, 아무도 손대지 않는 공유 드라이브 폴더에 있는 세 개의 파일을 업데이트하려고 의도한 것입니다. 다른 위험 프로필에 대한 맞춤형 투자 요약을 제공하는 금융 서비스 회사는 디자이너에게 각 요약을 수작업으로 만들라고 요구할 수 없습니다. 구매자가 다시 구매하도록 유도하는 캠페인을 운영하는 전자상거래 플랫폼은 수신자별 제안을 생성해야 하며, 세그먼트마다 생성되어서는 안 됩니다.

마케팅이 "딱 하나의 버전"이 더 필요할 때마다 엔지니어링 팀이 참여하게 되고, PDF 내보내기를 다시 구축해야 하며, 템플릿을 복제하고, 데이터 파이프라인을 확장해야 합니다. 이 모든 것이 완료될 때쯤 캠페인 창의 범위가 좁아집니다. 다음 캠페인이 동일한 사이클을 시작합니다.

타사 개인화 플랫폼은 이를 일부 추상화하긴 하지만 문서당 또는 수신자당 가격을 추가하여 캠페인 크기에 직접적으로 비례하게 됩니다. 가장 넓은 범위의 캠페인이 가장 비용이 많이 듭니다.

해결책: 고객 데이터에서 PDF 문서로 런타임 개인화

IronPDF를 사용하면 .NET 애플리케이션에서 고객 데이터와 세분화 논리를 HTML 콘텐츠 및 CSS 마케팅 템플릿과 결합하여 실행 시 개인화된 PDF 제안 및 브로셔를 생성할 수 있습니다. 캠페인 시스템은 수신자와 그 속성을 식별하고, 적절한 템플릿 변형을 선택하고, 고객 특정 콘텐츠로 채워넣고, ChromePdfRenderer로 PDF를 생성합니다.

마케팅 팀은 HTML 템플릿을 소유하고 업데이트합니다. 엔지니어링 팀은 데이터 파이프라인과 세분화 논리를 소유합니다. 둘 중 어느 것도 다른 하나에게 방해가 되지 않으며, 디자이너는 C#의 코드를 건드리지 않고 템플릿 레이아웃을 변경하거나, 이미지를 업데이트하거나, 텍스트를 다시 쓸 수 있으며, 다음 렌더링은 자동으로 변경 사항을 반영합니다. 디자인 도구 내보내기, 문서당 공급자 수수료, 캠페인별 수동 변동 없음. 렌더링은 기존 .NET 애플리케이션 내에서 단일 NuGet 패키지로 실행됩니다.

실제 적용 사례

1. 캠페인 트리거가 수신자와 그들의 프로필을 식별합니다

생성은 예약된 캠페인 작업이 대상 세그먼트를 위해 실행될 때, 사용자가 라이프사이클의 이정표에 도달할 때(마지막 구매 후 30일, 체험판 14일째, 공백 후 첫 로그인), 또는 영업 사원이 CRM에서 특정 잠재 고객을 위해 남기고 갈 제안을 생성할 때 촉발됩니다. 세 가지 경로 모두 동일한 입력을 생성합니다: 고객 ID와 캠페인을 트리거한 컨텍스트입니다.

애플리케이션은 고객 데이터베이스에서 수신자의 프로필을 가져옵니다. 이름, 세그먼트 레이블, 구매 이력, 제품 선호도, 충성도 등급, 그리고 제안과 관련된 모든 행동 신호 등이 포함됩니다. 여행 고객의 탐색한 목적지, 전자상거래 쇼핑객의 가장 최근 카테고리, SaaS 체험판 사용자의 가장 사용한 기능들. 이 데이터는 문서를 일반적이기보다 특정하게 느끼게 만듭니다.

2. 세분화 로직이 템플릿과 콘텐츠를 선택합니다

템플릿 선택자는 고객의 세그먼트와 속성을 템플릿 변형에 매핑합니다. 높은 지출 충성도 고객은 가장 높은 할인 등급과 '가치 있는 회원' 톤을 가진 프리미엄 템플릿을 받습니다. 가격 민감한 세그먼트는 다른 제목과 가치 제안을 가진 예산 친화적인 변형을 받습니다. 휴면 고객은 회복 프레임을 받습니다.

제품 추천, 제공 퍼센트, 만료 날짜 및 교환 코드가 이 단계에서 계산되며, 이는 고객의 선호도 모델, 충성도 등급, 캠페인 구성에서 도출됩니다. 고유한 교환 코드 또는 추적 URL은 제안이 교환될 때 수신자로의 귀속을 위한 특정 문서에 연결됩니다.

예를 들어:

예산 제안 예시 템플릿

HTML 입력 템플릿 1

표준 제안 예시 템플릿

HTML 입력 템플릿 2

프리미엄 제안 예시 템플릿

HTML 입력 템플릿 3

3. 템플릿이 PDF 변환을 위해 HTML로 채워지고 렌더링됩니다

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 라이브러리로 생성된 두 개의 PDF 제안

여러 개의 생성된 PDF 예제 각 렌더링된 PDF는 캠페인 디렉토리 아래 고객 ID로 저장되어 아웃바운드 이메일에 첨부하거나, 맞춤형 랜딩 페이지의 다운로드 링크로 제공되거나, 인쇄물로 판매 대리인에게 전달할 준비가 됩니다. 캠페인 분석은 어떤 코드가 사용되었는지를 추적하여 각 수신자가 받은 특정 제안 문서로 귀결시킵니다.

실제 이점

대규모 개인화. 각 수신자는 자신의 데이터, 세그먼트, 행동, 구매 이력, 충성도 등급을 바탕으로 제작된 문서를 받습니다. 동일한 파이프라인은 열 명의 잠재고객 목록이나 50,000명의 캠페인 세그먼트를 처리합니다.

유형적 형식. PDF는 다운로드 폴더에 저장되어 동료에게 전송되거나 인쇄되어 게시됩니다. 이메일 본문 텍스트와는 달리 지속되며, 추가 노력을 들이지 않고 오퍼의 수명을 연장합니다.

마케팅 민첩성. 마케팅 또는 디자인 팀이 직접 HTML과 CSS 템플릿을 수정하여 이미지 업데이트, 카피 수정, 새로운 레이아웃을 적용합니다. 변경 사항은 엔지니어링 배포 없이 다음 렌더에 바로 적용됩니다.

배출입. 각 수신자에 대해 고유한 사용 코드나 추적 URL이 내장되어 사용자가 받은 특정 문서로 전환을 연결합니다. 캠페인 성능은 집계된 클릭률에 의해 추론되지 않으며, 개별 제안으로 추적 가능합니다.

세그먼트 유연성. 새로운 세그먼트를 추가하는 것은 새로운 템플릿 변형을 추가하거나 선택자 로직을 조정하는 것을 의미합니다. 생성 파이프라인은 변경되지 않습니다. 엔지니어링은 새로운 고객 등급이나 캠페인 테마를 지원하기 위해 아무 것도 다시 만들 필요가 없습니다.

문서당 비용은 없습니다. 렌더링은 프로세스 내에서 실행됩니다. 제3자 개인화 API가 없고, 수신자 당 요금이 없으며, 대규모 캠페인 실행을 처벌하는 가격 모델이 없습니다.

마무리

개인화된 PDF 자료는 고객이 실제로 반응하는 것—그들에게 특별히 관련성이 있다고 느껴지는 것—과 이메일보다 더 멀리 가는 형식의 교차점입니다. 정적 폭발과 각 수신자에 맞춘 문서 사이의 차이는 별도의 플랫폼이 아닌 데이터 파이프라인과 템플릿입니다.

기존 .NET 캠페인 시스템 내에서 그 파이프라인을 구축하려면 템플릿 파일, 데이터 채우기 단계, 렌더 호출이 필요합니다. IronPDF는 ironpdf.com에서 C#로 PDF 생성의 전체 수명 주기를 처리하여, HTML 콘텐츠 렌더링, 저장, 보고서 생성, 스트리밍 및 문서 조작을 포함합니다. 고객 세그먼트와 캠페인 데이터를 기반으로 개인화된 자료 생성을 테스트할 준비가 되었다면, 무료 30일 체험판을 시작하고 다음 캠페인 창이 열리기 전에 실행 가능한 파이프라인을 갖추십시오.

Curtis Chau
기술 문서 작성자

커티스 차우는 칼턴 대학교에서 컴퓨터 과학 학사 학위를 취득했으며, Node.js, TypeScript, JavaScript, React를 전문으로 하는 프론트엔드 개발자입니다. 직관적이고 미적으로 뛰어난 사용자 인터페이스를 만드는 데 열정을 가진 그는 최신 프레임워크를 활용하고, 잘 구성되고 시각적으로 매력적인 매뉴얼을 제작하는 것을 즐깁니다.

커티스는 개발 분야 외에도 사물 인터넷(IoT)에 깊은 관심을 가지고 있으며, 하드웨어와 소프트웨어를 통합하는 혁신적인 방법을 연구합니다. 여가 시간에는 게임을 즐기거나 디스코드 봇을 만들면서 기술에 대한 애정과 창의성을 결합합니다.

아이언 서포트 팀

저희는 주 5일, 24시간 온라인으로 운영합니다.
채팅
이메일
전화해