跳至頁尾內容
產品對比

使用 iTextSharp 在 MVC 中產生 PDF 與 IronPDF 產生 PDF:全面對比

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

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

如何在MVC中使用iTextSharp產生PDF?

要使用 iTextSharp 在 ASP.NET MVC 應用程式中產生 PDF 文件,首先需要透過其 NuGet 套件或 DLL 安裝 iTextSharp 庫。 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();

                        // Add metadata
                        document.AddTitle("Generated Report");
                        document.AddAuthor("Your Application");
                        document.AddCreationDate();

                        // Add content with error handling
                        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"));

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

                        document.Close();
                    }
                }

                byte[] pdfBytes = memoryStream.ToArray();

                // Proper response headers for production
                Response.Headers.Add("Content-Length", pdfBytes.Length.ToString());
                Response.Headers.Add("Content-Disposition", "inline; filename=report.pdf");
                Response.Headers.Add("Cache-Control", "no-cache, no-store, must-revalidate");

                _logger.LogInformation("PDF generated successfully, size: {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();

                        // Add metadata
                        document.AddTitle("Generated Report");
                        document.AddAuthor("Your Application");
                        document.AddCreationDate();

                        // Add content with error handling
                        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"));

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

                        document.Close();
                    }
                }

                byte[] pdfBytes = memoryStream.ToArray();

                // Proper response headers for production
                Response.Headers.Add("Content-Length", pdfBytes.Length.ToString());
                Response.Headers.Add("Content-Disposition", "inline; filename=report.pdf");
                Response.Headers.Add("Cache-Control", "no-cache, no-store, must-revalidate");

                _logger.LogInformation("PDF generated successfully, size: {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");
        }
    }
}
$vbLabelText   $csharpLabel

iTextSharp 的輸出結果是什麼樣的?

! PDF 檢視器顯示一個簡單的文檔,標題為"Hello World",副標題為"This is a PDF document created with iTextSharp",背景為白色,展示了該庫用於程序化生成 PDF 的基本文本和表格格式化功能。

這段程式碼示範了基本方法:建立一個 Document 實例,將PdfWriter附加到流,使用元素添加內容,並透過操作方法傳回 PDF 檔案。 此實作處理了生產系統所必需的正確錯誤處理和資源處置模式,使您能夠在有效管理記憶體的同時將資料保存到伺服器或允許使用者下載。 對於更複雜的場景,您可能需要實作自訂紙張尺寸、處理頁面方向或在產生的文件中新增頁碼

使用 iTextSharp 函式庫將 HTML 轉換為 PDF 會遇到哪些挑戰?

雖然 iTextSharp 在程式化建立 PDF 方面表現出色,但將 HTML 轉換為 PDF 卻面臨著巨大的挑戰。 已棄用的 HTMLWorker 類別及其替代類別 XMLWorker 對 CSS 的支援有限,難以處理現代 Web 內容,尤其是在處理響應式 CSSJavaScript 渲染的內容時。 當使用Bootstrap 元件現代字體SVG 圖形時,這些限制會變得特別明顯。

// Production-ready HTML conversion with iTextSharp - with limitations
public class HtmlToPdfController : Controller
{
    private readonly IMemoryCache _cache;
    private readonly ILogger<HtmlToPdfController> _logger;

    public HtmlToPdfController(IMemoryCache cache, ILogger<HtmlToPdfController> logger)
    {
        _cache = cache;
        _logger = logger;
    }

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

        try
        {
            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();

                            // Configure XMLWorker with limited CSS support
                            var cssResolver = XMLWorkerHelper.GetInstance().GetDefaultCssResolver(true);
                            var fontProvider = new XMLWorkerFontProvider();

                            var cssAppliers = new CssAppliersImpl(fontProvider);
                            var htmlContext = new HtmlPipelineContext(cssAppliers);
                            htmlContext.SetTagFactory(Tags.GetHtmlTagProcessorFactory());

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

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

                            using (var stringReader = new StringReader(htmlContent))
                            {
                                parser.Parse(stringReader);
                            }

                            document.Close();
                        }
                    }

                    var pdfBytes = stream.ToArray();

                    // Consider caching for repeated requests
                    var cacheKey = $"pdf_{htmlContent.GetHashCode()}";
                    _cache.Set(cacheKey, pdfBytes, TimeSpan.FromMinutes(5));

                    return File(pdfBytes, "application/pdf", "converted.pdf");
                }
            });
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "Failed to convert HTML to PDF");
            return StatusCode(500, "Conversion failed");
        }
    }
}
// Production-ready HTML conversion with iTextSharp - with limitations
public class HtmlToPdfController : Controller
{
    private readonly IMemoryCache _cache;
    private readonly ILogger<HtmlToPdfController> _logger;

    public HtmlToPdfController(IMemoryCache cache, ILogger<HtmlToPdfController> logger)
    {
        _cache = cache;
        _logger = logger;
    }

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

