跳過到頁腳內容
產品比較

在 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 提供出色的 HTML 到 PDF 轉換功能,完全支援 CSS3 和 JavaScript,並使用 Chrome 渲染。 相較之下,iTextSharp 提供了程式化的 PDF 建立功能,但在現代 HTML 轉換方面有困難,因此 IronPDF 是需要符合 Web 標準的 PDF 的 ASP.NET MVC 應用程式的更好選擇。

在 ASP.NET MVC 應用程式中建立 PDF 文件是產生報表、發票和可下載內容的常見需求。 雖然iTextSharp多年來一直很受歡迎,但IronPDF提供了一種現代化的替代方案,具有更強大的HTML 渲染功能。 本文將探討這兩種方法,以協助您根據自己的.NET PDF 產生需求做出明智的選擇。

這兩個函式庫都解決了同一個核心問題——在 .NET Web 環境中產生 PDF——但它們採用了截然不同的方法。 iTextSharp 透過物件模型以程式設計方式建立 PDF,而 IronPDF 則使用完整的 Chrome 渲染引擎將 HTML 轉換為 PDF。了解這種架構差異是選擇合適工具的關鍵。 微軟的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 支援有限,難以處理現代 Web 內容,尤其是在處理響應式 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 轉換。 安裝 IronPDF NuGet 套件,即可在 Visual Studio 專案中使用簡化的方法開始使用。

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 檢視器顯示一個文檔,其紫色漸層標題列顯示"現代 PDF 生成"標題和副標題,介紹 CSS3、Bootstrap 和 JavaScript 支持,展示了 IronPDF 的高級 CSS3 漸變渲染功能。

ChromePdfRenderer 無需手動變通即可處理複雜的佈局。 它支援 CSS Grid、Flexbox、 Google Fonts 中的 Web 字體和 JavaScript 圖表。 該程式庫還管理動態內容的渲染延遲,並支援響應式頁面的視窗配置。 有關完整的配置選項,請參閱渲染選項參考

如何在 ASP.NET MVC 中將 Razor 視圖轉換為 PDF?

IronPDF以其Razor Engine視圖渲染功能脫穎而出。 您可以將整個 Razor 視圖直接轉換為 PDF,並完全支援 ViewBag、ViewData 和模型綁定。 以下範例在伺服器端渲染發票視圖,並將其作為可下載的 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視圖轉換與手動建置相比有何不同?

此PDF渲染圖展示了ASP.NET Core Web應用程式主頁,其中包含導航選單、歡迎標題和頁腳,並保留了Bootstrap樣式,示範了網頁佈局如何轉換為PDF格式。

與之形成對比的是 iTextSharp 的方法,它需要手動在程式碼中建立文件結構。 每個標題、表格單元格、字體選擇和間距調整都必須以 C# 物件表示。 瀏覽器中沒有可供迭代的 HTML 範本; 每次更改都需要對 PDF 輸出進行編譯和檢查。

IronPDF 的 Razor 整合可讓您重複使用現有的 Razor 視圖、HTML 檔案或 HTML 字串來產生 PDF。 您也可以使用 HTML ZIP 檔案或實作用於資源載入的基本 URL 配置。 CSHTML 轉 PDF 操作指南詳細介紹了 Razor 渲染模式的完整流程,包括依賴注入設定。

如何處理檔案下載和串流以建立 PDF?

這兩個函式庫都支援 Web 應用程式中 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 生成、多執行緒處理和批次操作。 您可以實作自訂日誌記錄、處理網路驗證、使用 cookie 以及新增 HTTP 請求標頭以安全地產生文件。

這兩個庫相比如何?

下表總結了 iTextSharp 和 IronPDF 在 ASP.NET MVC 專案方面的主要差異:

iTextSharp 與 IronPDF——ASP.NET MVC 功能對比
特點 iTextSharp IronPDF
HTML轉PDF渲染 有限(XMLWorker,不支援現代CSS3) 完整的Chrome引擎(CSS3、JS、Flexbox)
Razor/CSHTML 支持 沒有原生支援 內建 Razor 視圖渲染
線程安全 需要手動鎖定 預設情況下線程安全
非同步 API 沒有原生異步 完全異步支持
Linux / Docker 支援 支援
許可證類型 AGPL(開源)或商業 提供免費試用的商業廣告
數字簽名
PDF 表單 是的(手動) 是的(來自 HTML 表單元素)

iTextSharp 為程式化建立 PDF 提供了詳細的控制,因此當文件結構簡單且固定時,它是一個可行的選擇。 當您需要將 HTML 範本或 Razor 視圖轉換為具有精確渲染、完整 CSS3 支援和 JavaScript 執行的專業 PDF 文件時,IronPDF 是更強大的選擇。

對於生產環境的 ASP.NET 應用程序,IronPDF 提供卓越的非同步支持,並與現代 .NET 模式(包括依賴注入和中間件管道)整合。 它能夠渲染Razor 視圖、支援數位簽章並處理複雜的佈局,使其成為企業應用程式的首選。 該程式庫還支援Blazor Server 應用程式和 PDF/A 合規性,用於歸檔文件。

關於授權和專案考量?

iTextSharp 函式庫的開源版本採用AGPL 許可證,因此您的應用程式程式碼也必須是開源的。 iText Group 提供專有專案的商業許可。 對於無法發布原始程式碼的 SaaS 產品或企業內部工具而言,這種授權的考量尤其重要。

