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

IronPDF를 사용하여 .NET에서 PDF를 동적으로 생성하는 방법

동적 PDF 생성은 .NET 애플리케이션이 개인화된 송장, 실시간 데이터 보고서 및 맞춤형 인증서를 요구 시 생성할 수 있도록 허용됩니다. IronPDF는 HTML, CSS, JavaScript를 직접 픽셀 단위의 PDF 문서로 변환하는 Chrome 기반 렌더링 엔진을 제공하여, 저수준 PDF 내부 대신 비즈니스 로직에 집중할 수 있도록 만듭니다.

이 가이드는 .NET에서 데이터 기반 PDF를 생성하는 모든 주요 기술을 안내합니다: 라이브러리 설치, 플레이스홀더 템플릿 적용, 테이블 프로그래밍 방식 생성, 조건부 콘텐츠 블록 사용, 렌더링 전에 JavaScript 실행. 각 섹션은 작동하는 C# 코드 예제와 그 특정 전략을 사용할 때에 대한 설명을 포함하고 있습니다. 마지막으로, 애플리케이션의 특정 요구 사항에 맞춘 완전한 동적 PDF 생성 시스템을 구축할 수 있는 충분한 실무 지식을 갖출 것입니다.

다이나믹 PDF 생성 .NET Using IronPDF: 이미지 1 - IronPDF

.NET의 동적 PDF 생성이란 무엇입니까?

동적 PDF 생성은 이름, 수치, 날짜, 테이블, 차트 등 모든 콘텐츠가 고정된 레이아웃이 아닌 실시간 데이터에서 나오는 PDF 문서를 실행 중에 생성하는 것을 의미합니다. 문서 구조는 동일하게 유지될 수 있지만, 그 내용은 요청마다 바뀝니다.

이 접근 방식이 가장 큰 가치를 제공하는 시나리오는 다음과 같습니다:

  • 송장 생성 — 각 거래에 대해 품목, 합계, 세율 및 결제 조건이 다릅니다.
  • 재무 보고서 — 차트 및 요약 테이블은 하루 종일 업데이트된 데이터베이스에서 가져옵니다.
  • 인증서 및 학위 — 수령인 이름, 완료 날짜 및 과정 세부사항이 기록마다 다릅니다.
  • 법적 문서 -- 계약서는 고객 맞춤 조항과 관할 규칙을 포함합니다
  • 의료 기록 -- 환자의 인구 통계, 검사 결과, 치료 계획은 개별 형식을 요구합니다

전통적인 대안은 고정 템플릿의 라이브러리를 유지하고 각 변형마다 수작업으로 편집하는 것입니다. 문서 양이 증가하고 비즈니스 규칙이 늘어날수록 이 접근 방식은 빠르게 무너집니다. IronPDF의 HTML to PDF 변환 엔진을 사용하면 생성 로직을 한 번 작성하고 수동 개입 없이 수천 개의 올바르게 형식화되고 데이터가 정확한 PDF를 생성할 수 있습니다.

IronPDF는 Windows, Linux, macOS, Docker, Azure에서 실행되며, 동일한 API가 모든 플랫폼에서 동일하게 작동합니다. 이러한 플랫폼 간 일관성 덕분에 로컬에서 개발하고 클라우드 컨테이너에 배포할 수 있으며 플랫폼별 조정이 필요하지 않습니다. 이 라이브러리는 .NET 6 이상을 타겟으로 하고 있으며, 최신 .NET 릴리스 및 장기 지원 버전을 모두 지원합니다.

다이나믹 PDF 생성 .NET Using IronPDF: 이미지 2 - 기능

라이브러리를 설치하고 구성하는 방법

IronPDF는 NuGet 패키지로 배포되며 ASP.NET Core, Blazor, 콘솔 응용 프로그램을 포함한 .NET 6 이상 프로젝트와 통합됩니다. 패키지 관리자 콘솔 또는 .NET CLI를 통해 설치하세요:

Install-Package IronPdf
dotnet add package IronPdf
Install-Package IronPdf
dotnet add package IronPdf
SHELL

패키지가 설치되면 즉시 PDF를 생성할 수 있으며 체험판에서는 구성 파일이나 API 키가 필요하지 않습니다. IronPDF 라이선스 페이지를 방문하여 배포 모델에 맞는 계획을 선택하세요.

모든 렌더링을 위한 진입점은 ChromePdfRenderer입니다. 아래 코드 스니펫은 동적 HTML 문자열을 저장된 PDF 파일로 변환하는 데 필요한 최소 코드를 보여줍니다:

using IronPdf;

var renderer = new ChromePdfRenderer();

var customerName = "Alexandra Chen";
var orderNumber = "ORD-2025-001";
var totalAmount = 1499.99m;

var html = $"""
    <h1>Order Confirmation</h1>
    <p>Dear {customerName},</p>
    <p>Thank you for your order #{orderNumber}.</p>
    <p>Total amount: ${totalAmount:F2}</p>
    <p>Your order will be processed within 24 hours.</p>
    """;