        try
        {
            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();

                            // Configure XMLWorker with limited CSS support
                            var cssResolver = XMLWorkerHelper.GetInstance().GetDefaultCssResolver(true);
                            var fontProvider = new XMLWorkerFontProvider();

                            var cssAppliers = new CssAppliersImpl(fontProvider);
                            var htmlContext = new HtmlPipelineContext(cssAppliers);
                            htmlContext.SetTagFactory(Tags.GetHtmlTagProcessorFactory());

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

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

                            using (var stringReader = new StringReader(htmlContent))
                            {
                                parser.Parse(stringReader);
                            }

                            document.Close();
                        }
                    }

                    var pdfBytes = stream.ToArray();

                    // Consider caching for repeated requests
                    var cacheKey = $"pdf_{htmlContent.GetHashCode()}";
                    _cache.Set(cacheKey, pdfBytes, TimeSpan.FromMinutes(5));

                    return File(pdfBytes, "application/pdf", "converted.pdf");
                }
            });
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "Failed to convert HTML to PDF");
            return StatusCode(500, "Conversion failed");
        }
    }
}
$vbLabelText   $csharpLabel

iTextSharp 處理 HTML 渲染的效果如何?

PDF 檢視器正在顯示一個由 HTML 轉換而來的測試文檔,文檔保留了文字格式(粗體、斜體、紅色內聯文字)和項目符號列表,但缺少內容中提到的黃色背景,這展示了 XMLWorkerHelper 的 CSS 渲染限制。

當使用Bootstrap 佈局、JavaScript 渲染的內容或複雜的 CSS3 樣式時,這些限制就會顯現出來。 使用現代 HTML 建立 PDF 需要大量的變通方法或替代方法。 常見問題包括缺少網頁字體響應式佈局損壞以及缺乏對CSS 媒體類型的支援。 此外,iTextSharp 在轉換 HTML 內容時,對國際語言UTF-8 編碼自訂邊距的處理有困難。

IronPDF 如何簡化 ASP.NET MVC 中的 PDF 產生?

IronPDF 使用Chrome 渲染引擎來改變 PDF 的產生方式,確保將 HTML 轉換為 PDF,實現像素級的完美轉換。 安裝IronPDF NuGet 套件,即可在 Visual Studio 專案中使用簡化的方法開始使用。 該程式庫支援WindowsLinuxmacOS甚至Android 平台,使其成為跨平台開發的理想選擇。

using IronPdf;
using Microsoft.Extensions.DependencyInjection;

// Configure IronPDF in Startup.cs or Program.cs
public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        // Register IronPDF with dependency injection
        services.AddSingleton<ChromePdfRenderer>(provider =>
        {
            var renderer = new ChromePdfRenderer();

            // Configure rendering options for production
            renderer.RenderingOptions.MarginTop = 10;
            renderer.RenderingOptions.MarginBottom = 10;
            renderer.RenderingOptions.MarginLeft = 10;
            renderer.RenderingOptions.MarginRight = 10;
            renderer.RenderingOptions.EnableJavaScript = true;
            renderer.RenderingOptions.RenderDelay = 500; // Wait for JS
            renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print;

            return renderer;
        });

        services.AddMemoryCache();
        services.AddControllersWithViews();
    }
}

// Production-ready controller with IronPDF
public class ModernPdfController : Controller
{
    private readonly ChromePdfRenderer _pdfRenderer;
    private readonly ILogger<ModernPdfController> _logger;

    public ModernPdfController(ChromePdfRenderer pdfRenderer, ILogger<ModernPdfController> logger)
    {
        _pdfRenderer = pdfRenderer;
        _logger = logger;
    }

    [HttpPost]
    public async Task<IActionResult> GeneratePdfWithIronPDFAsync([FromBody] PdfRequest request)
    {
        try
        {
            // Validate request
            if (string.IsNullOrWhiteSpace(request?.HtmlContent))
            {
                return BadRequest("HTML content is required");
            }

            // Configure specific options for this request
            var renderOptions = new ChromePdfRenderOptions
            {
                MarginTop = request.MarginTop ?? 10,
                MarginBottom = request.MarginBottom ?? 10,
                PaperSize = PdfPaperSize.A4,
                Title = request.Title ?? "Generated Document",
                EnableJavaScript = true,
                WaitFor = new WaitFor()
                {
                    RenderDelay = 1000, // Wait for content to render
                    NetworkIdle = true  // Wait for network requests
                }
            };

            // Apply security headers
            renderOptions.CustomPdfSecuritySettings = new PdfSecuritySettings
            {
                AllowUserCopyPasteContent = true,
                AllowUserPrinting = PdfPrintSecurity.FullPrintRights,
                OwnerPassword = request.OwnerPassword
            };

            // Render HTML with full CSS3 and JavaScript support
            var pdf = await Task.Run(() => 
                _pdfRenderer.RenderHtmlAsPdf(request.HtmlContent, renderOptions)
            );

            // Add metadata
            pdf.MetaData.Author = "Your Application";
            pdf.MetaData.CreatedDate = DateTime.UtcNow;
            pdf.MetaData.Title = request.Title ?? "Document";

            // Optional: Add headers/footers
            if (request.IncludeHeaders)
            {
                pdf.AddTextHeaders("{page} of {total-pages}", 
                    IronPdf.Editing.TextHeaderFooterOptions.CenterRight);
                pdf.AddTextFooters("Generated on {date} at {time}", 
                    IronPdf.Editing.TextHeaderFooterOptions.CenterBottom);
            }

            var pdfBytes = pdf.BinaryData;

            _logger.LogInformation("PDF generated successfully: {Size} bytes", pdfBytes.Length);

            // Return with appropriate headers
            Response.Headers.Add("X-PDF-Version", pdf.MetaData.PdfVersion.ToString());

            return File(pdfBytes, "application/pdf", 
                $"{request.FileName ?? "document"}_{DateTime.UtcNow:yyyyMMdd}.pdf");
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "PDF generation failed");
            return StatusCode(500, new { error = "PDF generation failed", message = ex.Message });
        }
    }
}

