跳至页脚内容
产品比较

Ghostscript GPL 与 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 渲染。 相比之下,iText提供程序化PDF创建但在现代HTML转换方面存在困难,这使得IronPDF成为需要网络标准PDF的ASP.NET MVC应用程序的更佳选择。

在 ASP.NET MVC 应用程序中创建 PDF 文档是生成报告、发票和可下载内容的常见要求。 尽管iText多年来一直是一个受欢迎的选择,但IronPDF提供了一种现代替代品,具有优越的HTML渲染能力。 本文将探讨这两种方法,以帮助您根据自己的.NET PDF 生成需求做出明智的选择。

这两个库都解决了同一个核心问题——在 .NET Web 环境中生成 PDF——但它们采用了截然不同的方法。 iText通过对象模型程序化地构建PDF文件,而IronPDF则使用完整的Chrome渲染引擎将HTML转换为PDF。了解这种架构差异是选择合适工具的关键。 微软的ASP.NET MVC 框架支持这两种集成模式,并且这两个库都可以连接到标准的控制器-操作管道中。

如何安装各个库?

在编写任何代码之前,您需要将每个库添加到您的项目中。 NuGet是 .NET 的标准包管理器,能够干净利落地处理两种安装。 对于iText,通过NuGet安装旧版包:

dotnet add package iTextSharp
dotnet add package iTextSharp
SHELL

IronPDF 也需要通过 NuGet 安装:

dotnet add package IronPdf

IronPDF 将 Chrome 渲染引擎与软件包捆绑在一起,因此您的服务器上无需额外安装浏览器。 该库开箱即用,支持 Windows、Linux、macOS 和容器环境。 安装完成后,请在应用程序启动时添加您的IronPDF 许可证密钥

您如何在MVC中使用iText生成PDF?

要在您的ASP.NET MVC应用程序中使用iText生成PDF文件,请首先通过NuGet安装该库。 iText库通过其Document类和对象模型提供了对PDF创建的低级控制。

下面的代码演示了在MVC控制器中使用iText创建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

iText的输出看起来如何?

PDF查看器显示简单文档,带有

这段代码演示了基本方法:创建一个PdfWriter到流,使用元素对象添加内容,并通过动作结果返回文件。 该实现处理生产系统所必需的资源处置模式。 对于更高级的场景,您可以配置自定义纸张尺寸、管理页面方向或添加页码

程序化方法使您可以对页面上的每个元素进行精细控制。 这种精确度在生成布局固定的文档(例如发票、证书或表格)时非常有用,因为这些文档的结构始终相同。 但是,一旦内容是动态的或由 HTML 模板驱动,它就会成为一种负担。

使用iText库进行HTML到PDF转换有哪些挑战?

虽然iText在程序化PDF创建方面表现优异,但将HTML转换为PDF面临重大挑战。 已弃用的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

iText如何处理HTML渲染?

PDF查看器显示转换自HTML的测试文档,保留了文本格式(粗体、斜体、红色内联文本)和项目符号列表,但缺少内容中提到的黄色背景,显示了XMLWorkerHelper的CSS渲染局限性

在使用 Bootstrap 布局、JavaScript 渲染内容或复杂的 CSS3 风格时,翻译的局限性就会显现出来。 常见问题包括缺少网络字体、破损的响应式布局和缺少CSS媒体类型支持。此外,iText在将HTML内容转换时在处理国际语言字符和SVG图形方面存在困难。

这些限制并非只是表面上的。 当面向客户的发票或报告由于背景颜色不显示或网格塌陷而呈现不正确时,PDF 就失去了意义。 对于维护HTML模板的团队,在iText的对象模型中重建相同布局意味着维护每个文档设计的两个版本。 这种重复操作会增加成本,并导致网页视图和 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查看器显示带有紫色渐变标题的文档,

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视图转换与手动构建相比有何不同?

ASP.NET Core Web应用程序主页的PDF渲染,显示导航菜单、欢迎标题和保留Bootstrap样式的页脚,展示网页布局如何转换为PDF格式

与此对比,iText的方法要求在代码中手动构建文档结构。 每个标题、表格单元格、字体选择和间距调整都必须用 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 请求标头以安全生成文档。

这两个库相比如何?

下表总结了iText和IronPDF在ASP.NET MVC项目中的关键差异:

iText vs. IronPDF--ASP.NET MVC的功能对比
特征 iText IronPDF
HTML到PDF渲染 有限(XMLWorker,不支持现代CSS3) 完整的Chrome引擎(CSS3、JS、Flexbox)
Razor/CSHTML 支持 没有原生支持 内置 Razor 视图渲染
线程安全 需要手动锁定 默认情况下线程安全
异步 API 没有原生异步 完全异步支持
Linux/Docker 支持 支持
许可证类型 AGPL(开源)或商业 提供免费试用的商业广告
数字签名
PDF 表单 是的(手动) 是的(来自 HTML 表单元素)

iText为程序化PDF创建提供详细控制,使其在文档结构简单且固定时成为可行的选择。 当您需要将 HTML 模板或 Razor 视图转换为具有精确渲染、完整 CSS3 支持和 JavaScript 执行的专业 PDF 文档时,IronPDF 是更强大的选择。