IronPDF採用商業許可模式,並提供免費試用版可供開發和測試使用。 許可證可根據部署環境擴展:開發人員、單一伺服器或無限部署選項。 在實施任一解決方案時,請考慮包括 Docker、Azure 和 Linux 環境在內的部署場景。

高流量場景下的效能考量包括實現非同步操作、適當的記憶體管理和快取策略。 IronPDF 的 Chrome 引擎在複雜的 HTML 渲染方面提供了卓越的效能,而 iTextSharp 在不涉及 HTML 的簡單程式化 PDF 產生方面可能效率更高。 對於每分鐘產生數百個 PDF 的應用程式來說,在實際負載下進行基準測試是判斷哪個程式庫適合您的基礎架構的最可靠指南。

對於大多數 MVC 專案而言,從 iTextSharp 遷移到 IronPDF 非常簡單。 核心變化是用 Chrome 引擎渲染的 HTML 範本取代手動編寫的文件建置程式碼。 IronPDF 提供豐富的文件程式碼範例工程支持,確保過渡過程順利進行。

下一步計劃是什麼?

對於需要將 HTML 轉換為 PDF 並支援現代 Web 標準的新項目,IronPDF 憑藉其基於 Chrome 的渲染功能提供了明顯的優勢。 已經使用 iTextSharp 進行基本 PDF 建立的傳統專案可以繼續使用其現有實現,除非對 HTML 渲染精度有要求。

首先使用IronPDF 的免費試用版,直接使用您現有的 Razor 視圖或 HTML 範本進行測試。 請查閱完整文件API 參考,以了解整合過程有多迅速。 如果您對遷移現有的基於 iTextSharp 的專案有任何疑問,或者需要有關PDF 記憶體流處理PDF/A 合規性的指導,支援團隊可以為您提供協助。

若想更全面地了解 IronPDF 與 iText 產品系列的比較情況,請參閱專門的iText 與 IronPDF 比較頁面。

請注意iTextSharp 是其各自所有者的註冊商標。 本網站與 iTextSharp 無任何關聯、背書或贊助。所有產品名稱、標誌和品牌均為其各自所有者的財產。 比較僅供參考,反映了撰寫時的公開信息。

常見問題解答

在 ASP.NET MVC 中,使用 IronPDF 產生 PDF 相比 iTextSharp 的主要優勢是什麼?

與 iTextSharp 相比,IronPDF 具有更優越的 HTML 渲染功能,可更輕鬆地從 Web 內容產生高品質的 PDF。

我可以在 ASP.NET MVC 應用程式中使用 IronPDF 產生發票嗎?

是的,由於其 HTML 到 PDF 轉換功能,IronPDF 非常適合用於在 ASP.NET MVC 應用程式中生成發票和其他 PDF 文件。

IronPDF 的易用性與 iTextSharp 相比如何?

IronPDF 通常被認為比 iTextSharp 更容易實現,特別是對於希望快速整合 PDF 生成功能而無需進行大量設定的開發人員。

IronPDF 是否支援在 ASP.NET MVC 中將複雜的網頁轉換為 PDF?

是的,IronPDF 非常擅長將複雜的網頁轉換為 PDF,這要歸功於其先進的 HTML 渲染引擎,該引擎能夠準確地複製網頁內容。

IronPDF 是否是 ASP.NET MVC 應用程式產生可下載內容的理想選擇?

IronPDF 能夠從各種網路內容創建高品質的 PDF 文件,因此是產生可下載內容的絕佳選擇。

IronPDF最適合用於PDF產生嗎?

IronPDF 非常適合需要高品質 HTML 轉 PDF 的場景,例如從 Web 內容產生報告、發票或可下載文件。

與 iTextSharp 相比,IronPDF 對現代 Web 技術的支援是否更好?

是的,IronPDF 被設計為與現代 Web 技術配合使用,相對於 iTextSharp 提供了更好的兼容性和渲染準確性。

IronPDF在產生PDF時如何處理影像和CSS?

IronPDF 能夠高保真地處理圖像和 CSS,確保產生的 PDF 與原始 HTML 內容(包括複雜的佈局和樣式)高度匹配。

IronPDF 能否輕鬆整合到現有的 ASP.NET MVC 專案中?

是的,IronPDF 可以輕鬆整合到現有的 ASP.NET MVC 專案中,為開發人員提供簡單易用的 API 來實現 PDF 生成功能。

在 ASP.NET MVC 應用程式中使用 IronPDF 的主要用例有哪些?

IronPDF 在 ASP.NET MVC 應用程式中的主要用例包括產生報告、發票以及任何其他需要精確 HTML 到 PDF 轉換的文件。

Curtis Chau
技術作家

Curtis Chau 擁有卡爾頓大學計算機科學學士學位,專注於前端開發,擅長於 Node.js、TypeScript、JavaScript 和 React。Curtis 熱衷於創建直觀且美觀的用戶界面,喜歡使用現代框架並打造結構良好、視覺吸引人的手冊。

除了開發之外,Curtis 對物聯網 (IoT) 有著濃厚的興趣,探索將硬體和軟體結合的創新方式。在閒暇時間,他喜愛遊戲並構建 Discord 機器人,結合科技與創意的樂趣。

鋼鐵支援團隊

我們每週 5 天,每天 24 小時在線上。
聊天
電子郵件
打電話給我