public class PdfRequest
{
    public string HtmlContent { get; set; }
    public string Title { get; set; }
    public string FileName { get; set; }
    public bool IncludeHeaders { get; set; }
    public string OwnerPassword { get; set; }
    public double? MarginTop { get; set; }
    public double? MarginBottom { get; set; }
}
using IronPdf;
using Microsoft.Extensions.DependencyInjection;

// Configure IronPDF in Startup.cs or Program.cs
public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        // Register IronPDF with dependency injection
        services.AddSingleton<ChromePdfRenderer>(provider =>
        {
            var renderer = new ChromePdfRenderer();

            // Configure rendering options for production
            renderer.RenderingOptions.MarginTop = 10;
            renderer.RenderingOptions.MarginBottom = 10;
            renderer.RenderingOptions.MarginLeft = 10;
            renderer.RenderingOptions.MarginRight = 10;
            renderer.RenderingOptions.EnableJavaScript = true;
            renderer.RenderingOptions.RenderDelay = 500; // Wait for JS
            renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print;

            return renderer;
        });

        services.AddMemoryCache();
        services.AddControllersWithViews();
    }
}

// Production-ready controller with IronPDF
public class ModernPdfController : Controller
{
    private readonly ChromePdfRenderer _pdfRenderer;
    private readonly ILogger<ModernPdfController> _logger;

    public ModernPdfController(ChromePdfRenderer pdfRenderer, ILogger<ModernPdfController> logger)
    {
        _pdfRenderer = pdfRenderer;
        _logger = logger;
    }

    [HttpPost]
    public async Task<IActionResult> GeneratePdfWithIronPDFAsync([FromBody] PdfRequest request)
    {
        try
        {
            // Validate request
            if (string.IsNullOrWhiteSpace(request?.HtmlContent))
            {
                return BadRequest("HTML content is required");
            }

            // Configure specific options for this request
            var renderOptions = new ChromePdfRenderOptions
            {
                MarginTop = request.MarginTop ?? 10,
                MarginBottom = request.MarginBottom ?? 10,
                PaperSize = PdfPaperSize.A4,
                Title = request.Title ?? "Generated Document",
                EnableJavaScript = true,
                WaitFor = new WaitFor()
                {
                    RenderDelay = 1000, // Wait for content to render
                    NetworkIdle = true  // Wait for network requests
                }
            };

            // Apply security headers
            renderOptions.CustomPdfSecuritySettings = new PdfSecuritySettings
            {
                AllowUserCopyPasteContent = true,
                AllowUserPrinting = PdfPrintSecurity.FullPrintRights,
                OwnerPassword = request.OwnerPassword
            };

            // Render HTML with full CSS3 and JavaScript support
            var pdf = await Task.Run(() => 
                _pdfRenderer.RenderHtmlAsPdf(request.HtmlContent, renderOptions)
            );

            // Add metadata
            pdf.MetaData.Author = "Your Application";
            pdf.MetaData.CreatedDate = DateTime.UtcNow;
            pdf.MetaData.Title = request.Title ?? "Document";

            // Optional: Add headers/footers
            if (request.IncludeHeaders)
            {
                pdf.AddTextHeaders("{page} of {total-pages}", 
                    IronPdf.Editing.TextHeaderFooterOptions.CenterRight);
                pdf.AddTextFooters("Generated on {date} at {time}", 
                    IronPdf.Editing.TextHeaderFooterOptions.CenterBottom);
            }

            var pdfBytes = pdf.BinaryData;

            _logger.LogInformation("PDF generated successfully: {Size} bytes", pdfBytes.Length);

            // Return with appropriate headers
            Response.Headers.Add("X-PDF-Version", pdf.MetaData.PdfVersion.ToString());

            return File(pdfBytes, "application/pdf", 
                $"{request.FileName ?? "document"}_{DateTime.UtcNow:yyyyMMdd}.pdf");
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "PDF generation failed");
            return StatusCode(500, new { error = "PDF generation failed", message = ex.Message });
        }
    }
}

public class PdfRequest
{
    public string HtmlContent { get; set; }
    public string Title { get; set; }
    public string FileName { get; set; }
    public bool IncludeHeaders { get; set; }
    public string OwnerPassword { get; set; }
    public double? MarginTop { get; set; }
    public double? MarginBottom { get; set; }
}
$vbLabelText   $csharpLabel

IronPDF 的 Chrome 渲染品質如何?

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

ChromePdfRenderer可以輕鬆處理複雜的佈局,在生成的 PDF 文件中保持 HTML 內容的視覺保真度。 它支援CSS GridFlexboxWeb 字體WebGL 內容等現代功能。 該程式庫在渲染JavaScript 圖表、處理視窗設定以及管理動態內容的渲染延遲方面也表現出色。 為了獲得最佳效果,您可以配置渲染選項以滿足您的特定需求。 ## 哪一種方法能提供更好的 MVC 整合?

