푸터 콘텐츠로 바로가기
제품 비교

ASP.NET MVC에서 PDF 생성: iTextSharp vs IronPDF 가이드

Full Comparison

Looking for a detailed feature-by-feature breakdown? See how IronPDF stacks up against Itext on pricing, HTML support, and licensing.

View Full Comparison

IronPDF는 Chrome 렌더링을 사용하여 CSS3 및 JavaScript를 완전히 지원하는 HTML-to-PDF 변환을 제공합니다. 반면, iTextSharp는 프로그래매틱 PDF 생성을 제공하지만 최신 HTML 변환에 어려움을 겪고 있어, 웹 표준 PDF를 필요로 하는 ASP.NET MVC 애플리케이션에는 IronPDF가 더 나은 선택입니다.

ASP.NET MVC 애플리케이션에서 PDF 문서를 생성하는 것은 보고서, 송장 및 다운로드 가능한 콘텐츠를 생성하기 위한 일반적인 요구사항입니다. 몇 년 동안 iTextSharp가 인기 있는 선택이었지만, IronPDF는 우수한 HTML 렌더링 기능을 갖춘 현대적인 대안을 제공합니다. 이 글은 .NET PDF 생성을 위한 정보에 근거한 결정을 내리는 데 도움이 되는 두 가지 접근 방식을 탐구합니다.

두 라이브러리는 .NET 웹 컨텍스트에서 PDF를 생성한다는 동일한 핵심 문제를 해결하지만, 근본적으로 다른 접근 방식을 취합니다. iTextSharp는 객체 모델을 통해 프로그램적으로 PDF를 빌드하고, IronPDF는 전체 Chrome 렌더링 엔진을 사용하여 HTML을 PDF로 변환합니다. 이 아키텍처 차이를 이해하는 것이 올바른 도구를 선택하는 열쇠입니다. Microsoft의 ASP.NET MVC 프레임워크는 두 통합 패턴을 모두 지원하며, 어느 라이브러리든 표준 컨트롤러-액션 파이프라인에 연결할 수 있습니다.

각 라이브러리는 어떻게 설치하나요?

코드를 작성하기 전에 각 라이브러리를 프로젝트에 가져와야 합니다. NuGet는 .NET의 표준 패키지 관리자이며, 두 설치를 깔끔하게 처리합니다. iTextSharp의 경우, NuGet을 통해 레거시 패키지를 설치하십시오:

dotnet add package iTextSharp
dotnet add package iTextSharp
SHELL

IronPDF의 경우, 마찬가지로 NuGet을 통해 설치하시기 바랍니다:

dotnet add package IronPdf
dotnet add package IronPdf
SHELL

IronPDF는 Chrome 렌더링 엔진을 패키지에 포함하여 서버에 추가 브라우저 설치가 필요하지 않습니다. 라이브러리는 Windows, Linux, macOS 및 컨테이너 환경을 기본적으로 지원합니다. 설치 후, 애플리케이션 시작 시 IronPDF 라이선스 키를 추가하십시오.

MVC에서 iTextSharp을 사용하여 PDF를 어떻게 생성합니까?

ASP.NET MVC 애플리케이션에서 iTextSharp을 사용하여 PDF 파일을 생성하려면, 먼저 NuGet을 통해 라이브러리를 설치해야 합니다. iTextSharp 라이브러리는 Document 클래스와 객체 모델을 통해 PDF 생성에 대한 저수준 제어를 제공합니다.

다음 코드는 MVC 컨트롤러에서 iTextSharp으로 PDF를 생성하기 위한 준비된 구현을 보여줍니다:

// Production-ready iTextSharp implementation with proper resource disposal
public class ReportController : Controller
{
    private readonly ILogger<ReportController> _logger;

    public ReportController(ILogger<ReportController> logger)
    {
        _logger = logger;
    }

    public ActionResult GeneratePDF()
    {
        try
        {
            using var memoryStream = new MemoryStream();
            using var document = new Document(PageSize.A4, 50, 50, 25, 25);
            using var writer = PdfWriter.GetInstance(document, memoryStream);

            document.Open();
            document.AddTitle("Generated Report");
            document.AddCreationDate();

            var titleFont = FontFactory.GetFont(FontFactory.HELVETICA_BOLD, 16);
            document.Add(new Paragraph("Hello World", titleFont));
            document.Add(new Paragraph("This is a PDF document created with iTextSharp"));

            var table = new PdfPTable(3);
            table.AddCell("Header 1");
            table.AddCell("Header 2");
            table.AddCell("Header 3");
            document.Add(table);

            document.Close();

            var pdfBytes = memoryStream.ToArray();
            Response.Headers.Add("Content-Disposition", "inline; filename=report.pdf");
            _logger.LogInformation("PDF generated: {Size} bytes", pdfBytes.Length);
            return File(pdfBytes, "application/pdf");
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "Error generating PDF");
            return StatusCode(500, "Error generating PDF document");
        }
    }
}
// Production-ready iTextSharp implementation with proper resource disposal
public class ReportController : Controller
{
    private readonly ILogger<ReportController> _logger;

    public ReportController(ILogger<ReportController> logger)
    {
        _logger = logger;
    }