var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("order-confirmation.pdf");

// Stream the bytes directly in a web response if needed
byte[] pdfBytes = pdf.BinaryData;
using IronPdf;

var renderer = new ChromePdfRenderer();

var customerName = "Alexandra Chen";
var orderNumber = "ORD-2025-001";
var totalAmount = 1499.99m;

var html = $"""
    <h1>Order Confirmation</h1>
    <p>Dear {customerName},</p>
    <p>Thank you for your order #{orderNumber}.</p>
    <p>Total amount: ${totalAmount:F2}</p>
    <p>Your order will be processed within 24 hours.</p>
    """;

var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("order-confirmation.pdf");

// Stream the bytes directly in a web response if needed
byte[] pdfBytes = pdf.BinaryData;
Imports IronPdf

Dim renderer As New ChromePdfRenderer()

Dim customerName As String = "Alexandra Chen"
Dim orderNumber As String = "ORD-2025-001"
Dim totalAmount As Decimal = 1499.99D

Dim html As String = $"
    <h1>Order Confirmation</h1>
    <p>Dear {customerName},</p>
    <p>Thank you for your order #{orderNumber}.</p>
    <p>Total amount: ${totalAmount:F2}</p>
    <p>Your order will be processed within 24 hours.</p>
    "

Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("order-confirmation.pdf")

' Stream the bytes directly in a web response if needed
Dim pdfBytes As Byte() = pdf.BinaryData
$vbLabelText   $csharpLabel

ChromePdfRenderer은(는) 모든 렌더링 복잡성을 내부적으로 처리합니다. 문자열 보간($"""...""")은 C# 변수를 호출 시점에 HTML에 삽입하여 템플릿을 읽기 쉽게 유지하고 간단한 경우에 대한 별도의 템플릿 라이브러리를 제거합니다.

MVC 뷰 및 Blazor 서버 프로젝트 구성을 포함한 전체 설정 안내는 IronPDF 문서를 참조하세요.

출력

다이나믹 PDF 생성 .NET Using IronPDF: 이미지 5 - PDF 출력

템플릿 기반 PDF 생성을 적용하는 방법

템플릿 기반 생성은 문서 디자인과 데이터 바인딩을 분리합니다. 디자이너는 이름이 지정된 자리 표시자({{TOKEN}})를 배치하여 HTML 레이아웃을 한 번 생성하며, 런타임 값이 표시될 곳에 해당되고, 애플리케이션은 렌더링 전에 해당 토큰을 바꿉니다. Stack Overflow의 PDF 생성 논의에서 애플리케이션 코드보다 템플릿이 더 자주 변경되는 프로젝트에 권장되는 패턴입니다.

using IronPdf;

// Reusable template -- stored in a file or database in production
var htmlTemplate = """
    <style>
        .invoice { font-family: Arial; max-width: 800px; margin: auto; }
        .header  { background: #f0f0f0; padding: 20px; }
        .label   { font-weight: bold; }
    </style>
    <div class='invoice'>
        <div class='header'>
            <h2>Invoice #{{INVOICE_NUMBER}}</h2>
            <p>Date: {{INVOICE_DATE}}</p>
        </div>
        <p>Bill to: {{CUSTOMER_NAME}}</p>
        <p class='label'>Amount due: ${{TOTAL_AMOUNT}}</p>
    </div>
    """;

var invoiceHtml = htmlTemplate
    .Replace("{{INVOICE_NUMBER}}", "INV-2025-1234")
    .Replace("{{INVOICE_DATE}}", DateTime.Now.ToString("MMM dd, yyyy"))
    .Replace("{{CUSTOMER_NAME}}", "TechCorp Industries")
    .Replace("{{TOTAL_AMOUNT}}", "5,750.00");

var renderer = new ChromePdfRenderer();

renderer.RenderingOptions.TextHeader = new TextHeaderFooter
{
    CenterText    = "Invoice",
    DrawDividerLine = true
};

var pdf = renderer.RenderHtmlAsPdf(invoiceHtml);
pdf.SaveAs("invoice.pdf");
using IronPdf;

// Reusable template -- stored in a file or database in production
var htmlTemplate = """
    <style>
        .invoice { font-family: Arial; max-width: 800px; margin: auto; }
        .header  { background: #f0f0f0; padding: 20px; }
        .label   { font-weight: bold; }
    </style>
    <div class='invoice'>
        <div class='header'>
            <h2>Invoice #{{INVOICE_NUMBER}}</h2>
            <p>Date: {{INVOICE_DATE}}</p>
        </div>
        <p>Bill to: {{CUSTOMER_NAME}}</p>
        <p class='label'>Amount due: ${{TOTAL_AMOUNT}}</p>
    </div>
    """;

var invoiceHtml = htmlTemplate
    .Replace("{{INVOICE_NUMBER}}", "INV-2025-1234")
    .Replace("{{INVOICE_DATE}}", DateTime.Now.ToString("MMM dd, yyyy"))
    .Replace("{{CUSTOMER_NAME}}", "TechCorp Industries")
    .Replace("{{TOTAL_AMOUNT}}", "5,750.00");