這兩個庫都支援 ASP.NET MVC 模式,但 IronPDF 的 Razor Engine 視圖渲染功能使其脫穎而出。 您可以將整個視圖直接轉換為 PDF,並完全支援 ViewBag、ViewData 和模型綁定。 該程式庫可與 ASP.NET Core、MVC 框架和 Razor Pages 無縫集成,在不同的 .NET 架構中提供靈活性。 您甚至可以無頭渲染 CSHTML,以便在伺服器端產生 PDF,而無需 UI 上下文。

// IronPDF - Production-ready Razor view to PDF with async support
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)
    {
        try
        {
            // Fetch invoice data asynchronously
            var invoice = await _invoiceService.GetInvoiceAsync(id);
            if (invoice == null)
            {
                return NotFound();
            }

            // Render Razor view to string
            var htmlContent = await _razorRenderer.RenderViewToStringAsync(
                "Invoice/InvoiceTemplate", 
                invoice);

            // Configure PDF generation options
            var renderOptions = new ChromePdfRenderOptions
            {
                PaperSize = PdfPaperSize.A4,
                MarginTop = 20,
                MarginBottom = 20,
                MarginLeft = 15,
                MarginRight = 15,
                PrintHtmlBackgrounds = true,
                CreatePdfFormsFromHtml = true
            };

            // Add custom headers with invoice info
            var headerHtml = $@"
                <div style='font-size: 10px; text-align: right;'>
                    Invoice #{invoice.InvoiceNumber} | {invoice.Date:yyyy-MM-dd}
                </div>";

            // Generate PDF from HTML
            var pdf = await Task.Run(() => 
                _pdfRenderer.RenderHtmlAsPdf(htmlContent, renderOptions)
            );

            // Add headers
            pdf.AddHtmlHeaders(headerHtml, 
                new HtmlHeaderFooter { Height = 25, DrawDividerLine = true });

            // Set metadata
            pdf.MetaData.Title = $"Invoice-{invoice.InvoiceNumber}";
            pdf.MetaData.Subject = $"Invoice for {invoice.CustomerName}";
            pdf.MetaData.Keywords = "invoice,billing,payment";

            // Optional: Apply digital signature
            if (Request.Headers.ContainsKey("X-Sign-Document"))
            {
                pdf.Sign(new PdfSignature("certificate.pfx", "password"));
            }

            var fileName = $"Invoice-{invoice.InvoiceNumber}-{DateTime.UtcNow:yyyyMMdd}.pdf";
            return File(pdf.BinaryData, "application/pdf", fileName);
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "Failed to generate invoice PDF for ID: {InvoiceId}", id);
            return StatusCode(500, "Failed to generate invoice");
        }
    }
}

// Razor view renderer service
public interface IRazorViewToStringRenderer
{
    Task<string> RenderViewToStringAsync<TModel>(string viewName, TModel model);
}

public class RazorViewToStringRenderer : IRazorViewToStringRenderer
{
    private readonly IRazorViewEngine _razorViewEngine;
    private readonly ITempDataProvider _tempDataProvider;
    private readonly IServiceProvider _serviceProvider;

    public RazorViewToStringRenderer(
        IRazorViewEngine razorViewEngine,
        ITempDataProvider tempDataProvider,
        IServiceProvider serviceProvider)
    {
        _razorViewEngine = razorViewEngine;
        _tempDataProvider = tempDataProvider;
        _serviceProvider = serviceProvider;
    }

    public async Task<string> RenderViewToStringAsync<TModel>(string viewName, TModel model)
    {
        var httpContext = new DefaultHttpContext { RequestServices = _serviceProvider };
        var actionContext = new ActionContext(httpContext, new RouteData(), new ActionDescriptor());

        using (var sw = new StringWriter())
        {
            var viewResult = _razorViewEngine.FindView(actionContext, viewName, false);

            if (!viewResult.Success)
            {
                throw new ArgumentNullException($"{viewName} does not match any available view");
            }

            var viewDictionary = new ViewDataDictionary(
                new EmptyModelMetadataProvider(), 
                new ModelStateDictionary())
            {
                Model = model
            };

            var viewContext = new ViewContext(
                actionContext,
                viewResult.View,
                viewDictionary,
                new TempDataDictionary(actionContext.HttpContext, _tempDataProvider),
                sw,
                new HtmlHelperOptions());

            await viewResult.View.RenderAsync(viewContext);
            return sw.ToString();
        }
    }
}
// IronPDF - Production-ready Razor view to PDF with async support
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)
    {
        try
        {
            // Fetch invoice data asynchronously
            var invoice = await _invoiceService.GetInvoiceAsync(id);
            if (invoice == null)
            {
                return NotFound();
            }

            // Render Razor view to string
            var htmlContent = await _razorRenderer.RenderViewToStringAsync(
                "Invoice/InvoiceTemplate", 
                invoice);

            // Configure PDF generation options
            var renderOptions = new ChromePdfRenderOptions
            {
                PaperSize = PdfPaperSize.A4,
                MarginTop = 20,
                MarginBottom = 20,
                MarginLeft = 15,
                MarginRight = 15,
                PrintHtmlBackgrounds = true,
                CreatePdfFormsFromHtml = true
            };

            // Add custom headers with invoice info
            var headerHtml = $@"
                <div style='font-size: 10px; text-align: right;'>
                    Invoice #{invoice.InvoiceNumber} | {invoice.Date:yyyy-MM-dd}
                </div>";

            // Generate PDF from HTML
            var pdf = await Task.Run(() => 
                _pdfRenderer.RenderHtmlAsPdf(htmlContent, renderOptions)
            );

            // Add headers
            pdf.AddHtmlHeaders(headerHtml, 
                new HtmlHeaderFooter { Height = 25, DrawDividerLine = true });

            // Set metadata
            pdf.MetaData.Title = $"Invoice-{invoice.InvoiceNumber}";
            pdf.MetaData.Subject = $"Invoice for {invoice.CustomerName}";
            pdf.MetaData.Keywords = "invoice,billing,payment";

            // Optional: Apply digital signature
            if (Request.Headers.ContainsKey("X-Sign-Document"))
            {
                pdf.Sign(new PdfSignature("certificate.pfx", "password"));
            }

            var fileName = $"Invoice-{invoice.InvoiceNumber}-{DateTime.UtcNow:yyyyMMdd}.pdf";
            return File(pdf.BinaryData, "application/pdf", fileName);
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "Failed to generate invoice PDF for ID: {InvoiceId}", id);
            return StatusCode(500, "Failed to generate invoice");
        }
    }
}