    public ActionResult GeneratePDF()
    {
        try
        {
            using var memoryStream = new MemoryStream();
            using var document = new Document(PageSize.A4, 50, 50, 25, 25);
            using var writer = PdfWriter.GetInstance(document, memoryStream);

            document.Open();
            document.AddTitle("Generated Report");
            document.AddCreationDate();

            var titleFont = FontFactory.GetFont(FontFactory.HELVETICA_BOLD, 16);
            document.Add(new Paragraph("Hello World", titleFont));
            document.Add(new Paragraph("This is a PDF document created with iTextSharp"));

            var table = new PdfPTable(3);
            table.AddCell("Header 1");
            table.AddCell("Header 2");
            table.AddCell("Header 3");
            document.Add(table);

            document.Close();

            var pdfBytes = memoryStream.ToArray();
            Response.Headers.Add("Content-Disposition", "inline; filename=report.pdf");
            _logger.LogInformation("PDF generated: {Size} bytes", pdfBytes.Length);
            return File(pdfBytes, "application/pdf");
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "Error generating PDF");
            return StatusCode(500, "Error generating PDF document");
        }
    }
}
Imports System
Imports System.IO
Imports Microsoft.AspNetCore.Mvc
Imports Microsoft.Extensions.Logging
Imports iTextSharp.text
Imports iTextSharp.text.pdf

Public Class ReportController
    Inherits Controller

    Private ReadOnly _logger As ILogger(Of ReportController)

    Public Sub New(logger As ILogger(Of ReportController))
        _logger = logger
    End Sub

    Public Function GeneratePDF() As ActionResult
        Try
            Using memoryStream As New MemoryStream()
                Using document As New Document(PageSize.A4, 50, 50, 25, 25)
                    Using writer As PdfWriter = PdfWriter.GetInstance(document, memoryStream)
                        document.Open()
                        document.AddTitle("Generated Report")
                        document.AddCreationDate()

                        Dim titleFont As Font = FontFactory.GetFont(FontFactory.HELVETICA_BOLD, 16)
                        document.Add(New Paragraph("Hello World", titleFont))
                        document.Add(New Paragraph("This is a PDF document created with iTextSharp"))

                        Dim table As New PdfPTable(3)
                        table.AddCell("Header 1")
                        table.AddCell("Header 2")
                        table.AddCell("Header 3")
                        document.Add(table)

                        document.Close()

                        Dim pdfBytes As Byte() = memoryStream.ToArray()
                        Response.Headers.Add("Content-Disposition", "inline; filename=report.pdf")
                        _logger.LogInformation("PDF generated: {Size} bytes", pdfBytes.Length)
                        Return File(pdfBytes, "application/pdf")
                    End Using
                End Using
            End Using
        Catch ex As Exception
            _logger.LogError(ex, "Error generating PDF")
            Return StatusCode(500, "Error generating PDF document")
        End Try
    End Function
End Class
$vbLabelText   $csharpLabel

iTextSharp 출력은 어떻게 보입니까?

PDF 뷰어는 'Hello World' 제목과 'This is a PDF document created with iTextSharp'라는 부제목이 있는 간단한 문서를 흰색 배경에 표시하여 라이브러리의 기본 텍스트 및 표 형식 기능을 프로그래밍 PDF 생성으로 보여줍니다

이 코드는 기본 접근 방식을 보여줍니다: Document 인스턴스를 생성하고, 스트림에 PdfWriter를 연결하고, 요소 객체를 사용하여 내용을 추가한 후 파일을 액션 결과를 통해 반환합니다. 실행에서는 프로덕션 시스템에 필수적인 리소스 삭제 패턴을 처리합니다. 더 발전된 시나리오를 위해, 사용자 정의 용지 크기를 구성하거나, 페이지 방향을 관리하거나, 페이지 번호를 추가할 수 있습니다.

프로그래밍 방식의 접근은 페이지의 모든 요소에 대한 정밀한 제어를 제공합니다. 그러한 정밀성은 인보이스, 인증서 또는 구조가 항상 같은 양식을 사용하여 고정 레이아웃으로 생성해야 할 때 유용합니다. 그러나 콘텐츠가 동적이거나 HTML 템플릿에 의해 구동될 때는 부담이 됩니다.

iTextSharp 라이브러리를 사용하여 HTML을 PDF로 변환하는 데 어려움은 무엇입니까?

iTextSharp는 프로그래밍 방식의 PDF 생성에 탁월하지만, HTML을 PDF로 변환하는 것은 상당한 도전 과제를 제공합니다. 더 이상 사용되지 않는 HTMLWorker 클래스와 그 대체 XMLWorker는 제한된 CSS 지원을 제공하며 특히 반응형 CSSJavaScript 렌더링 콘텐츠 처리 시 현대 웹 콘텐츠와의 호환에 문제가 있습니다.

// HTML conversion with iTextSharp -- note the CSS limitations
public class HtmlToPdfController : Controller
{
    private readonly ILogger<HtmlToPdfController> _logger;

    public HtmlToPdfController(ILogger<HtmlToPdfController> logger)
    {
        _logger = logger;
    }