对于生产环境的 ASP.NET 应用程序,IronPDF 提供卓越的异步支持,并与现代 .NET 模式(包括依赖注入和中间件管道)集成。 它能够渲染Razor 视图、支持数字签名并处理复杂的布局,使其成为企业应用程序的首选。 该库还支持Blazor Server 应用程序和 PDF/A 合规性,用于归档文档。

许可和项目注意事项?

iText库为其开源版本使用AGPL许可,这要求您的应用代码也开源。 iText Group 提供专有项目的商业许可。 对于无法发布源代码的 SaaS 产品或企业内部工具而言,这种许可方面的考虑尤为重要。

IronPDF采用商业许可模式,并提供免费试用版供开发和测试使用。 许可证可根据部署环境进行扩展:开发人员、单服务器或无限部署选项。 在实施任一解决方案时,请考虑包括 Docker、Azure 和 Linux 环境在内的部署场景。

高流量场景下的性能考虑因素包括实现异步操作、适当的内存管理和缓存策略。 IronPDF的Chrome引擎为复杂HTML渲染提供了卓越的性能,而当不涉及HTML时,iText可能在简单程序化PDF生成方面更高效。 对于每分钟生成数百个 PDF 的应用程序来说,在实际负载下进行基准测试是判断哪个库适合您的基础架构的最可靠指南。

从iText迁移到IronPDF对于大多数MVC项目来说是直接的。 核心变化是用 Chrome 引擎渲染的 HTML 模板替换手动编写的文档构建代码。IronPDF 提供丰富的文档代码示例工程支持,确保过渡过程顺利进行。

下一步计划是什么?

对于需要将 HTML 转换为 PDF 并支持现代 Web 标准的新项目,IronPDF 凭借其基于 Chrome 的渲染功能提供了明显的优势。 已经使用iText进行基本PDF创建的传统项目可以继续使用现有实现,除非HTML渲染准确性成为要求。

首先使用IronPDF 的免费试用版,直接使用您现有的 Razor 视图或 HTML 模板进行测试。 请查阅完整文档API 参考,了解集成过程有多么迅速。 如果您对现有的基于iText的项目迁移有疑问或需要关于PDF内存流处理PDF/A合规性的指导,支持团队可以提供帮助。

要更全面地了解 IronPDF 与 iText 产品系列的比较情况,请参阅专门的iText 与 IronPDF 比较页面。

请注意iText是一种注册商标,其各自所有者拥有其商标。 本网站不与iText有任何从属关系、认可或赞助。 所有产品名称、徽标和品牌均为各自所有者的财产。 比较仅供参考,反映撰写时公开可用的信息。

常见问题解答

与 iTextSharp 相比,在 ASP.NET MVC 中使用 IronPDF 生成 PDF 的主要优势是什么?

与 iTextSharp 相比,IronPDF 具有更出色的 HTML 渲染能力,可以更轻松地从网页内容生成高质量的 PDF。

能否在 ASP.NET MVC 应用程序中使用 IronPDF 生成发票?

是的,IronPDF很适合在ASP.NET MVC应用程序中生成发票和其他PDF文档,因为它具有HTML到PDF的转换功能。

在易用性方面,IronPDF 的实现与 iTextSharp 相比如何?

一般认为 IronPDF 比 iTextSharp 更容易实现,特别是对于希望快速集成 PDF 生成功能而无需大量设置的开发人员而言。

IronPDF 是否支持在 ASP.NET MVC 中将复杂的网页转换为 PDF?

是的,IronPDF 擅长将复杂的网页转换为 PDF,这要归功于它先进的 HTML 渲染引擎,可以准确复制网页内容。

IronPDF 是从 ASP.NET MVC 应用程序生成可下载内容的好选择吗?

IronPDF 能够从各种网页内容中创建高质量的 PDF,因此是生成可下载内容的绝佳选择。

在生成 PDF 时,哪些场景适合使用 IronPDF?

IronPDF 非常适合需要高质量 HTML 到 PDF 转换的场景,例如从网页内容生成报告、发票或可下载文档。

与 iTextSharp 相比,IronPDF 是否能更好地支持现代网络技术?

是的,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 for .NET MVC 应用程序的主要用例包括生成报告、发票以及任何其他对 HTML 到 PDF 的准确转换至关重要的文档。

Curtis Chau
技术作家

Curtis Chau 拥有卡尔顿大学的计算机科学学士学位,专注于前端开发,精通 Node.js、TypeScript、JavaScript 和 React。他热衷于打造直观且美观的用户界面,喜欢使用现代框架并创建结构良好、视觉吸引力强的手册。

除了开发之外,Curtis 对物联网 (IoT) 有浓厚的兴趣,探索将硬件和软件集成的新方法。在空闲时间,他喜欢玩游戏和构建 Discord 机器人,将他对技术的热爱与创造力相结合。

钢铁支援团队

我们每周 5 天,每天 24 小时在线。
聊天
电子邮件
打电话给我