// Razor view renderer service
public interface IRazorViewToStringRenderer
{
    Task<string> RenderViewToStringAsync<TModel>(string viewName, TModel model);
}

public class RazorViewToStringRenderer : IRazorViewToStringRenderer
{
    private readonly IRazorViewEngine _razorViewEngine;
    private readonly ITempDataProvider _tempDataProvider;
    private readonly IServiceProvider _serviceProvider;

    public RazorViewToStringRenderer(
        IRazorViewEngine razorViewEngine,
        ITempDataProvider tempDataProvider,
        IServiceProvider serviceProvider)
    {
        _razorViewEngine = razorViewEngine;
        _tempDataProvider = tempDataProvider;
        _serviceProvider = serviceProvider;
    }

    public async Task<string> RenderViewToStringAsync<TModel>(string viewName, TModel model)
    {
        var httpContext = new DefaultHttpContext { RequestServices = _serviceProvider };
        var actionContext = new ActionContext(httpContext, new RouteData(), new ActionDescriptor());

        using (var sw = new StringWriter())
        {
            var viewResult = _razorViewEngine.FindView(actionContext, viewName, false);

            if (!viewResult.Success)
            {
                throw new ArgumentNullException($"{viewName} does not match any available view");
            }

            var viewDictionary = new ViewDataDictionary(
                new EmptyModelMetadataProvider(), 
                new ModelStateDictionary())
            {
                Model = model
            };

            var viewContext = new ViewContext(
                actionContext,
                viewResult.View,
                viewDictionary,
                new TempDataDictionary(actionContext.HttpContext, _tempDataProvider),
                sw,
                new HtmlHelperOptions());

            await viewResult.View.RenderAsync(viewContext);
            return sw.ToString();
        }
    }
}
$vbLabelText   $csharpLabel

Razor視圖轉換與手動建置相比有何不同?

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

相較之下,iTextSharp 的方法需要在 Controller 中手動建立文件結構。 這意味著從原始程式碼建立文檔,對複雜佈局的支援有限。 IronPDF 的 Razor 整合可讓您使用現有的 ASPX 頁面、HTML 文件,甚至是 HTML 字串來產生 PDF。 您也可以使用 HTML ZIP 檔案或實作用於資源載入的基本 URL 配置。

// iTextSharp - Manual PDF construction with thread safety considerations
public class InvoiceTextSharpController : Controller
{
    private readonly IInvoiceService _invoiceService;
    private readonly ILogger<InvoiceTextSharpController> _logger;
    private static readonly object _lockObject = new object();