    public async Task<ActionResult> ConvertHtmlAsync(string htmlContent)
    {
        if (string.IsNullOrWhiteSpace(htmlContent))
            return BadRequest("HTML content is required");

        return await Task.Run(() =>
        {
            using var stream = new MemoryStream();
            using var document = new Document(PageSize.A4);
            using var writer = PdfWriter.GetInstance(document, stream);

            document.Open();

            var cssResolver = XMLWorkerHelper.GetInstance().GetDefaultCssResolver(true);
            var fontProvider = new XMLWorkerFontProvider();
            var cssAppliers = new CssAppliersImpl(fontProvider);
            var htmlContext = new HtmlPipelineContext(cssAppliers);
            htmlContext.SetTagFactory(Tags.GetHtmlTagProcessorFactory());

            // Pipeline with limited CSS3 support
            var pdf = new PdfWriterPipeline(document, writer);
            var html = new HtmlPipeline(htmlContext, pdf);
            var css = new CssResolverPipeline(cssResolver, html);

            var worker = new XMLWorker(css, true);
            var parser = new XMLParser(worker);

            using var stringReader = new StringReader(htmlContent);
            parser.Parse(stringReader);
            document.Close();

            return File(stream.ToArray(), "application/pdf", "converted.pdf");
        });
    }
}
// HTML conversion with iTextSharp -- note the CSS limitations
public class HtmlToPdfController : Controller
{
    private readonly ILogger<HtmlToPdfController> _logger;

    public HtmlToPdfController(ILogger<HtmlToPdfController> logger)
    {
        _logger = logger;
    }

    public async Task<ActionResult> ConvertHtmlAsync(string htmlContent)
    {
        if (string.IsNullOrWhiteSpace(htmlContent))
            return BadRequest("HTML content is required");

        return await Task.Run(() =>
        {
            using var stream = new MemoryStream();
            using var document = new Document(PageSize.A4);
            using var writer = PdfWriter.GetInstance(document, stream);

            document.Open();

            var cssResolver = XMLWorkerHelper.GetInstance().GetDefaultCssResolver(true);
            var fontProvider = new XMLWorkerFontProvider();
            var cssAppliers = new CssAppliersImpl(fontProvider);
            var htmlContext = new HtmlPipelineContext(cssAppliers);
            htmlContext.SetTagFactory(Tags.GetHtmlTagProcessorFactory());

            // Pipeline with limited CSS3 support
            var pdf = new PdfWriterPipeline(document, writer);
            var html = new HtmlPipeline(htmlContext, pdf);
            var css = new CssResolverPipeline(cssResolver, html);

            var worker = new XMLWorker(css, true);
            var parser = new XMLParser(worker);

            using var stringReader = new StringReader(htmlContent);
            parser.Parse(stringReader);
            document.Close();

            return File(stream.ToArray(), "application/pdf", "converted.pdf");
        });
    }
}
Imports System
Imports System.IO
Imports System.Threading.Tasks
Imports System.Web.Mvc
Imports iTextSharp.text
Imports iTextSharp.text.pdf
Imports iTextSharp.tool.xml
Imports iTextSharp.tool.xml.pipeline.css
Imports iTextSharp.tool.xml.pipeline.html
Imports iTextSharp.tool.xml.pipeline.end
Imports Microsoft.Extensions.Logging

' HTML conversion with iTextSharp -- note the CSS limitations
Public Class HtmlToPdfController
    Inherits Controller

    Private ReadOnly _logger As ILogger(Of HtmlToPdfController)

    Public Sub New(logger As ILogger(Of HtmlToPdfController))
        _logger = logger
    End Sub

    Public Async Function ConvertHtmlAsync(htmlContent As String) As Task(Of ActionResult)
        If String.IsNullOrWhiteSpace(htmlContent) Then
            Return BadRequest("HTML content is required")
        End If

        Return Await Task.Run(Function()
                                  Using stream As New MemoryStream()
                                      Using document As New Document(PageSize.A4)
                                          Using writer = PdfWriter.GetInstance(document, stream)
                                              document.Open()

                                              Dim cssResolver = XMLWorkerHelper.GetInstance().GetDefaultCssResolver(True)
                                              Dim fontProvider = New XMLWorkerFontProvider()
                                              Dim cssAppliers = New CssAppliersImpl(fontProvider)
                                              Dim htmlContext = New HtmlPipelineContext(cssAppliers)
                                              htmlContext.SetTagFactory(Tags.GetHtmlTagProcessorFactory())

                                              ' Pipeline with limited CSS3 support
                                              Dim pdf = New PdfWriterPipeline(document, writer)
                                              Dim html = New HtmlPipeline(htmlContext, pdf)
                                              Dim css = New CssResolverPipeline(cssResolver, html)

                                              Dim worker = New XMLWorker(css, True)
                                              Dim parser = New XMLParser(worker)

                                              Using stringReader As New StringReader(htmlContent)
                                                  parser.Parse(stringReader)
                                              End Using

                                              document.Close()
                                          End Using
                                      End Using
                                  End Using

                                  Return File(stream.ToArray(), "application/pdf", "converted.pdf")
                              End Function)
    End Function
End Class
$vbLabelText   $csharpLabel

iTextSharp는 HTML 렌더링을 얼마나 잘 처리합니까?

PDF 뷰어는 HTML에서 변환된 테스트 문서를 표시하는데, 텍스트 서식(굵게, 기울임꼴, 빨간색 인라인 텍스트)과 글머리 기호 목록이 보존되어 있지만 콘텐츠에서 언급된 노란색 배경이 없는 모습을 보여주며 XMLWorkerHelper의 CSS 렌더링 한계를 시연합니다

