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.
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
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
iText的输出看起来如何?

这段代码演示了基本方法:创建一个PdfWriter到流,使用元素对象添加内容,并通过动作结果返回文件。 该实现处理生产系统所必需的资源处置模式。 对于更高级的场景,您可以配置自定义纸张尺寸、管理页面方向或添加页码。
程序化方法使您可以对页面上的每个元素进行精细控制。 这种精确度在生成布局固定的文档(例如发票、证书或表格)时非常有用,因为这些文档的结构始终相同。 但是,一旦内容是动态的或由 HTML 模板驱动,它就会成为一种负担。
使用iText库进行HTML到PDF转换有哪些挑战?
虽然iText在程序化PDF创建方面表现优异,但将HTML转换为PDF面临重大挑战。 已弃用的XMLWorker有限的CSS支持和现代网络内容困难,尤其是在处理响应式CSS和JavaScript渲染的内容时。
// 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
iText如何处理HTML渲染?

在使用 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()
Chrome渲染能带来怎样的画质?

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

与此对比,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
对于高级场景,IronPDF 支持并行 PDF 生成、多线程处理和批量操作。 您可以实现自定义日志记录、处理网络身份验证、使用 cookie 以及添加 HTTP 请求标头以安全生成文档。
这两个库相比如何?
下表总结了iText和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 比较页面。
常见问题解答
与 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 的准确转换至关重要的文档。