    public async Task<ActionResult> InvoicePdfTextSharp(int id)
    {
        try
        {
            var invoice = await _invoiceService.GetInvoiceAsync(id);
            if (invoice == null)
            {
                return NotFound();
            }

            // Thread-safe PDF generation
            byte[] pdfBytes;

            // iTextSharp is not thread-safe, must synchronize
            lock (_lockObject)
            {
                using (var stream = new MemoryStream())
                {
                    using (var document = new Document(PageSize.A4, 50, 50, 25, 25))
                    {
                        using (var writer = PdfWriter.GetInstance(document, stream))
                        {
                            document.Open();

                            // Manually build invoice structure
                            var titleFont = FontFactory.GetFont(FontFactory.HELVETICA_BOLD, 18);
                            var headerFont = FontFactory.GetFont(FontFactory.HELVETICA_BOLD, 12);
                            var normalFont = FontFactory.GetFont(FontFactory.HELVETICA, 10);

                            // Add company logo
                            var logo = Image.GetInstance("logo.png");
                            logo.ScaleToFit(100, 50);
                            logo.Alignment = Element.ALIGN_RIGHT;
                            document.Add(logo);

                            // Add invoice header
                            document.Add(new Paragraph($"INVOICE #{invoice.InvoiceNumber}", titleFont));
                            document.Add(new Paragraph($"Date: {invoice.Date:yyyy-MM-dd}", normalFont));
                            document.Add(new Paragraph($"Due Date: {invoice.DueDate:yyyy-MM-dd}", normalFont));

                            document.Add(new Paragraph(" ")); // Spacing

                            // Add customer info
                            document.Add(new Paragraph("Bill To:", headerFont));
                            document.Add(new Paragraph(invoice.CustomerName, normalFont));
                            document.Add(new Paragraph(invoice.CustomerAddress, normalFont));

                            document.Add(new Paragraph(" "));

                            // Create items table manually
                            var table = new PdfPTable(4);
                            table.WidthPercentage = 100;
                            table.SetWidths(new float[] { 3f, 1f, 1f, 1f });

                            // Add table headers
                            table.AddCell(new PdfPCell(new Phrase("Description", headerFont)));
                            table.AddCell(new PdfPCell(new Phrase("Qty", headerFont)));
                            table.AddCell(new PdfPCell(new Phrase("Price", headerFont)));
                            table.AddCell(new PdfPCell(new Phrase("Total", headerFont)));

                            // Add invoice items
                            foreach (var item in invoice.Items)
                            {
                                table.AddCell(new Phrase(item.Description, normalFont));
                                table.AddCell(new Phrase(item.Quantity.ToString(), normalFont));
                                table.AddCell(new Phrase($"${item.UnitPrice:F2}", normalFont));
                                table.AddCell(new Phrase($"${item.Total:F2}", normalFont));
                            }

                            // Add totals row
                            table.AddCell(new PdfPCell(new Phrase("TOTAL", headerFont)) 
                            { 
                                Colspan = 3, 
                                HorizontalAlignment = Element.ALIGN_RIGHT 
                            });
                            table.AddCell(new PdfPCell(new Phrase($"${invoice.Total:F2}", headerFont)));

                            document.Add(table);

                            // Add footer
                            document.Add(new Paragraph(" "));
                            document.Add(new Paragraph("Payment Terms: " + invoice.PaymentTerms, normalFont));

                            document.Close();
                        }
                    }

                    pdfBytes = stream.ToArray();
                }
            }

            var fileName = $"Invoice-{invoice.InvoiceNumber}.pdf";
            return File(pdfBytes, "application/pdf", fileName);
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "Failed to generate invoice with iTextSharp");
            return StatusCode(500, "PDF generation failed");
        }
    }
}
// iTextSharp - Manual PDF construction with thread safety considerations
public class InvoiceTextSharpController : Controller
{
    private readonly IInvoiceService _invoiceService;
    private readonly ILogger<InvoiceTextSharpController> _logger;
    private static readonly object _lockObject = new object();

    public async Task<ActionResult> InvoicePdfTextSharp(int id)
    {
        try
        {
            var invoice = await _invoiceService.GetInvoiceAsync(id);
            if (invoice == null)
            {
                return NotFound();
            }

            // Thread-safe PDF generation
            byte[] pdfBytes;

            // iTextSharp is not thread-safe, must synchronize
            lock (_lockObject)
            {
                using (var stream = new MemoryStream())
                {
                    using (var document = new Document(PageSize.A4, 50, 50, 25, 25))
                    {
                        using (var writer = PdfWriter.GetInstance(document, stream))
                        {
                            document.Open();

                            // Manually build invoice structure
                            var titleFont = FontFactory.GetFont(FontFactory.HELVETICA_BOLD, 18);
                            var headerFont = FontFactory.GetFont(FontFactory.HELVETICA_BOLD, 12);
                            var normalFont = FontFactory.GetFont(FontFactory.HELVETICA, 10);

                            // Add company logo
                            var logo = Image.GetInstance("logo.png");
                            logo.ScaleToFit(100, 50);
                            logo.Alignment = Element.ALIGN_RIGHT;
                            document.Add(logo);

                            // Add invoice header
                            document.Add(new Paragraph($"INVOICE #{invoice.InvoiceNumber}", titleFont));
                            document.Add(new Paragraph($"Date: {invoice.Date:yyyy-MM-dd}", normalFont));
                            document.Add(new Paragraph($"Due Date: {invoice.DueDate:yyyy-MM-dd}", normalFont));

                            document.Add(new Paragraph(" ")); // Spacing

                            // Add customer info
                            document.Add(new Paragraph("Bill To:", headerFont));
                            document.Add(new Paragraph(invoice.CustomerName, normalFont));
                            document.Add(new Paragraph(invoice.CustomerAddress, normalFont));

                            document.Add(new Paragraph(" "));

                            // Create items table manually
                            var table = new PdfPTable(4);
                            table.WidthPercentage = 100;
                            table.SetWidths(new float[] { 3f, 1f, 1f, 1f });

                            // Add table headers
                            table.AddCell(new PdfPCell(new Phrase("Description", headerFont)));
                            table.AddCell(new PdfPCell(new Phrase("Qty", headerFont)));
                            table.AddCell(new PdfPCell(new Phrase("Price", headerFont)));
                            table.AddCell(new PdfPCell(new Phrase("Total", headerFont)));

                            // Add invoice items
                            foreach (var item in invoice.Items)
                            {
                                table.AddCell(new Phrase(item.Description, normalFont));
                                table.AddCell(new Phrase(item.Quantity.ToString(), normalFont));
                                table.AddCell(new Phrase($"${item.UnitPrice:F2}", normalFont));
                                table.AddCell(new Phrase($"${item.Total:F2}", normalFont));
                            }

                            // Add totals row
                            table.AddCell(new PdfPCell(new Phrase("TOTAL", headerFont)) 
                            { 
                                Colspan = 3, 
                                HorizontalAlignment = Element.ALIGN_RIGHT 
                            });
                            table.AddCell(new PdfPCell(new Phrase($"${invoice.Total:F2}", headerFont)));

                            document.Add(table);

                            // Add footer
                            document.Add(new Paragraph(" "));
                            document.Add(new Paragraph("Payment Terms: " + invoice.PaymentTerms, normalFont));

                            document.Close();
                        }
                    }

                    pdfBytes = stream.ToArray();
                }
            }

            var fileName = $"Invoice-{invoice.InvoiceNumber}.pdf";
            return File(pdfBytes, "application/pdf", fileName);
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "Failed to generate invoice with iTextSharp");
            return StatusCode(500, "PDF generation failed");
        }
    }
}
$vbLabelText   $csharpLabel