제한 사항은 Bootstrap 레이아웃, JavaScript로 렌더링된 콘텐츠, 또는 복잡한 CSS3 스타일 작업 시에 분명해집니다. 일반적인 문제는 누락된 웹 폰트, 깨진 반응형 레이아웃, CSS 미디어 타입에 대한 지원 부족 등을 포함합니다. 또한, iTextSharp은 HTML 콘텐츠를 변환할 때 국제 언어 문자 및 SVG 그래픽에 어려움을 겪습니다.

이러한 제한 사항은 단순히 겉모습의 문제가 아닙니다. 배경색이 보이지 않거나 그리드가 붕괴되어 고객에게 보여지는 인보이스나 보고서가 잘못 렌더링되면, PDF는 그 목적을 잃습니다. HTML 템플릿을 유지하는 팀의 경우, iTextSharp의 객체 모델에서 동일한 레이아웃을 재구성하는 것은 매 문서 디자인의 두 가지 버전을 유지해야 함을 의미합니다. 그 중복은 비용을 추가하고 웹 보기와 PDF 출력 사이에 드리프트를 초래합니다.

Chrome 엔진을 사용하여 HTML에서 PDF를 어떻게 생성합니까?

IronPDF는 Chrome 렌더링 엔진을 사용하여 PDF 생성을 변환하여 픽셀 완벽한 HTML에서 PDF로의 변환을 보장합니다. Visual Studio 프로젝트에서 간단한 접근 방식을 시작하려면 IronPDF NuGet 패키지를 설치하세요.

using IronPdf;

// Configure IronPDF in Program.cs (top-level statements, .NET 10)
var builder = WebApplication.CreateBuilder(args);

builder.Services.AddSingleton<ChromePdfRenderer>(_ =>
{
    var renderer = new ChromePdfRenderer();
    renderer.RenderingOptions.MarginTop = 10;
    renderer.RenderingOptions.MarginBottom = 10;
    renderer.RenderingOptions.EnableJavaScript = true;
    renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print;
    return renderer;
});

builder.Services.AddMemoryCache();
builder.Services.AddControllersWithViews();

var app = builder.Build();
app.MapControllers();
app.Run();
using IronPdf;

// Configure IronPDF in Program.cs (top-level statements, .NET 10)
var builder = WebApplication.CreateBuilder(args);

builder.Services.AddSingleton<ChromePdfRenderer>(_ =>
{
    var renderer = new ChromePdfRenderer();
    renderer.RenderingOptions.MarginTop = 10;
    renderer.RenderingOptions.MarginBottom = 10;
    renderer.RenderingOptions.EnableJavaScript = true;
    renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print;
    return renderer;
});

builder.Services.AddMemoryCache();
builder.Services.AddControllersWithViews();

var app = builder.Build();
app.MapControllers();
app.Run();
Imports IronPdf

' Configure IronPDF in Program.vb (top-level statements, .NET 10)
Dim builder = WebApplication.CreateBuilder(args)

builder.Services.AddSingleton(Function(_)
    Dim renderer = New ChromePdfRenderer()
    renderer.RenderingOptions.MarginTop = 10
    renderer.RenderingOptions.MarginBottom = 10
    renderer.RenderingOptions.EnableJavaScript = True
    renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print
    Return renderer
End Function)

builder.Services.AddMemoryCache()
builder.Services.AddControllersWithViews()

Dim app = builder.Build()
app.MapControllers()
app.Run()
$vbLabelText   $csharpLabel

Chrome 렌더링에서 기대할 수 있는 품질은 무엇입니까?

PDF 뷰어는 'Modern PDF Generation' 제목이 있는 보라색 그라데이션 헤더와 CSS3, Bootstrap 및 JavaScript 지원에 대한 부제목을 표시하여 IronPDF의 고급 CSS3 그라데이션 렌더링 기능을 시연합니다

ChromePdfRenderer는 복잡한 레이아웃을 수동으로 우회하지 않고 처리합니다. CSS Grid, Flexbox, Google Fonts의 웹 폰트, JavaScript 차트를 지원합니다. 또한 라이브러리는 동적 콘텐츠에 대한 렌더 지연을 관리하고 반응형 페이지를 위한 뷰포트 구성을 지원합니다. 완전한 구성 옵션은 렌더링 옵션 참조문서를 참조하세요.

ASP.NET MVC에서 Razor 뷰를 PDF로 어떻게 변환합니까?

IronPDF는 Razor 엔진 뷰 렌더링 기능에서 두드러집니다. 전체 Razor 뷰를 ViewBag, ViewData 및 모델 바인딩에 대한 완벽한 지원과 함께 PDF로 직접 변환할 수 있습니다. 다음 예제는 서버 측에서 인보이스 뷰를 렌더링하고 이를 다운로드 가능한 PDF로 반환합니다:

// Production-ready Razor view to PDF
public class InvoiceController : Controller
{
    private readonly ChromePdfRenderer _pdfRenderer;
    private readonly IInvoiceService _invoiceService;
    private readonly IRazorViewToStringRenderer _razorRenderer;

    public InvoiceController(
        ChromePdfRenderer pdfRenderer,
        IInvoiceService invoiceService,
        IRazorViewToStringRenderer razorRenderer)
    {
        _pdfRenderer = pdfRenderer;
        _invoiceService = invoiceService;
        _razorRenderer = razorRenderer;
    }

