iPhone上最佳PDF閱讀器(免費和付費工具比較)
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網路環境中生成PDF文件——但它們採用了根本不同的方法。 iText透過物件模型程式化構建PDF,而IronPDF使用完整的Chrome渲染引擎將HTML轉換為PDF。理解此結構差異是選擇合適工具的關鍵。 來自Microsoft的ASP.NET MVC框架支持這兩種整合模式,任何一個程式庫都可以接入標準控制器-動作管道。
如何安裝每個程式庫?
在撰寫任何程式碼之前,您需要將每個程式庫納入您的專案。 NuGet是.NET的標準程式包管理器,可以干淨地處理兩者的安裝。 對於iText,透過NuGet安裝傳統程式包:
dotnet add package iTextSharp
dotnet add package iTextSharp
同樣可以通過NuGet安裝IronPDF:
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、來自谷歌字體的網頁字體和JavaScript圖表。 程式庫還可以管理渲染延遲以應對動態內容,支持視口配置以適應響應式頁面。 有關完整的配置選項,請參閱渲染選項參考。
如何在ASP.NET MVC中將Razor視圖轉換為PDF?
IronPDF因其Razor引擎視圖渲染能力而脫穎而出。 您可以將整個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?
這兩個程式庫都支持各種網路應用程式中的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視圖轉換成具有精確渲染的專業PDF文件,支持完整的CSS3和JavaScript執行時,IronPDF是更強的選擇。
對於生產用的ASP.NET應用程式,IronPDF提供優越的異步支持,並與現代.NET模式的整合,包括依賴注入和中介軟體管道。 其渲染Razor視圖的能力、支持數位簽章,以及處理複雜的佈局,使其成為企業應用程式的首選。 該程式庫還支持Blazor伺服器應用程式和PDF/A合規性,用於歸檔文件。
關於許可與專案考慮有哪些?
iText程式庫的開源版本使用AGPL許可,這需要您的應用程式程式碼也要開源。 iText Group提供商業許可,適合專有專案。 這個許可考量對於SaaS產品或您無法發布源程式碼的內部企業工具特別重要。
IronPDF採用商業許可模式,並提供一個免費試用,用於開發和測試。 許可隨著部署環境的不同而擴展:開發者、單一伺服器或不限部署選項。 選擇何種解決方案時,需考慮到Docker、Azure和Linux環境的部署場景。
高流量場景的性能考量包括執行異步操作、正確的記憶體管理和快取策略。 IronPDF的Chrome引擎在複雜的HTML渲染中提供了優越的性能,而iText可能更適合不涉及HTML的簡單程式化PDF生成。 對於每分鐘生成數百份PDF的應用程式而言,基於現實負載的基準測試是選擇適合您基礎架構的程式庫的最可靠指引。
從iText遷移到IronPDF對於大多數MVC專案來說是直接的。 核心更改是用Chrome引擎渲染的HTML模板替代手動文件構建程式碼。IronPDF提供廣泛的文件、程式碼範例和工程支援以確保過渡順利進行。
您的下一步是什麼?
對於需要支持現代網頁標準的HTML到PDF轉換的新專案而言,IronPDF透過其基於Chrome的渲染提供明顯的優勢。 已有專案使用iText進行基本PDF建立,除非需要HTML渲染的準確性,否則可以繼續使用現有實現。
從IronPDF的免費試用開始,並直接使用您現有的Razor視圖或HTML模板進行測試。 探索完整的文件和API參考,了解如何快速完成整合。 如果您對遷移現有的基於iText的專案有疑問或需要有關PDF記憶體流處理和PDF/A合規性的指導,支援團隊隨時可以提供幫助。
如需更廣泛了解IronPDF與iText產品家族的比較,請參閱專門的iText vs. IronPDF比較頁面。
常見問題
在ASP.NET MVC中使用IronPDF生成PDF的主要優勢是什麼?
IronPDF提供優於iTextSharp的HTML渲染能力,使其更易於從網頁內容生成高質量PDF。
我可以使用IronPDF在ASP.NET MVC應用中生成發票嗎?
可以,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。
使用IronPDF進行PDF生成的理想場景是什麼?
IronPDF在需要高質量HTML到PDF轉換的情景中是理想的選擇,例如從網頁內容生成報告、發票或可下載文件。
相比於iTextSharp,IronPDF是否為現代網頁技術提供更好的支持?
是的,IronPDF旨在與現代網頁技術相容,提供比iTextSharp更好的相容性和渲染精確度。
IronPDF在生成PDF時如何處理圖片和CSS?
IronPDF精確處理圖片和CSS,確保生成的PDF與原始HTML內容高度相符,包括複雜的佈局和樣式。
IronPDF能否輕鬆整合到現有的ASP.NET MVC專案中?
可以,IronPDF可以輕鬆整合到現有的ASP.NET MVC專案中,提供一個簡單的API供開發者實施PDF生成功能。
IronPDF在ASP.NET MVC應用中的主要使用案例是什麼?
IronPDF在ASP.NET MVC應用中的主要使用案例包括生成報告、發票及任何需要精確HTML到PDF轉換的文件。