如何處理文件下載和串流以建立 PDF 文件?

這兩個函式庫都支援 Web 應用程式中 PDF 檔案的各種輸出方式。 請參考以下程式碼範例,以了解如何實現具有正確內容處置標頭和對大檔案進行串流傳輸的檔案下載功能。 IronPDF 還提供 PDF 壓縮、線性化(用於快速網頁瀏覽)和柵格化為圖像等附加功能。 您也可以匯出為不同的 PDF 版本,或建立符合 PDF/A 標準的文件以進行存檔。

// Advanced streaming controller supporting both libraries
public class StreamingPdfController : Controller
{
    private readonly ChromePdfRenderer _ironPdfRenderer;
    private readonly IMemoryCache _cache;

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

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

        // For very large PDFs, consider streaming directly to response
        Response.ContentType = "application/pdf";
        Response.Headers.Add("Content-Disposition", $"attachment; filename=large_report_{reportId}.pdf");

        await using (var stream = Response.BodyWriter.AsStream())
        {
            // IronPDF approach - stream directly
            var html = await GenerateLargeHtmlReport(reportId);
            var pdf = _ironPdfRenderer.RenderHtmlAsPdf(html);

            // Save to stream
            pdf.SaveAs(stream);

            // Cache for future requests (if size permits)
            if (pdf.BinaryData.Length < 10_000_000) // 10MB limit
            {
                _cache.Set(cacheKey, pdf.BinaryData, TimeSpan.FromMinutes(30));
            }
        }

        return new EmptyResult();
    }

    // Support range requests for large PDFs
    [HttpGet]
    public IActionResult DownloadWithRangeSupport(string documentId)
    {
        var pdfBytes = GetPdfBytes(documentId);

        // Enable range processing for large files
        return File(pdfBytes, "application/pdf", $"document_{documentId}.pdf", enableRangeProcessing: true);
    }

    // Batch PDF generation with progress
    [HttpPost]
    public async Task<IActionResult> BatchGeneratePdfs([FromBody] BatchPdfRequest request)
    {
        var results = new List<BatchPdfResult>();
        var semaphore = new SemaphoreSlim(3); // Limit concurrent generations

        var tasks = request.Documents.Select(async doc =>
        {
            await semaphore.WaitAsync();
            try
            {
                var pdf = await GeneratePdfAsync(doc);
                return new BatchPdfResult 
                { 
                    Id = doc.Id, 
                    Success = true, 
                    Size = pdf.Length 
                };
            }
            catch (Exception ex)
            {
                return new BatchPdfResult 
                { 
                    Id = doc.Id, 
                    Success = false, 
                    Error = ex.Message 
                };
            }
            finally
            {
                semaphore.Release();
            }
        });

        results.AddRange(await Task.WhenAll(tasks));

        return Ok(results);
    }
}
// Advanced streaming controller supporting both libraries
public class StreamingPdfController : Controller
{
    private readonly ChromePdfRenderer _ironPdfRenderer;
    private readonly IMemoryCache _cache;

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

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

        // For very large PDFs, consider streaming directly to response
        Response.ContentType = "application/pdf";
        Response.Headers.Add("Content-Disposition", $"attachment; filename=large_report_{reportId}.pdf");

        await using (var stream = Response.BodyWriter.AsStream())
        {
            // IronPDF approach - stream directly
            var html = await GenerateLargeHtmlReport(reportId);
            var pdf = _ironPdfRenderer.RenderHtmlAsPdf(html);

            // Save to stream
            pdf.SaveAs(stream);

            // Cache for future requests (if size permits)
            if (pdf.BinaryData.Length < 10_000_000) // 10MB limit
            {
                _cache.Set(cacheKey, pdf.BinaryData, TimeSpan.FromMinutes(30));
            }
        }