    [HttpGet]
    public async Task<IActionResult> DownloadInvoiceAsync(int id)
    {
        var invoice = await _invoiceService.GetInvoiceAsync(id);
        if (invoice == null) return NotFound();

        var htmlContent = await _razorRenderer.RenderViewToStringAsync(
            "Invoice/InvoiceTemplate", invoice);

        var renderOptions = new ChromePdfRenderOptions
        {
            PaperSize = PdfPaperSize.A4,
            MarginTop = 20,
            MarginBottom = 20,
            PrintHtmlBackgrounds = true,
            CreatePdfFormsFromHtml = true
        };

        var pdf = await Task.Run(() =>
            _pdfRenderer.RenderHtmlAsPdf(htmlContent, renderOptions));

        pdf.MetaData.Title = $"Invoice-{invoice.InvoiceNumber}";
        pdf.MetaData.Subject = $"Invoice for {invoice.CustomerName}";

        var fileName = $"Invoice-{invoice.InvoiceNumber}-{DateTime.UtcNow:yyyyMMdd}.pdf";
        return File(pdf.BinaryData, "application/pdf", fileName);
    }
}
// Production-ready Razor view to PDF
public class InvoiceController : Controller
{
    private readonly ChromePdfRenderer _pdfRenderer;
    private readonly IInvoiceService _invoiceService;
    private readonly IRazorViewToStringRenderer _razorRenderer;

    public InvoiceController(
        ChromePdfRenderer pdfRenderer,
        IInvoiceService invoiceService,
        IRazorViewToStringRenderer razorRenderer)
    {
        _pdfRenderer = pdfRenderer;
        _invoiceService = invoiceService;
        _razorRenderer = razorRenderer;
    }

    [HttpGet]
    public async Task<IActionResult> DownloadInvoiceAsync(int id)
    {
        var invoice = await _invoiceService.GetInvoiceAsync(id);
        if (invoice == null) return NotFound();

        var htmlContent = await _razorRenderer.RenderViewToStringAsync(
            "Invoice/InvoiceTemplate", invoice);

        var renderOptions = new ChromePdfRenderOptions
        {
            PaperSize = PdfPaperSize.A4,
            MarginTop = 20,
            MarginBottom = 20,
            PrintHtmlBackgrounds = true,
            CreatePdfFormsFromHtml = true
        };

        var pdf = await Task.Run(() =>
            _pdfRenderer.RenderHtmlAsPdf(htmlContent, renderOptions));

        pdf.MetaData.Title = $"Invoice-{invoice.InvoiceNumber}";
        pdf.MetaData.Subject = $"Invoice for {invoice.CustomerName}";

        var fileName = $"Invoice-{invoice.InvoiceNumber}-{DateTime.UtcNow:yyyyMMdd}.pdf";
        return File(pdf.BinaryData, "application/pdf", fileName);
    }
}
Imports System
Imports System.Threading.Tasks
Imports Microsoft.AspNetCore.Mvc

' Production-ready Razor view to PDF
Public Class InvoiceController
    Inherits Controller

    Private ReadOnly _pdfRenderer As ChromePdfRenderer
    Private ReadOnly _invoiceService As IInvoiceService
    Private ReadOnly _razorRenderer As IRazorViewToStringRenderer

    Public Sub New(pdfRenderer As ChromePdfRenderer, invoiceService As IInvoiceService, razorRenderer As IRazorViewToStringRenderer)
        _pdfRenderer = pdfRenderer
        _invoiceService = invoiceService
        _razorRenderer = razorRenderer
    End Sub

    <HttpGet>
    Public Async Function DownloadInvoiceAsync(id As Integer) As Task(Of IActionResult)
        Dim invoice = Await _invoiceService.GetInvoiceAsync(id)
        If invoice Is Nothing Then Return NotFound()

        Dim htmlContent = Await _razorRenderer.RenderViewToStringAsync("Invoice/InvoiceTemplate", invoice)

        Dim renderOptions As New ChromePdfRenderOptions With {
            .PaperSize = PdfPaperSize.A4,
            .MarginTop = 20,
            .MarginBottom = 20,
            .PrintHtmlBackgrounds = True,
            .CreatePdfFormsFromHtml = True
        }

        Dim pdf = Await Task.Run(Function() _pdfRenderer.RenderHtmlAsPdf(htmlContent, renderOptions))

        pdf.MetaData.Title = $"Invoice-{invoice.InvoiceNumber}"
        pdf.MetaData.Subject = $"Invoice for {invoice.CustomerName}"

        Dim fileName = $"Invoice-{invoice.InvoiceNumber}-{DateTime.UtcNow:yyyyMMdd}.pdf"
        Return File(pdf.BinaryData, "application/pdf", fileName)
    End Function
End Class
$vbLabelText   $csharpLabel

Razor 뷰 변환은 수동 빌드와 어떻게 비교됩니까?

ASP.NET Core 웹 응용 프로그램 홈페이지의 네비게이션 메뉴, 환영 제목, Bootstrap 스타일링이 보존된 푸터를 보여주는 PDF 렌더링, 웹 페이지 레이아웃이 PDF 형식으로 번역되는 방식을 보여줍니다