var renderer = new ChromePdfRenderer();

renderer.RenderingOptions.TextHeader = new TextHeaderFooter
{
    CenterText    = "Invoice",
    DrawDividerLine = true
};

var pdf = renderer.RenderHtmlAsPdf(invoiceHtml);
pdf.SaveAs("invoice.pdf");
Imports IronPdf

' Reusable template -- stored in a file or database in production
Dim htmlTemplate As String = "
    <style>
        .invoice { font-family: Arial; max-width: 800px; margin: auto; }
        .header  { background: #f0f0f0; padding: 20px; }
        .label   { font-weight: bold; }
    </style>
    <div class='invoice'>
        <div class='header'>
            <h2>Invoice #{{INVOICE_NUMBER}}</h2>
            <p>Date: {{INVOICE_DATE}}</p>
        </div>
        <p>Bill to: {{CUSTOMER_NAME}}</p>
        <p class='label'>Amount due: ${{TOTAL_AMOUNT}}</p>
    </div>
    "

Dim invoiceHtml As String = htmlTemplate _
    .Replace("{{INVOICE_NUMBER}}", "INV-2025-1234") _
    .Replace("{{INVOICE_DATE}}", DateTime.Now.ToString("MMM dd, yyyy")) _
    .Replace("{{CUSTOMER_NAME}}", "TechCorp Industries") _
    .Replace("{{TOTAL_AMOUNT}}", "5,750.00")

Dim renderer As New ChromePdfRenderer()

renderer.RenderingOptions.TextHeader = New TextHeaderFooter With {
    .CenterText = "Invoice",
    .DrawDividerLine = True
}

Dim pdf = renderer.RenderHtmlAsPdf(invoiceHtml)
pdf.SaveAs("invoice.pdf")
$vbLabelText   $csharpLabel

토큰({{...}})은 데이터가 문서에 들어가는 위치를 정확히 표시하여 개발자가 아닌 사람도 템플릿을 읽을 수 있게 합니다. 템플릿을 외부 파일로 저장하면 디자이너가 애플리케이션 코드베이스를 건드리지 않고 레이아웃을 업데이트할 수 있습니다. 이 패턴에 대한 자세한 가이드는 IronPDF 템플릿 튜토리얼을 참조하세요.

다이나믹 PDF 생성 .NET Using IronPDF: 이미지 3 - 다이나믹 PDF 생성 .NET - IronPDF

데이터로부터 프로그래밍 방식으로 PDF를 구축하는 방법

문서 내용이 루프, 집계 또는 조건부 형식화에 따라 달라질 때, 코드에서 HTML 문자열을 빌드하면 가장 많은 제어권을 제공합니다. 이 접근 방식은 컴파일 시간에 로우 수를 알 수 없는 금융 및 운영 보고서에 일반적이며 형식 규칙을 고정된 템플릿에 삽입하지 않고 C#에서 직접 적용할 수 있게 합니다.

using IronPdf;
using System.Text;

var orderItems = new[]
{
    new { Product = "Premium License",  Quantity = 5, Price = 399.00m },
    new { Product = "Support Package",  Quantity = 1, Price = 299.00m },
    new { Product = "Training Session", Quantity = 2, Price = 150.00m }
};

var sb = new StringBuilder();
sb.Append("<h2>Order Summary</h2>");
sb.Append("<table style='width:100%; border-collapse:collapse;'>");
sb.Append("<tr style='background:#333; color:white;'>");
sb.Append("<th style='padding:10px;'>Product</th><th>Qty</th><th>Unit Price</th><th>Total</th>");
sb.Append("</tr>");

decimal grandTotal = 0;
foreach (var item in orderItems)
{
    var lineTotal = item.Quantity * item.Price;
    grandTotal += lineTotal;
    sb.Append($"""
        <tr>
            <td style='padding:10px;'>{item.Product}</td>
            <td style='text-align:center;'>{item.Quantity}</td>
            <td style='text-align:right;'>${item.Price:F2}</td>
            <td style='text-align:right;'>${lineTotal:F2}</td>
        </tr>
        """);
}

sb.Append($"""
    <tr style='font-weight:bold; background:#f0f0f0;'>
        <td colspan='3' style='padding:10px; text-align:right;'>Grand total:</td>
        <td style='text-align:right; padding:10px;'>${grandTotal:F2}</td>
    </tr>
    """);
sb.Append("</table>");

var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(sb.ToString());

pdf.SaveAs("order-summary.pdf");

// Get bytes for a web download response
byte[] pdfData = pdf.BinaryData;
using IronPdf;
using System.Text;

var orderItems = new[]
{
    new { Product = "Premium License",  Quantity = 5, Price = 399.00m },
    new { Product = "Support Package",  Quantity = 1, Price = 299.00m },
    new { Product = "Training Session", Quantity = 2, Price = 150.00m }
};

var sb = new StringBuilder();
sb.Append("<h2>Order Summary</h2>");
sb.Append("<table style='width:100%; border-collapse:collapse;'>");
sb.Append("<tr style='background:#333; color:white;'>");
sb.Append("<th style='padding:10px;'>Product</th><th>Qty</th><th>Unit Price</th><th>Total</th>");
sb.Append("</tr>");

decimal grandTotal = 0;
foreach (var item in orderItems)
{
    var lineTotal = item.Quantity * item.Price;
    grandTotal += lineTotal;
    sb.Append($"""
        <tr>
            <td style='padding:10px;'>{item.Product}</td>
            <td style='text-align:center;'>{item.Quantity}</td>
            <td style='text-align:right;'>${item.Price:F2}</td>
            <td style='text-align:right;'>${lineTotal:F2}</td>
        </tr>
        """);
}

sb.Append($"""
    <tr style='font-weight:bold; background:#f0f0f0;'>
        <td colspan='3' style='padding:10px; text-align:right;'>Grand total:</td>
        <td style='text-align:right; padding:10px;'>${grandTotal:F2}</td>
    </tr>
    """);
sb.Append("</table>");

var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(sb.ToString());

pdf.SaveAs("order-summary.pdf");

// Get bytes for a web download response
byte[] pdfData = pdf.BinaryData;
Imports IronPdf
Imports System.Text

Dim orderItems = New() {
    New With {.Product = "Premium License", .Quantity = 5, .Price = 399.0D},
    New With {.Product = "Support Package", .Quantity = 1, .Price = 299.0D},
    New With {.Product = "Training Session", .Quantity = 2, .Price = 150.0D}
}

Dim sb = New StringBuilder()
sb.Append("<h2>Order Summary</h2>")
sb.Append("<table style='width:100%; border-collapse:collapse;'>")
sb.Append("<tr style='background:#333; color:white;'>")
sb.Append("<th style='padding:10px;'>Product</th><th>Qty</th><th>Unit Price</th><th>Total</th>")
sb.Append("</tr>")

Dim grandTotal As Decimal = 0
For Each item In orderItems
    Dim lineTotal = item.Quantity * item.Price
    grandTotal += lineTotal
    sb.Append($"
        <tr>
            <td style='padding:10px;'>{item.Product}</td>
            <td style='text-align:center;'>{item.Quantity}</td>
            <td style='text-align:right;'>${item.Price:F2}</td>
            <td style='text-align:right;'>${lineTotal:F2}</td>
        </tr>
        ")
Next

sb.Append($"
    <tr style='font-weight:bold; background:#f0f0f0;'>
        <td colspan='3' style='padding:10px; text-align:right;'>Grand total:</td>
        <td style='text-align:right; padding:10px;'>${grandTotal:F2}</td>
    </tr>
    ")
sb.Append("</table>")

Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf(sb.ToString())

pdf.SaveAs("order-summary.pdf")

' Get bytes for a web download response
Dim pdfData As Byte() = pdf.BinaryData
$vbLabelText   $csharpLabel

StringBuilder은(는) 큰 HTML 문자열을 효율적으로 처리합니다. foreach 루프는 데이터 소스가 제공하는 만큼의 행으로 확장되며 실행 중인 grandTotal 계산은 비즈니스 로직이 HTML 구성과 자연스럽게 통합되는 방식을 보여줍니다. 매우 큰 데이터 세트의 경우, 이 접근 방식은 IronPDF의 다중 페이지 렌더링 옵션과 잘 어울립니다.

출력

다이나믹 PDF 생성 .NET Using IronPDF: 이미지 7 - HTML에서 PDF로 출력

여러 페이지에 걸쳐 있는 동적 테이블을 처리하는 방법

데이터베이스에서 생성된 보고서에는 종종 예측할 수 없는 행 수가 포함됩니다. 페이지 나누기가 행을 자르지 않게 올바로 처리하려면 IronPDF의 렌더링 옵션과 함께 특정 CSS가 필요합니다. page-break-inside: avoid 규칙은 정확한 여백 설정과 결합하여 표가 페이지를 넘어서 흐르면서 각 행을 온전하게 유지합니다.

using IronPdf;

var salesData = Enumerable.Range(1, 30).Select(i => new
{
    Month   = $"Month {i}",
    Revenue = 10_000 + (i * 500),
    Growth  = 2.5 + (i * 0.3)
});

var tableHtml = """
    <style>
        table { width: 100%; border-collapse: collapse; page-break-inside: auto; }
        th    { background: #2c3e50; color: white; padding: 12px; }
        td    { padding: 8px; border-bottom: 1px solid #ddd; }
        tr:nth-child(even) { background: #f9f9f9; }
        tr    { page-break-inside: avoid; page-break-after: auto; }
    </style>
    <h2>Sales Performance Report</h2>
    <table>
        <thead><tr><th>Period</th><th>Revenue</th><th>Growth %</th></tr></thead>
        <tbody>
    """;

foreach (var row in salesData)
{
    tableHtml += $"""
        <tr>
            <td>{row.Month}</td>
            <td>${row.Revenue:N0}</td>
            <td>{row.Growth:F1}%</td>
        </tr>
        """;
}

tableHtml += "</tbody></table>";

var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.PaperSize   = IronPdf.Rendering.PdfPaperSize.A4;
renderer.RenderingOptions.MarginTop    = 40;
renderer.RenderingOptions.MarginBottom = 40;

renderer.RenderingOptions.TextFooter = new TextHeaderFooter
{
    CenterText = "{page} of {total-pages}",
    FontSize   = 10
};

var pdf = renderer.RenderHtmlAsPdf(tableHtml);
pdf.SaveAs("sales-report.pdf");
using IronPdf;

var salesData = Enumerable.Range(1, 30).Select(i => new
{
    Month   = $"Month {i}",
    Revenue = 10_000 + (i * 500),
    Growth  = 2.5 + (i * 0.3)
});

var tableHtml = """
    <style>
        table { width: 100%; border-collapse: collapse; page-break-inside: auto; }
        th    { background: #2c3e50; color: white; padding: 12px; }
        td    { padding: 8px; border-bottom: 1px solid #ddd; }
        tr:nth-child(even) { background: #f9f9f9; }
        tr    { page-break-inside: avoid; page-break-after: auto; }
    </style>
    <h2>Sales Performance Report</h2>
    <table>
        <thead><tr><th>Period</th><th>Revenue</th><th>Growth %</th></tr></thead>
        <tbody>
    """;

foreach (var row in salesData)
{
    tableHtml += $"""
        <tr>
            <td>{row.Month}</td>
            <td>${row.Revenue:N0}</td>
            <td>{row.Growth:F1}%</td>
        </tr>
        """;
}

tableHtml += "</tbody></table>";

var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.PaperSize   = IronPdf.Rendering.PdfPaperSize.A4;
renderer.RenderingOptions.MarginTop    = 40;
renderer.RenderingOptions.MarginBottom = 40;

renderer.RenderingOptions.TextFooter = new TextHeaderFooter
{
    CenterText = "{page} of {total-pages}",
    FontSize   = 10
};

var pdf = renderer.RenderHtmlAsPdf(tableHtml);
pdf.SaveAs("sales-report.pdf");
Imports IronPdf

Dim salesData = Enumerable.Range(1, 30).Select(Function(i) New With {
    .Month = $"Month {i}",
    .Revenue = 10000 + (i * 500),
    .Growth = 2.5 + (i * 0.3)
})

Dim tableHtml As String = "
    <style>
        table { width: 100%; border-collapse: collapse; page-break-inside: auto; }
        th    { background: #2c3e50; color: white; padding: 12px; }
        td    { padding: 8px; border-bottom: 1px solid #ddd; }
        tr:nth-child(even) { background: #f9f9f9; }
        tr    { page-break-inside: avoid; page-break-after: auto; }
    </style>
    <h2>Sales Performance Report</h2>
    <table>
        <thead><tr><th>Period</th><th>Revenue</th><th>Growth %</th></tr></thead>
        <tbody>
    "

For Each row In salesData
    tableHtml += $"
        <tr>
            <td>{row.Month}</td>
            <td>${row.Revenue:N0}</td>
            <td>{row.Growth:F1}%</td>
        </tr>
        "
Next

tableHtml += "</tbody></table>"

Dim renderer As New ChromePdfRenderer()
renderer.RenderingOptions.PaperSize = IronPdf.Rendering.PdfPaperSize.A4
renderer.RenderingOptions.MarginTop = 40
renderer.RenderingOptions.MarginBottom = 40

renderer.RenderingOptions.TextFooter = New TextHeaderFooter With {
    .CenterText = "{page} of {total-pages}",
    .FontSize = 10
}

Dim pdf = renderer.RenderHtmlAsPdf(tableHtml)
pdf.SaveAs("sales-report.pdf")
$vbLabelText   $csharpLabel

{page}{total-pages}은(는) 자동 바닥글 번호 매김을 위한 IronPDF의 내장 토큰입니다. 여백은 테이블이 수십 페이지에 걸쳐 펼쳐지더라도 완료 보고서에 전문적인 외관을 제공하여 모든 페이지의 내용이 가장자리에서 멀리 있도록 합니다.

병합된 셀을 포함한 복잡한 테이블 레이아웃에 대한 형식 안내는 IronPDF 렌더링 옵션 참고서를 참조하세요.

PDF에 조건부 콘텐츠를 추가하는 방법

많은 문서 유형에는 특정 조건이 참일 때만 나와야 하는 섹션이 포함되어 있습니다 -- 최상위 고객을 위한 프리미엄 배지, 프로모션 적용 시 할인 블록, 계정 연체 시 경고 등. C# 조건부 로직은 이 요구 사항과 직접 연결되며, 조건은 HTML 문자열이 빌드되기 전에 평가되므로 최종 PDF에 빈 플레이스홀더 요소가 남지 않습니다.

using IronPdf;

var customer = new
{
    Name           = "Global Tech Solutions",
    IsPremium      = true,
    HasDiscount    = true,
    DiscountPct    = 15,
    LoyaltyPoints  = 2500
};

var html = $"""<h2>Customer Profile: {customer.Name}</h2><div style='border:1px solid #ddd; padding:20px;'>""";

if (customer.IsPremium)
{
    html += """<div style='background:gold; padding:10px; margin-bottom:10px;'>PREMIUM MEMBER -- Exclusive benefits applied</div>""";
}

if (customer.HasDiscount)
{
    html += $"""<div style='background:#e8f5e9; padding:10px; margin-bottom:10px;'>Special discount: {customer.DiscountPct}% off all orders</div>""";
}

if (customer.LoyaltyPoints > 0)
{
    html += $"""<div style='background:#f3e5f5; padding:10px;'>Loyalty points balance: {customer.LoyaltyPoints:N0} points</div>""";
}

html += "</div>";

var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("customer-profile.pdf");
using IronPdf;

var customer = new
{
    Name           = "Global Tech Solutions",
    IsPremium      = true,
    HasDiscount    = true,
    DiscountPct    = 15,
    LoyaltyPoints  = 2500
};

var html = $"""<h2>Customer Profile: {customer.Name}</h2><div style='border:1px solid #ddd; padding:20px;'>""";

if (customer.IsPremium)
{
    html += """<div style='background:gold; padding:10px; margin-bottom:10px;'>PREMIUM MEMBER -- Exclusive benefits applied</div>""";
}

if (customer.HasDiscount)
{
    html += $"""<div style='background:#e8f5e9; padding:10px; margin-bottom:10px;'>Special discount: {customer.DiscountPct}% off all orders</div>""";
}

if (customer.LoyaltyPoints > 0)
{
    html += $"""<div style='background:#f3e5f5; padding:10px;'>Loyalty points balance: {customer.LoyaltyPoints:N0} points</div>""";
}

html += "</div>";

var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("customer-profile.pdf");
Imports IronPdf

Dim customer = New With {
    .Name = "Global Tech Solutions",
    .IsPremium = True,
    .HasDiscount = True,
    .DiscountPct = 15,
    .LoyaltyPoints = 2500
}

Dim html = $"<h2>Customer Profile: {customer.Name}</h2><div style='border:1px solid #ddd; padding:20px;'>"

If customer.IsPremium Then
    html += "<div style='background:gold; padding:10px; margin-bottom:10px;'>PREMIUM MEMBER -- Exclusive benefits applied</div>"
End If

If customer.HasDiscount Then
    html += $"<div style='background:#e8f5e9; padding:10px; margin-bottom:10px;'>Special discount: {customer.DiscountPct}% off all orders</div>"
End If

If customer.LoyaltyPoints > 0 Then
    html += $"<div style='background:#f3e5f5; padding:10px;'>Loyalty points balance: {customer.LoyaltyPoints:N0} points</div>"
End If

html += "</div>"

Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("customer-profile.pdf")
$vbLabelText   $csharpLabel

동일한 패턴을 관할권별 법적 고지사항, 카트 값에 의해 트리거되는 프로모션 섹션 또는 제품 범주별 안전 경고가 트리거되는 규칙 기반 콘텐츠에 적용할 수 있습니다. 결과 PDF에는 정확히 있어야 할 콘텐츠만 포함됩니다 -- 더 많지도, 더 적지도 않습니다.

출력

다이나믹 PDF 생성 .NET Using IronPDF: 이미지 8 - 다이나믹 PDF 출력

JavaScript 기반 차트를 PDF에 렌더링하는 방법

현대 대시보드는 종종 Chart.jsD3.js와 같은 JavaScript 차트 라이브러리에 의존하여 렌더링 시 그래프를 그립니다. IronPDF는 페이지를 캡처하기 전에 JavaScript를 실행할 수 있으므로 PDF 스냅샷이 찍히기 전에 차트가 완전히 렌더링됩니다. 이는 별도의 스크린샷 서비스나 서버 측 차트 렌더링 라이브러리가 필요하지 않음을 의미합니다.

using IronPdf;

var chartHtml = """
    <script src='https://cdn.jsdelivr.net/npm/chart.js'></script>
    <canvas id='revenueChart' width='500' height='250'></canvas>
    <script>
        var ctx = document.getElementById('revenueChart').getContext('2d');
        new Chart(ctx, {
            type: 'bar',
            data: {
                labels: ['Q1', 'Q2', 'Q3', 'Q4'],
                datasets: [{
                    label: 'Revenue (thousands)',
                    data: [120, 195, 230, 285],
                    backgroundColor: '#3498db'
                }]
            },
            options: { animation: false }
        });
    </script>
    """;

var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.EnableJavaScript = true;
renderer.RenderingOptions.WaitFor.RenderDelay(1500);

var pdf = renderer.RenderHtmlAsPdf(chartHtml);
pdf.SaveAs("revenue-chart.pdf");
using IronPdf;

var chartHtml = """
    <script src='https://cdn.jsdelivr.net/npm/chart.js'></script>
    <canvas id='revenueChart' width='500' height='250'></canvas>
    <script>
        var ctx = document.getElementById('revenueChart').getContext('2d');
        new Chart(ctx, {
            type: 'bar',
            data: {
                labels: ['Q1', 'Q2', 'Q3', 'Q4'],
                datasets: [{
                    label: 'Revenue (thousands)',
                    data: [120, 195, 230, 285],
                    backgroundColor: '#3498db'
                }]
            },
            options: { animation: false }
        });
    </script>
    """;

var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.EnableJavaScript = true;
renderer.RenderingOptions.WaitFor.RenderDelay(1500);

var pdf = renderer.RenderHtmlAsPdf(chartHtml);
pdf.SaveAs("revenue-chart.pdf");
Imports IronPdf

Dim chartHtml As String = "
    <script src='https://cdn.jsdelivr.net/npm/chart.js'></script>
    <canvas id='revenueChart' width='500' height='250'></canvas>
    <script>
        var ctx = document.getElementById('revenueChart').getContext('2d');
        new Chart(ctx, {
            type: 'bar',
            data: {
                labels: ['Q1', 'Q2', 'Q3', 'Q4'],
                datasets: [{
                    label: 'Revenue (thousands)',
                    data: [120, 195, 230, 285],
                    backgroundColor: '#3498db'
                }]
            },
            options: { animation: false }
        });
    </script>
    "

Dim renderer As New ChromePdfRenderer()
renderer.RenderingOptions.EnableJavaScript = True
renderer.RenderingOptions.WaitFor.RenderDelay(1500)

Dim pdf = renderer.RenderHtmlAsPdf(chartHtml)
pdf.SaveAs("revenue-chart.pdf")
$vbLabelText   $csharpLabel

EnableJavaScript = true은(는) 헤드리스 Chrome 엔진 내에서 스크립트 실행을 활성화합니다. RenderDelay(1500)은(는) 페이지가 로드된 후 1.5초 일시 중지하여 비동기 차트 렌더링이 완료되기 전에 스냅샷이 촬영되도록 합니다. Chart.js 옵션에서 animation: false을(를) 설정하면 전환 중간에 애니메이션 프레임이 캡처되는 것을 방지합니다.

이 기술은 모든 JavaScript 라이브러리와 함께 작동합니다. 서버 측 데이터를 C# 문자열 보간을 사용하여 <script> 블록에 전달할 수 있어, 모든 차트가 생성 시점의 실제 데이터베이스 수치를 반영합니다. JavaScript 구성에 대한 자세한 내용은 IronPDF의 JavaScript 렌더링 가이드를 참조하세요.

생성된 PDF를 어떻게 내보내고 전달하나요?

RenderHtmlAsPdf이(가) PdfDocument 객체를 반환하면 애플리케이션 유형에 따라 여러 배송 옵션이 있습니다. 디스크에 저장하는 것이 가장 간단한 방법이며, 백그라운드 배치 작업에 적합합니다. 웹 API 및 MVC 컨트롤러의 경우, 바이트를 직접 HTTP 응답으로 스트리밍하면 임시 파일 작성을 피하고 서버 파일 시스템을 깨끗하게 유지할 수 있습니다.

using IronPdf;
using Microsoft.AspNetCore.Mvc;

// In an ASP.NET Core controller action:
public IActionResult DownloadInvoice(int orderId)
{
    var renderer = new ChromePdfRenderer();
    var html     = BuildInvoiceHtml(orderId);   // your data-binding method
    var pdf      = renderer.RenderHtmlAsPdf(html);

    return File(pdf.BinaryData, "application/pdf", $"invoice-{orderId}.pdf");
}
using IronPdf;
using Microsoft.AspNetCore.Mvc;

// In an ASP.NET Core controller action:
public IActionResult DownloadInvoice(int orderId)
{
    var renderer = new ChromePdfRenderer();
    var html     = BuildInvoiceHtml(orderId);   // your data-binding method
    var pdf      = renderer.RenderHtmlAsPdf(html);

    return File(pdf.BinaryData, "application/pdf", $"invoice-{orderId}.pdf");
}
Imports IronPdf
Imports Microsoft.AspNetCore.Mvc

' In an ASP.NET Core controller action:
Public Function DownloadInvoice(orderId As Integer) As IActionResult
    Dim renderer = New ChromePdfRenderer()
    Dim html = BuildInvoiceHtml(orderId)   ' your data-binding method
    Dim pdf = renderer.RenderHtmlAsPdf(html)

    Return File(pdf.BinaryData, "application/pdf", $"invoice-{orderId}.pdf")
End Function
$vbLabelText   $csharpLabel

pdf.BinaryData은(는) 원시 바이트를 byte[]로 반환하며 이는 ASP.NET Core의 File() 결과와 직접 매핑됩니다. 브라우저는 올바른 MIME 유형(application/pdf)을 수신하고 의미 있는 파일 이름으로 다운로드 대화를 표시합니다.

추가 출력 기능에는 PDF 병합, 디지털 서명, PDF/A 보관 형식, 암호 보호 및 텍스트 및 이미지 추출이 포함됩니다. 이 기능들은 렌더러가 반환한 동일한 PdfDocument 객체에서 작동하므로 중간 파일을 생성하지 않고도 작업을 연결할 수 있습니다.

다이나믹 PDF 생성 .NET Using IronPDF: 이미지 9 - 라이선싱

다음 단계는 무엇입니까?

.NET에서의 동적 PDF 생성은 세 가지 빌딩 블록으로 결정됩니다: 데이터에 따라 달라지는 HTML 문자열, 해당 문자열을 PDF로 변환하는 ChromePdfRenderer, 그리고 애플리케이션에 적합한 전달 메커니즘. IronPDF는 페이지 나누기, 헤더 및 푸터, JavaScript 실행 및 크로스 플랫폼 호환성을 포함하여 그 사이의 모든 것을 처리합니다.

읽기에서 구축으로 이동하려면 패키지를 설치하고 자신의 데이터에 대해 위의 예제 중 하나를 실행하세요:

dotnet add package IronPdf
dotnet add package IronPdf
SHELL

거기에서 플랫폼별 설정(Azure, Docker, Linux), 고급 렌더링 옵션 및 전체 API 참조에 대한 IronPDF 문서를 탐색하세요. 배포할 준비가 되면 라이선스 페이지를 방문하여 생산량에 맞는 플랜을 선택하세요. 무료 체험판은 신용카드 없이도 전체 기능에 액세스할 수 있으므로, 약정 전에 구현을 검증할 수 있습니다.

동적 생성에 잘 어울리는 추가 가이드:

다이나믹 PDF 생성 .NET Using IronPDF: 이미지 6 - 크로스 플랫폼 호환성

다이나믹 PDF 생성 .NET Using IronPDF: 이미지 4 - 설치

자주 묻는 질문

동적 PDF 생성이란 무엇입니까?

동적 PDF 생성은 사전 존재하는 정적 템플릿이 아닌 실시간 데이터 입력에 기반하여 즉석에서 PDF 문서를 생성하는 것을 의미합니다.

IronPDF가 .NET에서 동적 PDF 생성에 어떻게 도움을 줄 수 있습니까?

IronPDF는 개발자가 복잡한 PDF 렌더링 대신 비즈니스 로직에 중점을 두고 HTML, 이미지 또는 기타 소스에서 PDF를 생성할 수 있도록 함으로써 동적 PDF 생성을 단순화합니다.

동적 PDF 생성을 위해 IronPDF를 사용하는 이점은 무엇입니까?

동적 PDF를 위해 IronPDF를 사용하면 개인화, 실시간 데이터 통합, .NET 애플리케이션에서 직접 PDF 문서를 생성하는 복잡성 감소를 제공합니다.

IronPDF를 사용하여 전자 상거래 플랫폼에서 개인화된 송장을 생성할 수 있습니까?

예, IronPDF는 실시간 데이터를 통합하여 전자 상거래 플랫폼에 이상적인 개인화된 송장을 동적으로 생성할 수 있습니다.

어떤 유형의 애플리케이션이 동적 PDF 생성에서 이점을 얻습니까?

전자 상거래 플랫폼, 보고 시스템, 교육 플랫폼과 같은 애플리케이션은 맞춤화된 실시간 문서를 제공하여 동적 PDF 생성에서 이점을 얻습니다.

IronPDF가 실시간 데이터로 PDF 보고서를 생성하기에 적합합니까?

물론입니다. IronPDF는 실시간 데이터를 수집하여 PDF 보고서를 생성하도록 설계되어 동적 문서 생성에 최적입니다.

IronPDF는 PDF 렌더링의 복잡성을 어떻게 처리합니까?

IronPDF는 PDF 렌더링의 복잡성을 추상화하여 개발자가 고품질 PDF를 생성하면서 애플리케이션의 비즈니스 로직에 집중할 수 있도록 합니다.

IronPDF가 교육 인증서를 동적으로 생성할 수 있습니까?

예, IronPDF는 데이터 입력을 사용하여 개인화되고 전문적인 인증서를 동적으로 생성할 수 있습니다.

IronPDF가 HTML 콘텐츠에서 PDF를 생성하는 것을 지원합니까?

IronPDF는 HTML 콘텐츠에서 PDF 생성을 지원하여 개발자가 웹 페이지나 HTML 문자열을 직접 PDF 형식으로 변환할 수 있도록 합니다.

IronPDF는 개발자의 생산성을 어떻게 향상시키나요?

IronPDF는 PDF 생성에 대한 직관적인 API를 제공하여 동적 문서를 생성하는데 필요한 시간과 노력을 줄임으로써 개발자의 생산성을 향상시킵니다.

커티스 차우
기술 문서 작성자

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

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

아이언 서포트 팀

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