        return new EmptyResult();
    }

    // Support range requests for large PDFs
    [HttpGet]
    public IActionResult DownloadWithRangeSupport(string documentId)
    {
        var pdfBytes = GetPdfBytes(documentId);

        // Enable range processing for large files
        return File(pdfBytes, "application/pdf", $"document_{documentId}.pdf", enableRangeProcessing: true);
    }

    // Batch PDF generation with progress
    [HttpPost]
    public async Task<IActionResult> BatchGeneratePdfs([FromBody] BatchPdfRequest request)
    {
        var results = new List<BatchPdfResult>();
        var semaphore = new SemaphoreSlim(3); // Limit concurrent generations

        var tasks = request.Documents.Select(async doc =>
        {
            await semaphore.WaitAsync();
            try
            {
                var pdf = await GeneratePdfAsync(doc);
                return new BatchPdfResult 
                { 
                    Id = doc.Id, 
                    Success = true, 
                    Size = pdf.Length 
                };
            }
            catch (Exception ex)
            {
                return new BatchPdfResult 
                { 
                    Id = doc.Id, 
                    Success = false, 
                    Error = ex.Message 
                };
            }
            finally
            {
                semaphore.Release();
            }
        });

        results.AddRange(await Task.WhenAll(tasks));

        return Ok(results);
    }
}
$vbLabelText   $csharpLabel

對於進階場景,IronPDF 支援並行 PDF 生成、多執行緒處理和批次操作。 您可以實作自訂日誌記錄、處理網路驗證、使用 cookie 以及新增 HTTP 請求標頭以安全地產生文件。

關於許可證和專案方面的考慮因素?

iTextSharp 函式庫的開源版本採用 AGPL 許可證,因此您的實作也必須是開源的。 專有工藝可獲得商業許可。 IronPDF 提供商業許可模式,並提供免費試用版可供開發和測試使用。 考慮企業部署的授權擴展和升級選項。 在實施任一解決方案時,請考慮包括 Docker、Azure 和 Linux 環境在內的部署場景。

高流量場景下的效能考量包括實現非同步操作、適當的記憶體管理和快取策略。 IronPDF 的 Chrome 引擎在複雜的 HTML 渲染方面提供了卓越的效能,而 iTextSharp 在簡單的程式化 PDF 產生方面可能更有效率。 考慮實施 PDF 安全性清理、數位簽章以確保文件真實性,以及對敏感內容進行加密。

對於需要將 HTML 轉換為 PDF 並支援現代 Web 標準的新項目,IronPDF 憑藉其基於 Chrome 的渲染功能提供了明顯的優勢。 已經使用 iTextSharp 進行基本 PDF 建立的傳統專案可以繼續使用現有的實作方式,除非需要進行 HTML 渲染。 規劃升級時,請考慮遷移路徑和相容性要求。 IronPDF 提供豐富的文件、程式碼範例和故障排除指南,以實現平穩過渡。 該庫還支援高級功能,例如 PDF 表單、註釋、浮水印和目錄生成。 ## 為您的 ASP.NET MVC 專案選擇合適的 PDF 程式庫

雖然iTextSharp提供了對程式化 PDF 建立的詳細控制,但 IronPDF 在將 HTML 轉換為具有精確渲染的專業 PDF 文件方面表現出色。 您的選擇應取決於您的特定需求:選擇 iTextSharp 可實現簡單、程式碼驅動的 PDF 生成,您可以管理每個元素;或選擇 IronPDF 可實現流暢的 HTML 到 PDF 轉換,並完全支援CSS3和 JavaScript。

對於生產 ASP.NET 應用程序,IronPDF 提供卓越的錯誤處理非同步支援以及與現代 .NET 模式的集成,包括依賴注入中間件管道。 它能夠渲染Razor 視圖、支援數位簽章並管理複雜的佈局,使其成為企業應用程式的首選。 該程式庫還可靠地支援Blazor Server 應用程式MAUI 平台Angular 框架

準備好更新您的 PDF 生成功能了嗎? 首先體驗IronPDF 的免費試用版,看看它能為您的 ASP.NET MVC 應用程式帶來哪些改變。 查看我們的完整文檔,探索程式碼範例,並使用企業級支援進行生產部署。 查看我們的產品演示里程碑更新API參考,以發現 PDF 生成在您的應用程式中的全部潛力。

請注意iTextSharp 是其各自所有者的註冊商標。 本網站與iTextSharp無任何關聯,亦未獲得其認可或贊助。所有產品名稱、標誌和品牌均為其各自所有者的財產。 文中比較僅供參考,反映的是撰寫本文時可公開取得的資訊。

常見問題解答

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

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

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

是的,IronPDF 具有強大的 HTML 轉 PDF 轉換功能,非常適合在 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 旨在與現代網路技術無縫協作,與 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擁有卡爾頓大學電腦科學學士學位,專長於前端開發,精通Node.js、TypeScript、JavaScript和React。他熱衷於打造直覺美觀的使用者介面,喜歡使用現代框架,並擅長撰寫結構清晰、視覺效果出色的使用者手冊。

除了開發工作之外,柯蒂斯對物聯網 (IoT) 也抱有濃厚的興趣,致力於探索硬體和軟體整合的創新方法。閒暇時,他喜歡玩遊戲和製作 Discord 機器人,將他對科技的熱愛與創造力結合。