iTextSharp의 접근 방식과 대비됩니다. 이는 코드에서 문서 구조를 수동으로 빌드해야 합니다. 모든 헤딩, 테이블 셀, 폰트 선택 및 간격 조정은 C# 객체로 표현되어야 합니다. 브라우저에서 반복할 HTML 템플릿이 없습니다; 모든 변경은 PDF 출력에 대해 컴파일-검사 주기를 요구합니다.

IronPDF의 Razor 통합은 기존의 Razor 뷰, HTML 파일 또는 HTML 문자열을 PDF 생성에 재사용할 수 있게 합니다. HTML ZIP 파일을 사용하거나 자산 로드를 위한 기본 URL 구성을 구현할 수도 있습니다. CSHTML을 PDF로 변환하는 방법 안내서는 의존성 주입 설정을 포함한 전체 Razor 렌더링 패턴을 안내합니다.

파일 다운로드 및 스트리밍을 처리하여 PDF를 어떻게 생성합니까?

두 라이브러리는 웹 애플리케이션의 PDF 파일에 대한 다양한 출력 방법을 지원합니다. IronPDF는 PDF 압축, 빠른 웹 보기를 위한 직렬화, 이미지로의 래스터화 같은 추가 기능을 제공합니다. 아래의 스트리밍 컨트롤러는 캐싱과 범위 요청 지원을 통해 대용량 PDF를 처리하는 방법을 시연합니다:

// Streaming controller for large PDFs
public class StreamingPdfController : Controller
{
    private readonly ChromePdfRenderer _ironPdfRenderer;
    private readonly IMemoryCache _cache;

    public StreamingPdfController(ChromePdfRenderer ironPdfRenderer, IMemoryCache cache)
    {
        _ironPdfRenderer = ironPdfRenderer;
        _cache = cache;
    }

    [HttpGet]
    public async Task<IActionResult> StreamLargePdf(string reportId)
    {
        var cacheKey = $"pdf_stream_{reportId}";
        if (_cache.TryGetValue<byte[]>(cacheKey, out var cachedPdf))
            return File(cachedPdf, "application/pdf", $"report_{reportId}.pdf");

        Response.ContentType = "application/pdf";
        Response.Headers.Add("Content-Disposition",
            $"attachment; filename=large_report_{reportId}.pdf");

        await using var stream = Response.BodyWriter.AsStream();
        var html = await GenerateLargeHtmlReport(reportId);
        var pdf = _ironPdfRenderer.RenderHtmlAsPdf(html);
        pdf.SaveAs(stream);

        if (pdf.BinaryData.Length < 10_000_000)
            _cache.Set(cacheKey, pdf.BinaryData, TimeSpan.FromMinutes(30));

        return new EmptyResult();
    }

    [HttpGet]
    public IActionResult DownloadWithRangeSupport(string documentId)
    {
        var pdfBytes = GetPdfBytes(documentId);
        return File(pdfBytes, "application/pdf",
            $"document_{documentId}.pdf", enableRangeProcessing: true);
    }
}
// Streaming controller for large PDFs
public class StreamingPdfController : Controller
{
    private readonly ChromePdfRenderer _ironPdfRenderer;
    private readonly IMemoryCache _cache;

    public StreamingPdfController(ChromePdfRenderer ironPdfRenderer, IMemoryCache cache)
    {
        _ironPdfRenderer = ironPdfRenderer;
        _cache = cache;
    }

    [HttpGet]
    public async Task<IActionResult> StreamLargePdf(string reportId)
    {
        var cacheKey = $"pdf_stream_{reportId}";
        if (_cache.TryGetValue<byte[]>(cacheKey, out var cachedPdf))
            return File(cachedPdf, "application/pdf", $"report_{reportId}.pdf");

        Response.ContentType = "application/pdf";
        Response.Headers.Add("Content-Disposition",
            $"attachment; filename=large_report_{reportId}.pdf");

        await using var stream = Response.BodyWriter.AsStream();
        var html = await GenerateLargeHtmlReport(reportId);
        var pdf = _ironPdfRenderer.RenderHtmlAsPdf(html);
        pdf.SaveAs(stream);

        if (pdf.BinaryData.Length < 10_000_000)
            _cache.Set(cacheKey, pdf.BinaryData, TimeSpan.FromMinutes(30));

        return new EmptyResult();
    }

    [HttpGet]
    public IActionResult DownloadWithRangeSupport(string documentId)
    {
        var pdfBytes = GetPdfBytes(documentId);
        return File(pdfBytes, "application/pdf",
            $"document_{documentId}.pdf", enableRangeProcessing: true);
    }
}
Imports System
Imports System.Threading.Tasks
Imports Microsoft.AspNetCore.Mvc
Imports Microsoft.Extensions.Caching.Memory

' Streaming controller for large PDFs
Public Class StreamingPdfController
    Inherits Controller

    Private ReadOnly _ironPdfRenderer As ChromePdfRenderer
    Private ReadOnly _cache As IMemoryCache

    Public Sub New(ironPdfRenderer As ChromePdfRenderer, cache As IMemoryCache)
        _ironPdfRenderer = ironPdfRenderer
        _cache = cache
    End Sub

    <HttpGet>
    Public Async Function StreamLargePdf(reportId As String) As Task(Of IActionResult)
        Dim cacheKey = $"pdf_stream_{reportId}"
        Dim cachedPdf As Byte() = Nothing

        If _cache.TryGetValue(cacheKey, cachedPdf) Then
            Return File(cachedPdf, "application/pdf", $"report_{reportId}.pdf")
        End If

        Response.ContentType = "application/pdf"
        Response.Headers.Add("Content-Disposition", $"attachment; filename=large_report_{reportId}.pdf")

        Await Using stream = Response.BodyWriter.AsStream()
            Dim html = Await GenerateLargeHtmlReport(reportId)
            Dim pdf = _ironPdfRenderer.RenderHtmlAsPdf(html)
            pdf.SaveAs(stream)

            If pdf.BinaryData.Length < 10000000 Then
                _cache.Set(cacheKey, pdf.BinaryData, TimeSpan.FromMinutes(30))
            End If
        End Using

        Return New EmptyResult()
    End Function

    <HttpGet>
    Public Function DownloadWithRangeSupport(documentId As String) As IActionResult
        Dim pdfBytes = GetPdfBytes(documentId)
        Return File(pdfBytes, "application/pdf", $"document_{documentId}.pdf", enableRangeProcessing:=True)
    End Function
End Class
$vbLabelText   $csharpLabel

고급 시나리오에서 IronPDF는 병렬 PDF 생성, 멀티 스레드 처리 및 일괄 작업을 지원합니다. 사용자 정의 로깅을 구현하고, 네트워크 인증을 처리하며, 쿠키를 사용하고 안전한 문서 생성을 위해 HTTP 요청 헤더를 추가할 수 있습니다.

두 라이브러리를 나란히 비교하면 어떻습니까?

아래 표는 iTextSharp과 IronPDF의 ASP.NET MVC 프로젝트에 대한 주요 차이점을 요약합니다:

iTextSharp vs. IronPDF -- ASP.NET MVC를 위한 기능 비교
특징 iTextSharp IronPDF
HTML-을 PDF로 렌더링 제한적 (XMLWorker, 현대 CSS3 없음) 전체 Chrome 엔진 (CSS3, JS, Flexbox)
Razor / CSHTML 지원 네이티브 지원 없음 내장 Razor 뷰 렌더링
스레드 안전성 수동 잠금 필요 기본적으로 스레드 안전성
비동기 API 네이티브 비동기 없음 완전한 비동기 지원
리눅스 / Docker 지원됨 지원됨
라이선스 유형 AGPL (오픈 소스) 또는 상업적 무료 체험 제공 상업용
디지털 서명
PDF 양식 예 (수동) 예 (HTML 폼 요소에서)

iTextSharp는 프로그래밍적 PDF 생성을 위한 세밀한 제어를 제공하며, 문서 구조가 간단하고 고정되어 있을 때 유용한 옵션이 됩니다. IronPDF는 HTML 템플릿이나 Razor 뷰를 정확하게 렌더링하여 전문적인 PDF 문서로 변환해야 할 때 더 강력한 선택입니다. 이는 전체 CSS3 지원과 JavaScript 실행을 포함합니다.

생산용 ASP.NET 애플리케이션에서는 IronPDF가 뛰어난 비동기 지원과 의존성 주입 및 미들웨어 파이프라인을 포함한 현대 .NET 패턴과의 통합을 제공합니다. Razor 뷰를 렌더링하고, 디지털 서명을 지원하며, 복잡한 레이아웃을 처리할 수 있는 기능은 Enterprise 애플리케이션에 선호되는 선택이 되게 합니다. 이 라이브러리는 Blazor 서버 애플리케이션과 문서 아카이브를 위한 PDF/A 준수를 지원합니다.

라이센스 및 프로젝트 고려 사항은?

iTextSharp 라이브러리는 오픈 소스 버전에 대해 AGPL 라이센스를 사용하며, 이는 애플리케이션 코드 역시 오픈 소스여야 함을 요구합니다. 상업적인 라이센스는 독점 프로젝트를 위해 iText Group으로부터 제공됩니다. 이 라이센싱 고려 사항은 소스 코드를 공개할 수 없는 SaaS 제품이나 내부 Enterprise 도구에 특히 중요합니다.

IronPDF는 개발 및 테스트를 위한 무료 체험판이 포함된 상업적 라이센싱 모델을 사용합니다. 라이센스는 배포 환경에 따라 확장됩니다: 개발자, 단일 서버, 또는 무제한 배포 옵션. 두 가지 솔루션을 구현할 때는 Docker, Azure, Linux 환경을 포함한 배포 시나리오를 고려하십시오.

고트래픽 시나리오를 위한 성능 고려 사항에는 비동기 작업 구현, 적절한 메모리 관리 및 캐싱 전략 포함이 있습니다. IronPDF의 Chrome 엔진은 복잡한 HTML 렌더링에 뛰어난 성능을 제공하며, iTextSharp는 HTML 없이 간단한 프로그래밍적 PDF 생성에 더 효과적일 수 있습니다. 분당 수백 건의 PDF를 생성하는 애플리케이션의 경우, 현실적인 부하 아래에서의 벤치마크가 어떤 라이브러리가 인프라에 적합한지를 가장 신뢰할 수 있게 안내합니다.

iTextSharp에서 IronPDF로의 마이그레이션은 대부분의 MVC 프로젝트에 대해 간단합니다. 핵심 변경 사항은 Chrome 엔진에 의해 렌더링된 HTML 템플릿으로 수동 문서 빌딩 코드를 대체하는 것입니다. IronPDF는 원활한 전환을 위한 광범위한 문서, 코드 예시, 및 엔지니어링 지원을 제공합니다.

다음 단계는 무엇입니까?

최신 웹 표준 지원과 함께 HTML을 PDF로 변환해야 하는 새로운 프로젝트에 대해, IronPDF는 Chrome 기반 렌더링을 통해 분명한 이점을 제공합니다. 기본 PDF 생성을 위해 이미 iTextSharp를 사용하고 있는 레거시 프로젝트는 HTML 렌더링 정확성 요구가 생기지 않는 한 기존 구현으로 계속 진행할 수 있습니다.

IronPDF의 무료 체험판을 통해 시작하고 기존 Razor 뷰나 HTML 템플릿으로 직접 테스트하십시오. 전체 문서API 참조를 탐색하여 통합이 얼마나 빨리 이루어지는지 확인하십시오. 기존 iTextSharp 기반 프로젝트를 마이그레이션하는 것에 대해 질문이 있거나 PDF 메모리 스트림 처리PDF/A 준수에 대한 지침이 필요한 경우 지원 팀에 문의하십시오.

IronPDF와 iText 제품군을 비교하는 방법에 대한 포괄적인 견해는 전용 iText 대 IronPDF 비교 페이지를 참조하십시오.

참고해 주세요iTextSharp는 해당 소유자의 등록 상표입니다. 이 사이트는 iTextSharp과 제휴하거나 승인받지 않았으며, 후원을 받지 않습니다. 모든 제품 이름, 로고 및 브랜드는 각 소유주의 자산입니다. 비교는 정보 제공 목적으로만 사용되며, 작성 시점에 공개적으로 이용 가능한 정보를 반영합니다.

자주 묻는 질문

ASP.NET MVC에서 PDF 생성을 위해 IronPDF를 사용하는 주요 장점은 무엇인가요?

IronPDF는 iTextSharp에 비해 뛰어난 HTML 렌더링 기능을 제공하여 웹 콘텐츠로부터 고품질 PDF를 쉽게 생성할 수 있습니다.

ASP.NET MVC 애플리케이션에서 IronPDF를 사용하여 송장을 생성할 수 있나요?

네, IronPDF는 HTML에서 PDF로의 변환 기능 덕분에 ASP.NET MVC 애플리케이션에서 송장 및 기타 PDF 문서를 생성하는 데 매우 적합합니다.

사용 용이성 측면에서 IronPDF의 구현은 iTextSharp과 어떻게 비교되나요?

IronPDF는 일반적으로 iTextSharp보다 구현이 더 쉬운 것으로 간주되며, 특히 PDF 생성 기능을 빠르게 통합하려는 개발자에게 적합합니다.

IronPDF는 ASP.NET MVC에서 복잡한 웹 페이지를 PDF로 변환하는 것을 지원하나요?

네, IronPDF는 고급 HTML 렌더링 엔진 덕분에 복잡한 웹 페이지를 PDF로 변환하는 데 뛰어나며, 웹 콘텐츠를 정확하게 복제할 수 있습니다.

IronPDF는 ASP.NET MVC 애플리케이션에서 다운로드 가능한 콘텐츠를 생성하는 데 좋은 선택인가요?

IronPDF는 다양한 웹 콘텐츠로부터 높은 품질의 PDF를 생성할 수 있는 능력 덕분에 다운로드 가능한 콘텐츠를 생성하는 데 탁월한 선택입니다.

PDF 생성을 위해 IronPDF를 사용하는 이상적인 시나리오는 무엇인가요?

IronPDF는 리포트, 인보이스 또는 웹 콘텐츠로부터 다운로드 가능한 문서 생성과 같은 고품질 HTML을 PDF로 변환해야 하는 시나리오에 이상적입니다.

IronPDF는 iTextSharp과 비교하여 현대적인 웹 기술에 대한 더 나은 지원을 제공하나요?

네, IronPDF는 현대적인 웹 기술을 지원하도록 설계되어 iTextSharp에 비해 더 나은 호환성과 렌더링 정확성을 제공합니다.

IronPDF는 PDF 생성 시 이미지와 CSS를 어떻게 처리하나요?

IronPDF는 이미지를 고충실도로 처리하여 복잡한 레이아웃과 스타일을 포함하여 결과 PDF가 원본 HTML 콘텐츠와 가깝게 일치하도록 보장합니다.

IronPDF를 기존 ASP.NET MVC 프로젝트에 쉽게 통합할 수 있나요?

네, IronPDF는 기존 ASP.NET MVC 프로젝트에 쉽게 통합할 수 있으며, 개발자가 PDF 생성 기능을 구현할 수 있는 간단한 API를 제공합니다.

ASP.NET MVC 애플리케이션에서 IronPDF를 사용하는 주요 사용 사례는 무엇인가요?

ASP.NET MVC 애플리케이션에서 IronPDF의 주요 사용 사례로는 리포트, 인보이스, 정확한 HTML을 PDF로 변환해야 하는 기타 문서를 생성하는 것이 있습니다.

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

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

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

아이언 서포트 팀

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