產品比較 IronPDF對比PDFTron (Apryse):2025年完整C# PDF庫比較 Jacob Mellor 更新日期:9月 6, 2025 Download IronPDF NuGet 下載 DLL 下載 Windows 安裝程式 Start Free Trial Copy for LLMs Copy for LLMs Copy page as Markdown for LLMs Open in ChatGPT Ask ChatGPT about this page Open in Gemini Ask Gemini about this page Open in Grok Ask Grok about this page Open in Perplexity Ask Perplexity about this page Share Share on Facebook Share on X (Twitter) Share on LinkedIn Copy URL Email article 正在尋找適合您的 .NET 項目的 PDF 庫嗎? 這份 IronPDF 和 PDFTron(現為 Apryse)之間的全面比較分析了功能、定價、性能和開發者體驗,以幫助您做出明智的決定。 無論您是在構建網頁應用程序、桌面軟件還是雲服務,選擇正確的 PDF 工具包都可以顯著影響您的開發速度和項目成功。 快速比較總結 類別 功能/方面 IronPDF PDFTron (Apryse) 主要優勢 核心架構 設計哲學 簡單優先,Chrome V8 引擎 企業專注,自定義引擎 IronPDF:更快的開發 API 複雜性 簡單的方法如 RenderHtmlAsPdf() IronPDF:70% 減少代碼 學習曲線 典型 1-2 天 典型 1-2 周 IronPDF:更快的採用 平台支持 跨平台 原生支持,單一包 需要多個包/模塊 IronPDF:更簡單的部署 .NET 版本 .NET 10, 9, 8, 7, 6, 5, Core 3.1+, Framework 4.6.2+ 類似支持需要額外設置 雙方:現代框架支持 HTML 至 PDF 渲染引擎 完整的 Chrome V8 引擎 自定義引擎(通過 HTML2PDF 模塊) IronPDF:98%+ 瀏覽器相似性 JavaScript 支持 完全集成支持,渲染延遲 有限支持 IronPDF:動態內容設置 MS Office 支持 DOCX 至 PDF 內建 DocxToPdfRenderer PDFTron:更好的 Office 精確性 CAD 支持 不提供 DWG, DXF, DGN 至 PDF PDFTron:CAD 工作流程 性能 HTML 渲染速度 典型 0.8-1.2 秒(Chrome 引擎) 0.3-0.5 秒典型(簡單的 HTML) PDFTron:基礎 HTML 更快 內存使用 150-200MB(Chrome 進程) 80-120MB 典型 PDFTron:更低内存消耗 授權和定價 入門級 Lite: $799(1 位開發者,1 個專案) 自定義報價(估計 ,000-,000+) IronPDF:價格透明 企業級 Professional: $2,399(10 位開發人員) 自定義報價(估算 ,000+) IronPDF:最高可省 90% 成本 支持 支持包括 是,24/5 工程支持 隨著授權級別不同而不同 IronPDF:支持包括 最佳用途 使用案例 現代網頁應用,HTML 報告,快速開發 文件繁重的工作流程,CAD/Office 轉換 根據上下文而定 什麼是 IronPDF 和 PDFTron(Apryse)? IronPDF概覽 IronPDF 是一個全面的 .NET PDF 庫,它簡化了開發人員的 PDF 創建、編輯和操作。 基於 Chrome 渲染引擎,它擅長將 HTML、CSS 和 JavaScript 轉換為像素完美的 PDF 文檔。 該庫的簡單 API 設計允許開發人員使用最少的代碼集成 PDF 功能,使其成為 Web 應用程序、報告系統和文檔自動化的理想選擇。 PDFTron(Apryse)概述 PDFTron 於 2023 年 2 月更名為 Apryse,是一個以企業為重點的 PDF SDK,提供廣泛的文檔處理能力。 最初是為了複雜的文檔工作流程而開發的,它為各種文件格式提供了強大的支持,包括 Microsoft Office、CAD 圖紙和專門的文件類型。PDFTron Systems Inc.,全球文檔處理技術的領導者,宣布更名為 Apryse; 將包括 iText、Windward、Eversign 在內的 13 家公司整合在一起。 如何創建用於 PDF 生成的 ASP.NET 項目? 設置用於 PDF 生成的 ASP.NET 項目需要正確的配置,無論您選擇哪個庫。 按照以下步驟創建 IronPDF 或 PDFTron 集成的基礎: 打開 Visual Studio 2022 或更高版本 點擊“創建新項目” 選擇“ASP.NET Core Web 應用程序”(推薦使用 .NET 6.0 或更高版本) 選擇您的項目名稱和位置 根據需要選擇“Web 應用程序(模型-視圖-控制器)”或“Web API” 確保選擇“.NET 8.0”或更高版本以獲得最佳兼容性 Visual Studio 新項目對話框顯示用於 PDF 庫集成的 ASP.NET 項目模板 對於 Web 表單應用程序: 選擇“ASP.NET Web Application (.NET Framework)” 從模板選項中選擇“Web Forms” 單擊“創建”以生成項目結構 選擇具有 PDF 功能的傳統 ASP.NET 應用程序的 Web Forms 模板 如何在我的 C# 項目中安裝 IronPDF? IronPDF 提供多種安裝方法以適應不同的開發工作流程。 在 Visual Studio 中,右鍵單擊“解決方案資源管理器”中的項目,然後選擇“管理 NuGet 包...”。 從那裡,只需搜索 IronPDF 並安裝最新版本。 方法 1:使用 Visual Studio 包管理器 最簡單的方法是使用 Visual Studio 的內置 NuGet 包管理器: 右鍵單擊解決方案資源管理器中的項目 選擇“管理 NuGet 包” 單擊“瀏覽”並搜索“IronPDF” 單擊 IronPDF 包上的“安裝” 通過 Visual Studio 的解決方案資源管理器訪問 NuGet 包管理器以安裝 IronPDF 通過 Visual Studio 的項目菜單替代訪問 NuGet 包管理器 通過 NuGet 包管理器安裝 IronPDF,包含版本信息和依賴項 方法 2:使用包管理器控制台 適用於更喜歡命令行工具的開發人員: # Open Package Manager Console in Visual Studio # Tools > NuGet Package Manager > Package Manager Console Install-Package IronPdf # For specific version installation Install-Package IronPdf -Version 2025.7.0 # Open Package Manager Console in Visual Studio # Tools > NuGet Package Manager > Package Manager Console Install-Package IronPdf # For specific version installation Install-Package IronPdf -Version 2025.7.0 SHELL 方法 3:直接下載安裝 適用於無法訪問 NuGet 的環境: 從 IronPDF 的官方網站 下載 將 ZIP 文件解壓到你的項目目錄 在 Visual Studio 中,右鍵單擊“引用”→“添加引用” 瀏覽並選擇 IronPdf.dll 方法 4:使用 .NET CLI 適用於命令行愛好者和 CI/CD 管道: # Navigate to your project directory cd MyProject # Install IronPDF dotnet add package IronPdf # Restore packages dotnet restore # Navigate to your project directory cd MyProject # Install IronPDF dotnet add package IronPdf # Restore packages dotnet restore SHELL 如何安裝 PDFTron(Apryse)SDK? 由於其模塊化架構和企業重點,PDFTron 安裝涉及更多步驟。 根據你的目標平台和所需功能,流程會有所不同。 先決條件 Visual Studio 2019 或更高版本 .NET 桌面開發工作負載 .NET Framework 4.5.1+ 開發工具 PDFTron SDK 下載 手動集成步驟 提取 SDK # Example extraction path PDFNET_BASE = C:/PDFTron/PDFNetDotNet4/ # Example extraction path PDFNET_BASE = C:/PDFTron/PDFNetDotNet4/ SHELL 使用 License Key 初始化 // Initialize PDFTron with your license key pdftron.PDFNet.Initialize("your-license-key-here"); // Note: Demo keys expire after evaluation period // Contact Apryse sales for production licenses // Initialize PDFTron with your license key pdftron.PDFNet.Initialize("your-license-key-here"); // Note: Demo keys expire after evaluation period // Contact Apryse sales for production licenses ' Initialize PDFTron with your license key pdftron.PDFNet.Initialize("your-license-key-here") ' Note: Demo keys expire after evaluation period ' Contact Apryse sales for production licenses $vbLabelText $csharpLabel 複製所需的庫 將 PDFNET_BASE 中的 Lib 文件夾複製到你的項目目錄 添加對 PDFNetLoader.dll 和平台特定的 PDFNet.dll 的引用 配置 Copy Local 屬性 設置 PDFNet.dll 的 Local Copy 屬性為 False 以正確部署 PDFTron 更新 App.config <configuration> <runtime> <loadFromRemoteSources enabled="true" /> </runtime> </configuration> <configuration> <runtime> <loadFromRemoteSources enabled="true" /> </runtime> </configuration> XML 配置後組建事件 xcopy $(ProjectDir)Lib\PDFNet $(TargetDir)PDFNet /S /I /Y xcopy $(ProjectDir)Lib\PDFNet $(TargetDir)PDFNet /S /I /Y SHELL NuGet 安裝(簡化) 為了更簡化的方式: 打開 NuGet 包管理器 搜索“PDFTron.NET.x64”或平台特定的包 為你的架構安裝適當的包 通過 NuGet 包管理器安裝 PDFTron,帶有平台特定的包 PDFTron 提供的注釋類型超過 30 種,比 ComPDFKit 的 10 多種多。然而,這種廣泛的功能集在安裝期間需要仔細選擇模塊。 如何使用這些庫將 URL 轉換為 PDF? 兩個庫都提供 URL 到 PDF 轉換,但方法和能力不同。 讓我們來看看每個的實施細節和性能特徵。 使用 IronPDF 將 URL 轉換為 PDF IronPDF 的 Chrome 渲染引擎為現代網絡標準提供了非凡的支持: using IronPdf; // Initialize the Chrome renderer with advanced options var renderer = new ChromePdfRenderer(); // Configure rendering for optimal results renderer.RenderingOptions.PaperSize = PdfPaperSize.A4; renderer.RenderingOptions.MarginTop = 20; renderer.RenderingOptions.MarginBottom = 20; renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print; renderer.RenderingOptions.EnableJavaScript = true; renderer.RenderingOptions.RenderDelay = 1000; // Wait for JS execution // Handle authentication if needed renderer.LoginCredentials = new ChromeHttpLoginCredentials() { Username = "user@domain.com", Password = "secure_password" }; // Render URL to PDF with full browser capabilities var pdf = renderer.RenderUrlAsPdf("https://ironpdf.com/"); // Add metadata for document management pdf.MetaData.Author = "Development Team"; pdf.MetaData.Title = "Website Export - " + DateTime.Now.ToString("yyyy-MM-dd"); // Save with compression pdf.CompressImages(90); pdf.SaveAs("website-export.pdf"); using IronPdf; // Initialize the Chrome renderer with advanced options var renderer = new ChromePdfRenderer(); // Configure rendering for optimal results renderer.RenderingOptions.PaperSize = PdfPaperSize.A4; renderer.RenderingOptions.MarginTop = 20; renderer.RenderingOptions.MarginBottom = 20; renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print; renderer.RenderingOptions.EnableJavaScript = true; renderer.RenderingOptions.RenderDelay = 1000; // Wait for JS execution // Handle authentication if needed renderer.LoginCredentials = new ChromeHttpLoginCredentials() { Username = "user@domain.com", Password = "secure_password" }; // Render URL to PDF with full browser capabilities var pdf = renderer.RenderUrlAsPdf("https://ironpdf.com/"); // Add metadata for document management pdf.MetaData.Author = "Development Team"; pdf.MetaData.Title = "Website Export - " + DateTime.Now.ToString("yyyy-MM-dd"); // Save with compression pdf.CompressImages(90); pdf.SaveAs("website-export.pdf"); Imports IronPdf ' Initialize the Chrome renderer with advanced options Private renderer = New ChromePdfRenderer() ' Configure rendering for optimal results renderer.RenderingOptions.PaperSize = PdfPaperSize.A4 renderer.RenderingOptions.MarginTop = 20 renderer.RenderingOptions.MarginBottom = 20 renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print renderer.RenderingOptions.EnableJavaScript = True renderer.RenderingOptions.RenderDelay = 1000 ' Wait for JS execution ' Handle authentication if needed renderer.LoginCredentials = New ChromeHttpLoginCredentials() With { .Username = "user@domain.com", .Password = "secure_password" } ' Render URL to PDF with full browser capabilities Dim pdf = renderer.RenderUrlAsPdf("https://ironpdf.com/") ' Add metadata for document management pdf.MetaData.Author = "Development Team" pdf.MetaData.Title = "Website Export - " & DateTime.Now.ToString("yyyy-MM-dd") ' Save with compression pdf.CompressImages(90) pdf.SaveAs("website-export.pdf") $vbLabelText $csharpLabel IronPDF 中的 Chrome 渲染器處理複雜的場景,包括: 具有大量 JavaScript 的單頁應用程序(SPA) 帶有媒體查詢的響應設計 網絡字體和外部樣式表 AJAX 內容加載 CSS 動畫和過渡 IronPDF 主分支現在支持所有這些:nuget.org/packages/IronPdf。 最近的性能改進大大提高了渲染速度,特別是對於複雜的 Web 應用程序。 使用 PDFTron(Apryse)將 URL 轉換為 PDF PDFTron 需要 HTML2PDF 模塊來進行 Web 內容轉換: using pdftron; using pdftron.PDF; using pdftron.SDF; class UrlToPdfConverter { public static void ConvertUrlToPdf(string url, string outputPath) { // Initialize PDFTron with license PDFNet.Initialize("your-license-key"); // Create a new PDF document using (PDFDoc doc = new PDFDoc()) { // Initialize HTML2PDF converter HTML2PDF converter = new HTML2PDF(); // Configure conversion settings HTML2PDF.WebPageSettings settings = new HTML2PDF.WebPageSettings(); settings.SetPrintBackground(true); settings.SetLoadImages(true); // Set page dimensions converter.SetPaperSize(PrinterMode.PaperSize.e_letter); converter.SetMargins(0.5, 0.5, 0.5, 0.5); // Insert URL content converter.InsertFromURL(url); // Perform conversion if (converter.Convert(doc)) { // Save the resulting PDF doc.Save(outputPath, SDFDoc.SaveOptions.e_linearized); Console.WriteLine($"Successfully converted {url} to {outputPath}"); } else { Console.WriteLine("Conversion failed"); } } } } using pdftron; using pdftron.PDF; using pdftron.SDF; class UrlToPdfConverter { public static void ConvertUrlToPdf(string url, string outputPath) { // Initialize PDFTron with license PDFNet.Initialize("your-license-key"); // Create a new PDF document using (PDFDoc doc = new PDFDoc()) { // Initialize HTML2PDF converter HTML2PDF converter = new HTML2PDF(); // Configure conversion settings HTML2PDF.WebPageSettings settings = new HTML2PDF.WebPageSettings(); settings.SetPrintBackground(true); settings.SetLoadImages(true); // Set page dimensions converter.SetPaperSize(PrinterMode.PaperSize.e_letter); converter.SetMargins(0.5, 0.5, 0.5, 0.5); // Insert URL content converter.InsertFromURL(url); // Perform conversion if (converter.Convert(doc)) { // Save the resulting PDF doc.Save(outputPath, SDFDoc.SaveOptions.e_linearized); Console.WriteLine($"Successfully converted {url} to {outputPath}"); } else { Console.WriteLine("Conversion failed"); } } } } Imports pdftron Imports pdftron.PDF Imports pdftron.SDF Friend Class UrlToPdfConverter Public Shared Sub ConvertUrlToPdf(ByVal url As String, ByVal outputPath As String) ' Initialize PDFTron with license PDFNet.Initialize("your-license-key") ' Create a new PDF document Using doc As New PDFDoc() ' Initialize HTML2PDF converter Dim converter As New HTML2PDF() ' Configure conversion settings Dim settings As New HTML2PDF.WebPageSettings() settings.SetPrintBackground(True) settings.SetLoadImages(True) ' Set page dimensions converter.SetPaperSize(PrinterMode.PaperSize.e_letter) converter.SetMargins(0.5, 0.5, 0.5, 0.5) ' Insert URL content converter.InsertFromURL(url) ' Perform conversion If converter.Convert(doc) Then ' Save the resulting PDF doc.Save(outputPath, SDFDoc.SaveOptions.e_linearized) Console.WriteLine($"Successfully converted {url} to {outputPath}") Else Console.WriteLine("Conversion failed") End If End Using End Sub End Class $vbLabelText $csharpLabel PDFTron HTML2PDF 的重要考慮因素: PDFTron 的 SDK 根據技術的廣泛性(APIs,功能)和分發範圍(外部或內部用戶)進行報價。 相比於瀏覽器引擎,JavaScript 支持有限 對於複雜佈局可能需要額外配置 更適合簡單的 HTML 文檔 如何從 HTML 字符串創建 PDF? 從 HTML 字符串創建 PDF 對於生成動態報告、發票和文檔至關重要。 兩個庫對此處理方式不同。 HTML 字符串到 PDF 與 IronPDF IronPDF 擅長於渲染具有全 CSS3 和 JavaScript 支持的複雜 HTML: using IronPdf; using System.Text; public class HtmlStringToPdfConverter { public static PdfDocument GenerateInvoice(InvoiceData data) { // Build dynamic HTML with modern CSS var html = new StringBuilder(); html.Append(@" <!DOCTYPE html> <html> <head> <meta charset='UTF-8'> <style> @import url('https://fonts.googleapis.com/css2?family=Roboto:wght@300;400;700&display=swap'); body { font-family: 'Roboto', sans-serif; margin: 0; padding: 20px; color: #333; } .invoice-header { display: flex; justify-content: space-between; border-bottom: 2px solid #007bff; padding-bottom: 20px; margin-bottom: 30px; } .company-logo { width: 150px; height: auto; } .invoice-details { text-align: right; } .invoice-number { font-size: 24px; font-weight: 700; color: #007bff; } table { width: 100%; border-collapse: collapse; margin-top: 20px; } th { background-color: #f8f9fa; padding: 12px; text-align: left; border-bottom: 2px solid #dee2e6; } td { padding: 12px; border-bottom: 1px solid #dee2e6; } .total-row { font-weight: 700; font-size: 18px; background-color: #e9ecef; } @media print { body { margin: 0; } .no-print { display: none; } } </style> </head> <body> "); // Add invoice header html.Append($@" <div class='invoice-header'> <div> <img src='data:image/png;base64,{data.CompanyLogoBase64}' class='company-logo' alt='Company Logo'> <h2>{data.CompanyName}</h2> <p>{data.CompanyAddress}</p> </div> <div class='invoice-details'> <div class='invoice-number'>Invoice #{data.InvoiceNumber}</div> <p>Date: {data.InvoiceDate:yyyy-MM-dd}</p> <p>Due: {data.DueDate:yyyy-MM-dd}</p> </div> </div> "); // Add line items table html.Append(@" <table> <thead> <tr> <th>Description</th> <th>Quantity</th> <th>Unit Price</th> <th>Total</th> </tr> </thead> <tbody> "); foreach (var item in data.LineItems) { html.Append($@" <tr> <td>{item.Description}</td> <td>{item.Quantity}</td> <td>${item.UnitPrice:F2}</td> <td>${item.Total:F2}</td> </tr> "); } html.Append($@" </tbody> <tfoot> <tr class='total-row'> <td colspan='3'>Total</td> <td>${data.Total:F2}</td> </tr> </tfoot> </table> </body> </html> "); // Configure renderer for optimal output var renderer = new ChromePdfRenderer(); renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print; renderer.RenderingOptions.EnableJavaScript = true; renderer.RenderingOptions.CreatePdfFormsFromHtml = true; // Generate PDF with proper base path for assets var pdf = renderer.RenderHtmlAsPdf(html.ToString()); // Add security if needed pdf.SecuritySettings.UserPassword = data.CustomerEmail; pdf.SecuritySettings.AllowUserPrinting = true; pdf.SecuritySettings.AllowUserCopyPasteContent = false; return pdf; } } using IronPdf; using System.Text; public class HtmlStringToPdfConverter { public static PdfDocument GenerateInvoice(InvoiceData data) { // Build dynamic HTML with modern CSS var html = new StringBuilder(); html.Append(@" <!DOCTYPE html> <html> <head> <meta charset='UTF-8'> <style> @import url('https://fonts.googleapis.com/css2?family=Roboto:wght@300;400;700&display=swap'); body { font-family: 'Roboto', sans-serif; margin: 0; padding: 20px; color: #333; } .invoice-header { display: flex; justify-content: space-between; border-bottom: 2px solid #007bff; padding-bottom: 20px; margin-bottom: 30px; } .company-logo { width: 150px; height: auto; } .invoice-details { text-align: right; } .invoice-number { font-size: 24px; font-weight: 700; color: #007bff; } table { width: 100%; border-collapse: collapse; margin-top: 20px; } th { background-color: #f8f9fa; padding: 12px; text-align: left; border-bottom: 2px solid #dee2e6; } td { padding: 12px; border-bottom: 1px solid #dee2e6; } .total-row { font-weight: 700; font-size: 18px; background-color: #e9ecef; } @media print { body { margin: 0; } .no-print { display: none; } } </style> </head> <body> "); // Add invoice header html.Append($@" <div class='invoice-header'> <div> <img src='data:image/png;base64,{data.CompanyLogoBase64}' class='company-logo' alt='Company Logo'> <h2>{data.CompanyName}</h2> <p>{data.CompanyAddress}</p> </div> <div class='invoice-details'> <div class='invoice-number'>Invoice #{data.InvoiceNumber}</div> <p>Date: {data.InvoiceDate:yyyy-MM-dd}</p> <p>Due: {data.DueDate:yyyy-MM-dd}</p> </div> </div> "); // Add line items table html.Append(@" <table> <thead> <tr> <th>Description</th> <th>Quantity</th> <th>Unit Price</th> <th>Total</th> </tr> </thead> <tbody> "); foreach (var item in data.LineItems) { html.Append($@" <tr> <td>{item.Description}</td> <td>{item.Quantity}</td> <td>${item.UnitPrice:F2}</td> <td>${item.Total:F2}</td> </tr> "); } html.Append($@" </tbody> <tfoot> <tr class='total-row'> <td colspan='3'>Total</td> <td>${data.Total:F2}</td> </tr> </tfoot> </table> </body> </html> "); // Configure renderer for optimal output var renderer = new ChromePdfRenderer(); renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print; renderer.RenderingOptions.EnableJavaScript = true; renderer.RenderingOptions.CreatePdfFormsFromHtml = true; // Generate PDF with proper base path for assets var pdf = renderer.RenderHtmlAsPdf(html.ToString()); // Add security if needed pdf.SecuritySettings.UserPassword = data.CustomerEmail; pdf.SecuritySettings.AllowUserPrinting = true; pdf.SecuritySettings.AllowUserCopyPasteContent = false; return pdf; } } Imports IronPdf Imports System.Text Public Class HtmlStringToPdfConverter Public Shared Function GenerateInvoice(ByVal data As InvoiceData) As PdfDocument ' Build dynamic HTML with modern CSS Dim html = New StringBuilder() html.Append(" <!DOCTYPE html> <html> <head> <meta charset='UTF-8'> <style> @import url('https://fonts.googleapis.com/css2?family=Roboto:wght@300;400;700&display=swap'); body { font-family: 'Roboto', sans-serif; margin: 0; padding: 20px; color: #333; } .invoice-header { display: flex; justify-content: space-between; border-bottom: 2px solid #007bff; padding-bottom: 20px; margin-bottom: 30px; } .company-logo { width: 150px; height: auto; } .invoice-details { text-align: right; } .invoice-number { font-size: 24px; font-weight: 700; color: #007bff; } table { width: 100%; border-collapse: collapse; margin-top: 20px; } th { background-color: #f8f9fa; padding: 12px; text-align: left; border-bottom: 2px solid #dee2e6; } td { padding: 12px; border-bottom: 1px solid #dee2e6; } .total-row { font-weight: 700; font-size: 18px; background-color: #e9ecef; } @media print { body { margin: 0; } .no-print { display: none; } } </style> </head> <body> ") ' Add invoice header html.Append($" <div class='invoice-header'> <div> <img src='data:image/png;base64,{data.CompanyLogoBase64}' class='company-logo' alt='Company Logo'> <h2>{data.CompanyName}</h2> <p>{data.CompanyAddress}</p> </div> <div class='invoice-details'> <div class='invoice-number'>Invoice #{data.InvoiceNumber}</div> <p>Date: {data.InvoiceDate:yyyy-MM-dd}</p> <p>Due: {data.DueDate:yyyy-MM-dd}</p> </div> </div> ") ' Add line items table html.Append(" <table> <thead> <tr> <th>Description</th> <th>Quantity</th> <th>Unit Price</th> <th>Total</th> </tr> </thead> <tbody> ") For Each item In data.LineItems html.Append($" <tr> <td>{item.Description}</td> <td>{item.Quantity}</td> <td>${item.UnitPrice:F2}</td> <td>${item.Total:F2}</td> </tr> ") Next item html.Append($" </tbody> <tfoot> <tr class='total-row'> <td colspan='3'>Total</td> <td>${data.Total:F2}</td> </tr> </tfoot> </table> </body> </html> ") ' Configure renderer for optimal output Dim renderer = New ChromePdfRenderer() renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print renderer.RenderingOptions.EnableJavaScript = True renderer.RenderingOptions.CreatePdfFormsFromHtml = True ' Generate PDF with proper base path for assets Dim pdf = renderer.RenderHtmlAsPdf(html.ToString()) ' Add security if needed pdf.SecuritySettings.UserPassword = data.CustomerEmail pdf.SecuritySettings.AllowUserPrinting = True pdf.SecuritySettings.AllowUserCopyPasteContent = False Return pdf End Function End Class $vbLabelText $csharpLabel IronPDF HTML 渲染的主要優勢: 全 CSS3 支持,包括彈性盒子和網格佈局 Google 字體和網絡字體集成 JavaScript 圖表庫(Chart.js,D3.js)完美呈現 帶有視口控製的響應設計支持 用於自包含文檔的 Base64 圖像嵌入 HTML 字符串到 PDF 與 PDFTron(Apryse) PDFTron 的 HTML 字符串轉換方法: using pdftron; using pdftron.PDF; using pdftron.SDF; public class PdfTronHtmlConverter { public static void ConvertHtmlString(string htmlContent, string outputPath) { PDFNet.Initialize("your-license-key"); using (PDFDoc doc = new PDFDoc()) { // Create HTML2PDF converter instance HTML2PDF converter = new HTML2PDF(); // Configure page settings converter.SetPaperSize(PrinterMode.PaperSize.e_letter); converter.SetLandscape(false); converter.SetMargins(1.0, 1.0, 1.0, 1.0, HTML2PDF.e_inches); // Enable images and backgrounds HTML2PDF.WebPageSettings settings = new HTML2PDF.WebPageSettings(); settings.SetPrintBackground(true); settings.SetLoadImages(true); settings.SetJavaScriptDelay(1000); // Limited JS support // Insert HTML content converter.InsertFromHtmlString(htmlContent); // Convert to PDF if (converter.Convert(doc)) { // Post-processing options doc.Save(outputPath, SDFDoc.SaveOptions.e_linearized); } } } } using pdftron; using pdftron.PDF; using pdftron.SDF; public class PdfTronHtmlConverter { public static void ConvertHtmlString(string htmlContent, string outputPath) { PDFNet.Initialize("your-license-key"); using (PDFDoc doc = new PDFDoc()) { // Create HTML2PDF converter instance HTML2PDF converter = new HTML2PDF(); // Configure page settings converter.SetPaperSize(PrinterMode.PaperSize.e_letter); converter.SetLandscape(false); converter.SetMargins(1.0, 1.0, 1.0, 1.0, HTML2PDF.e_inches); // Enable images and backgrounds HTML2PDF.WebPageSettings settings = new HTML2PDF.WebPageSettings(); settings.SetPrintBackground(true); settings.SetLoadImages(true); settings.SetJavaScriptDelay(1000); // Limited JS support // Insert HTML content converter.InsertFromHtmlString(htmlContent); // Convert to PDF if (converter.Convert(doc)) { // Post-processing options doc.Save(outputPath, SDFDoc.SaveOptions.e_linearized); } } } } Imports pdftron Imports pdftron.PDF Imports pdftron.SDF Public Class PdfTronHtmlConverter Public Shared Sub ConvertHtmlString(ByVal htmlContent As String, ByVal outputPath As String) PDFNet.Initialize("your-license-key") Using doc As New PDFDoc() ' Create HTML2PDF converter instance Dim converter As New HTML2PDF() ' Configure page settings converter.SetPaperSize(PrinterMode.PaperSize.e_letter) converter.SetLandscape(False) converter.SetMargins(1.0, 1.0, 1.0, 1.0, HTML2PDF.e_inches) ' Enable images and backgrounds Dim settings As New HTML2PDF.WebPageSettings() settings.SetPrintBackground(True) settings.SetLoadImages(True) settings.SetJavaScriptDelay(1000) ' Limited JS support ' Insert HTML content converter.InsertFromHtmlString(htmlContent) ' Convert to PDF If converter.Convert(doc) Then ' Post-processing options doc.Save(outputPath, SDFDoc.SaveOptions.e_linearized) End If End Using End Sub End Class $vbLabelText $csharpLabel 需要考慮的 PDFTron HTML 限制: 基本的 CSS 支持(沒有高級佈局) 有限的 JavaScript 執行 字體嵌入需要額外配置 更適合簡單的文檔佈局 我如何將 ASPX 頁面轉換為 PDF? 將 ASPX 頁面轉換為 PDF 是 ASP.NET 應用程序中的常見要求。 IronPDF 提供了本機支持,而 PDFTron 則需要變通辦法。 使用 IronPDF 將 ASPX 轉換為 PDF IronPDF 提供了無縫的 ASPX 轉換功能,僅需一行代碼: using IronPdf; public partial class InvoicePage : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { // Render the current ASPX page as PDF on page load if (Request.QueryString["pdf"] == "true") { // Configure PDF output options AspxToPdf.RenderThisPageAsPdf( AspxToPdf.FileBehavior.InBrowser, "Invoice_" + DateTime.Now.ToString("yyyyMMdd") + ".pdf"); } } protected void ExportToPdfButton_Click(object sender, EventArgs e) { // Advanced configuration for ASPX to PDF IronPdf.AspxToPdf.RenderThisPageAsPdf( IronPdf.AspxToPdf.FileBehavior.Attachment, "Invoice.pdf", new ChromePdfRenderOptions() { PaperSize = PdfPaperSize.A4, MarginTop = 20, MarginBottom = 20, CssMediaType = PdfCssMediaType.Print, EnableJavaScript = true, CreatePdfFormsFromHtml = true, FitToPaper = true }); } } using IronPdf; public partial class InvoicePage : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { // Render the current ASPX page as PDF on page load if (Request.QueryString["pdf"] == "true") { // Configure PDF output options AspxToPdf.RenderThisPageAsPdf( AspxToPdf.FileBehavior.InBrowser, "Invoice_" + DateTime.Now.ToString("yyyyMMdd") + ".pdf"); } } protected void ExportToPdfButton_Click(object sender, EventArgs e) { // Advanced configuration for ASPX to PDF IronPdf.AspxToPdf.RenderThisPageAsPdf( IronPdf.AspxToPdf.FileBehavior.Attachment, "Invoice.pdf", new ChromePdfRenderOptions() { PaperSize = PdfPaperSize.A4, MarginTop = 20, MarginBottom = 20, CssMediaType = PdfCssMediaType.Print, EnableJavaScript = true, CreatePdfFormsFromHtml = true, FitToPaper = true }); } } Imports IronPdf Partial Public Class InvoicePage Inherits System.Web.UI.Page Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) ' Render the current ASPX page as PDF on page load If Request.QueryString("pdf") = "true" Then ' Configure PDF output options AspxToPdf.RenderThisPageAsPdf(AspxToPdf.FileBehavior.InBrowser, "Invoice_" & DateTime.Now.ToString("yyyyMMdd") & ".pdf") End If End Sub Protected Sub ExportToPdfButton_Click(ByVal sender As Object, ByVal e As EventArgs) ' Advanced configuration for ASPX to PDF IronPdf.AspxToPdf.RenderThisPageAsPdf(IronPdf.AspxToPdf.FileBehavior.Attachment, "Invoice.pdf", New ChromePdfRenderOptions() With { .PaperSize = PdfPaperSize.A4, .MarginTop = 20, .MarginBottom = 20, .CssMediaType = PdfCssMediaType.Print, .EnableJavaScript = True, .CreatePdfFormsFromHtml = True, .FitToPaper = True }) End Sub End Class $vbLabelText $csharpLabel 如果對渲染過程有更多控制: // In Global.asax.cs or Startup.cs public static void ConfigureAspxToPdf() { // Set global defaults for all ASPX to PDF conversions AspxToPdf.GlobalSettings.PaperSize = PdfPaperSize.A4; AspxToPdf.GlobalSettings.PrintHtmlBackgrounds = true; AspxToPdf.GlobalSettings.EnableJavaScript = true; AspxToPdf.GlobalSettings.CssMediaType = PdfCssMediaType.Screen; // Custom headers and footers AspxToPdf.GlobalSettings.HtmlHeader = new HtmlHeaderFooter() { HtmlFragment = "<div style='text-align: center; font-size: 12px;'>{page} of {total-pages}</div>", Height = 25 }; } // In Global.asax.cs or Startup.cs public static void ConfigureAspxToPdf() { // Set global defaults for all ASPX to PDF conversions AspxToPdf.GlobalSettings.PaperSize = PdfPaperSize.A4; AspxToPdf.GlobalSettings.PrintHtmlBackgrounds = true; AspxToPdf.GlobalSettings.EnableJavaScript = true; AspxToPdf.GlobalSettings.CssMediaType = PdfCssMediaType.Screen; // Custom headers and footers AspxToPdf.GlobalSettings.HtmlHeader = new HtmlHeaderFooter() { HtmlFragment = "<div style='text-align: center; font-size: 12px;'>{page} of {total-pages}</div>", Height = 25 }; } ' In Global.asax.cs or Startup.cs Public Shared Sub ConfigureAspxToPdf() ' Set global defaults for all ASPX to PDF conversions AspxToPdf.GlobalSettings.PaperSize = PdfPaperSize.A4 AspxToPdf.GlobalSettings.PrintHtmlBackgrounds = True AspxToPdf.GlobalSettings.EnableJavaScript = True AspxToPdf.GlobalSettings.CssMediaType = PdfCssMediaType.Screen ' Custom headers and footers AspxToPdf.GlobalSettings.HtmlHeader = New HtmlHeaderFooter() With { .HtmlFragment = "<div style='text-align: center; font-size: 12px;'>{page} of {total-pages}</div>", .Height = 25 } End Sub $vbLabelText $csharpLabel IronPDF 的 ASPX 到 PDF 功能 保留了: ViewState 和表單值 會話狀態數據 CSS 樣式和佈局 JavaScript 渲染的內容 主頁佈局 PDFTron 的 ASPX 替代方法 PDFTron 不提供直接的 ASPX 支持,需要間接方法: // Capture ASPX output as HTML, then convert public void ConvertAspxWithPdfTron() { // Render ASPX to string first StringWriter sw = new StringWriter(); HtmlTextWriter hw = new HtmlTextWriter(sw); // Render the page to HTML this.RenderControl(hw); string htmlContent = sw.ToString(); // Then use PDFTron's HTML2PDF PDFNet.Initialize("your-license-key"); using (PDFDoc doc = new PDFDoc()) { HTML2PDF converter = new HTML2PDF(); converter.InsertFromHtmlString(htmlContent); converter.Convert(doc); // Send to browser byte[] pdfBytes = doc.Save(SDFDoc.SaveOptions.e_linearized); Response.ContentType = "application/pdf"; Response.BinaryWrite(pdfBytes); Response.End(); } } // Capture ASPX output as HTML, then convert public void ConvertAspxWithPdfTron() { // Render ASPX to string first StringWriter sw = new StringWriter(); HtmlTextWriter hw = new HtmlTextWriter(sw); // Render the page to HTML this.RenderControl(hw); string htmlContent = sw.ToString(); // Then use PDFTron's HTML2PDF PDFNet.Initialize("your-license-key"); using (PDFDoc doc = new PDFDoc()) { HTML2PDF converter = new HTML2PDF(); converter.InsertFromHtmlString(htmlContent); converter.Convert(doc); // Send to browser byte[] pdfBytes = doc.Save(SDFDoc.SaveOptions.e_linearized); Response.ContentType = "application/pdf"; Response.BinaryWrite(pdfBytes); Response.End(); } } ' Capture ASPX output as HTML, then convert Public Sub ConvertAspxWithPdfTron() ' Render ASPX to string first Dim sw As New StringWriter() Dim hw As New HtmlTextWriter(sw) ' Render the page to HTML Me.RenderControl(hw) Dim htmlContent As String = sw.ToString() ' Then use PDFTron's HTML2PDF PDFNet.Initialize("your-license-key") Using doc As New PDFDoc() Dim converter As New HTML2PDF() converter.InsertFromHtmlString(htmlContent) converter.Convert(doc) ' Send to browser Dim pdfBytes() As Byte = doc.Save(SDFDoc.SaveOptions.e_linearized) Response.ContentType = "application/pdf" Response.BinaryWrite(pdfBytes) Response.End() End Using End Sub $vbLabelText $csharpLabel 如何將圖像轉換為 PDF? 圖像到 PDF 轉換對於文檔歸檔和作品集創建至關重要。 兩個庫都提供了這一功能,但方法不同。 用 IronPDF 將圖像轉換為 PDF IronPDF 提供專門的 ImageToPdfConverter 類,用於高效批量處理: using IronPdf; using System.IO; using System.Linq; public class ImagePdfGenerator { public static void CreatePhotoAlbum(string imageFolder, string outputPath) { // Get all supported image files var supportedExtensions = new[] { ".jpg", ".jpeg", ".png", ".gif", ".bmp", ".tiff", ".svg" }; var imageFiles = Directory.GetFiles(imageFolder) .Where(f => supportedExtensions.Contains(Path.GetExtension(f).ToLower())) .OrderBy(f => f); // Convert images to PDF with options var pdf = ImageToPdfConverter.ImageToPdf(imageFiles, ImageBehavior.FitToPage); // Add metadata pdf.MetaData.Title = "Photo Album"; pdf.MetaData.Author = "Photography Department"; pdf.MetaData.CreationDate = DateTime.Now; // Apply compression for smaller file size pdf.CompressImages(80); // 80% quality // Save the PDF pdf.SaveAs(outputPath); } public static void CreateThumbnailCatalog(List<ProductImage> images) { var renderer = new ChromePdfRenderer(); // Build HTML with image grid var html = @" <html> <head> <style> .image-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 20px; padding: 20px; } .image-item { text-align: center; } .image-item img { max-width: 100%; height: 200px; object-fit: cover; border: 1px solid #ddd; } .image-caption { margin-top: 10px; font-size: 12px; } </style> </head> <body> <h1>Product Catalog</h1> <div class='image-grid'>"; foreach (var image in images) { html += $@" <div class='image-item'> <img src='data:image/jpeg;base64,{image.Base64Data}' /> <div class='image-caption'>{image.ProductName}</div> </div>"; } html += "</div></body></html>"; // Render with optimal settings for images renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print; var pdf = renderer.RenderHtmlAsPdf(html); pdf.SaveAs("product-catalog.pdf"); } } using IronPdf; using System.IO; using System.Linq; public class ImagePdfGenerator { public static void CreatePhotoAlbum(string imageFolder, string outputPath) { // Get all supported image files var supportedExtensions = new[] { ".jpg", ".jpeg", ".png", ".gif", ".bmp", ".tiff", ".svg" }; var imageFiles = Directory.GetFiles(imageFolder) .Where(f => supportedExtensions.Contains(Path.GetExtension(f).ToLower())) .OrderBy(f => f); // Convert images to PDF with options var pdf = ImageToPdfConverter.ImageToPdf(imageFiles, ImageBehavior.FitToPage); // Add metadata pdf.MetaData.Title = "Photo Album"; pdf.MetaData.Author = "Photography Department"; pdf.MetaData.CreationDate = DateTime.Now; // Apply compression for smaller file size pdf.CompressImages(80); // 80% quality // Save the PDF pdf.SaveAs(outputPath); } public static void CreateThumbnailCatalog(List<ProductImage> images) { var renderer = new ChromePdfRenderer(); // Build HTML with image grid var html = @" <html> <head> <style> .image-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 20px; padding: 20px; } .image-item { text-align: center; } .image-item img { max-width: 100%; height: 200px; object-fit: cover; border: 1px solid #ddd; } .image-caption { margin-top: 10px; font-size: 12px; } </style> </head> <body> <h1>Product Catalog</h1> <div class='image-grid'>"; foreach (var image in images) { html += $@" <div class='image-item'> <img src='data:image/jpeg;base64,{image.Base64Data}' /> <div class='image-caption'>{image.ProductName}</div> </div>"; } html += "</div></body></html>"; // Render with optimal settings for images renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print; var pdf = renderer.RenderHtmlAsPdf(html); pdf.SaveAs("product-catalog.pdf"); } } Imports IronPdf Imports System.IO Imports System.Linq Public Class ImagePdfGenerator Public Shared Sub CreatePhotoAlbum(ByVal imageFolder As String, ByVal outputPath As String) ' Get all supported image files Dim supportedExtensions = { ".jpg", ".jpeg", ".png", ".gif", ".bmp", ".tiff", ".svg" } Dim imageFiles = Directory.GetFiles(imageFolder).Where(Function(f) supportedExtensions.Contains(Path.GetExtension(f).ToLower())).OrderBy(Function(f) f) ' Convert images to PDF with options Dim pdf = ImageToPdfConverter.ImageToPdf(imageFiles, ImageBehavior.FitToPage) ' Add metadata pdf.MetaData.Title = "Photo Album" pdf.MetaData.Author = "Photography Department" pdf.MetaData.CreationDate = DateTime.Now ' Apply compression for smaller file size pdf.CompressImages(80) ' 80% quality ' Save the PDF pdf.SaveAs(outputPath) End Sub Public Shared Sub CreateThumbnailCatalog(ByVal images As List(Of ProductImage)) Dim renderer = New ChromePdfRenderer() ' Build HTML with image grid Dim html = " <html> <head> <style> .image-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 20px; padding: 20px; } .image-item { text-align: center; } .image-item img { max-width: 100%; height: 200px; object-fit: cover; border: 1px solid #ddd; } .image-caption { margin-top: 10px; font-size: 12px; } </style> </head> <body> <h1>Product Catalog</h1> <div class='image-grid'>" For Each image In images html &= $" <div class='image-item'> <img src='data:image/jpeg;base64,{image.Base64Data}' /> <div class='image-caption'>{image.ProductName}</div> </div>" Next image html &= "</div></body></html>" ' Render with optimal settings for images renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print Dim pdf = renderer.RenderHtmlAsPdf(html) pdf.SaveAs("product-catalog.pdf") End Sub End Class $vbLabelText $csharpLabel 高級圖像處理功能: SVG 到 PDF 轉換,保留矢量質量 內存優化的批量處理 自定義尺寸和定位選項 EXIF 數據保留 用 PDFTron(Apryse)將圖像轉換為 PDF PDFTron 使用其轉換 API 進行圖像處理: using pdftron; using pdftron.PDF; using pdftron.SDF; public class PdfTronImageConverter { public static void ConvertImageToPdf(string imagePath, string outputPath) { PDFNet.Initialize("your-license-key"); using (PDFDoc doc = new PDFDoc()) { // Use Convert API for image to PDF pdftron.PDF.Convert.ToPdf(doc, imagePath); // Additional image processing PageIterator itr = doc.GetPageIterator(); while (itr.HasNext()) { Page page = itr.Current(); // Adjust page size to image Rect crop_box = page.GetCropBox(); page.SetMediaBox(crop_box); itr.Next(); } // Save optimized PDF doc.Save(outputPath, SDFDoc.SaveOptions.e_linearized); } } public static void CreateMultiPageImagePdf(string[] imagePaths, string outputPath) { PDFNet.Initialize("your-license-key"); using (PDFDoc doc = new PDFDoc()) { ElementBuilder builder = new ElementBuilder(); ElementWriter writer = new ElementWriter(); foreach (string imagePath in imagePaths) { // Create a new page for each image Page page = doc.PageCreate(); writer.Begin(page); // Add image to page Image img = Image.Create(doc, imagePath); Element element = builder.CreateImage(img, 0, 0, 612, 792); writer.WritePlacedElement(element); writer.End(); doc.PagePushBack(page); } doc.Save(outputPath, SDFDoc.SaveOptions.e_linearized); } } } using pdftron; using pdftron.PDF; using pdftron.SDF; public class PdfTronImageConverter { public static void ConvertImageToPdf(string imagePath, string outputPath) { PDFNet.Initialize("your-license-key"); using (PDFDoc doc = new PDFDoc()) { // Use Convert API for image to PDF pdftron.PDF.Convert.ToPdf(doc, imagePath); // Additional image processing PageIterator itr = doc.GetPageIterator(); while (itr.HasNext()) { Page page = itr.Current(); // Adjust page size to image Rect crop_box = page.GetCropBox(); page.SetMediaBox(crop_box); itr.Next(); } // Save optimized PDF doc.Save(outputPath, SDFDoc.SaveOptions.e_linearized); } } public static void CreateMultiPageImagePdf(string[] imagePaths, string outputPath) { PDFNet.Initialize("your-license-key"); using (PDFDoc doc = new PDFDoc()) { ElementBuilder builder = new ElementBuilder(); ElementWriter writer = new ElementWriter(); foreach (string imagePath in imagePaths) { // Create a new page for each image Page page = doc.PageCreate(); writer.Begin(page); // Add image to page Image img = Image.Create(doc, imagePath); Element element = builder.CreateImage(img, 0, 0, 612, 792); writer.WritePlacedElement(element); writer.End(); doc.PagePushBack(page); } doc.Save(outputPath, SDFDoc.SaveOptions.e_linearized); } } } Imports pdftron Imports pdftron.PDF Imports pdftron.SDF Public Class PdfTronImageConverter Public Shared Sub ConvertImageToPdf(ByVal imagePath As String, ByVal outputPath As String) PDFNet.Initialize("your-license-key") Using doc As New PDFDoc() ' Use Convert API for image to PDF pdftron.PDF.Convert.ToPdf(doc, imagePath) ' Additional image processing Dim itr As PageIterator = doc.GetPageIterator() Do While itr.HasNext() Dim page As Page = itr.Current() ' Adjust page size to image Dim crop_box As Rect = page.GetCropBox() page.SetMediaBox(crop_box) itr.Next() Loop ' Save optimized PDF doc.Save(outputPath, SDFDoc.SaveOptions.e_linearized) End Using End Sub Public Shared Sub CreateMultiPageImagePdf(ByVal imagePaths() As String, ByVal outputPath As String) PDFNet.Initialize("your-license-key") Using doc As New PDFDoc() Dim builder As New ElementBuilder() Dim writer As New ElementWriter() For Each imagePath As String In imagePaths ' Create a new page for each image Dim page As Page = doc.PageCreate() writer.Begin(page) ' Add image to page Dim img As Image = Image.Create(doc, imagePath) Dim element As Element = builder.CreateImage(img, 0, 0, 612, 792) writer.WritePlacedElement(element) writer.End() doc.PagePushBack(page) Next imagePath doc.Save(outputPath, SDFDoc.SaveOptions.e_linearized) End Using End Sub End Class $vbLabelText $csharpLabel 授權選項和成本有哪些? 了解授權對於預算和合規至關重要。 這兩個庫的定價模式截然不同。 IronPDF授權 IronPDF 有 3 種定價版,從 $799 到 $2,399。 IronPDF 也有免費試用版。 IronPDF 提供透明的,已發布的定價(截至 2025 年): 許可級別: Lite License:$799 1 名開發者 1 個地點 1 個項目 適合個人開發者或小型項目 Plus License:$1,199 3 名開發者 3 個地點 3 個項目 適合小型團隊 Professional License:$2,399 10 名開發者 10 個地點 10 個項目 適合成長中的團隊 無限許可:自定價格 無限開發者 無限位置 無限制專案 附加選項: 免版稅再分配:+$2,399(一次性) 可用SaaS/OEM授權 Iron Suite Bundle:購買兩個產品的價格獲得 10 個產品 所有團隊許可都是不可轉讓的,禁止在組織或代理/客戶關係之外共享許可。 PDFTron(Apryse)許可 PDFTron 的許可是基於報價的,沒有已發布的定價。 根據用戶反饋和行業報告: 估算價格範圍: 小型企業:每年 5,000 - 15,000 美元 企業:每年 30,000 - 100,000+ 美元 附加模塊需要單獨的許可 定價透明度是 PDFTRON 的一大缺點。 所有東西都是附加選項,需要具體的許可條款和合同。 用戶報告: 在 PDFTRON 上投入了 6500 美元後,他們的產品根本沒有按廣告宣傳那樣運行,讓我們空手而歸,我們的產品中一團糟。 需要複雜的許可談判 按模塊定價增加總成本 退貨政策有限 主要區別: IronPDF:永久許可,一次性付款 PDFTron:通常基於訂閱或年費 IronPDF:所有功能都包含在基本許可中 PDFTron:核心功能加收費附加項 支持選項如何比較? 開發人員支持可能會影響或破壞項目時間表。 以下是每個供應商的客戶協助方式。 IronPDF 支持 IronPDF 包括所有許可的專業支持: 每週 5 天的電子郵件工程支持 直接訪問開發團隊 典型響應時間:24-48 小時 全面的文檔 活躍的社區論壇 視頻教程和代碼示例 IronPDF 庫可以在 Azure WebApps、Functions 和 WebJobs 中使用。 它可以在 Linux 和 Windows 變體中運行,但我會推薦 Windows 變體的 Functions 和 WebApps,因為它們經過更好的測試且更容易安裝。 PDFTron(Apryse)支持 PDFTron 的支持因許可級別而異: PDFTron 的成本很高。 但對我們業務的重要性證明了這一成本的合理性,但在將此產品與其他 PDF 網絡解決方案進行比較時,它無疑是一個障礙。 對於基本許可提供基於論壇的支持 有償支持計劃可用 有時候支持可能不足,開發者會遭遇困境。 響應時間因支持級別而異 性能特徵是什麼? 性能影響用戶體驗和服務器成本。 讓我們來看看真實世界的性能數據。 IronPDF 性能 最近的改進顯著提升了 IronPDF 的性能: // Optimized batch processing example public async Task BatchConvertWithPerformanceMonitoring() { var renderer = new ChromePdfRenderer(); // Configure for performance renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Screen; renderer.RenderingOptions.RenderDelay = 0; // No delay for static content renderer.RenderingOptions.Timeout = 30; // 30 second timeout // Enable parallel processing var tasks = new List<Task<PdfDocument>>(); var urls = GetUrlsToConvert(); // Process in parallel with throttling using (var semaphore = new SemaphoreSlim(4)) // Max 4 concurrent { foreach (var url in urls) { await semaphore.WaitAsync(); tasks.Add(Task.Run(async () => { try { return await renderer.RenderUrlAsPdfAsync(url); } finally { semaphore.Release(); } })); } var results = await Task.WhenAll(tasks); // Merge results if needed var merged = PdfDocument.Merge(results); merged.SaveAs("batch-output.pdf"); } } // Optimized batch processing example public async Task BatchConvertWithPerformanceMonitoring() { var renderer = new ChromePdfRenderer(); // Configure for performance renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Screen; renderer.RenderingOptions.RenderDelay = 0; // No delay for static content renderer.RenderingOptions.Timeout = 30; // 30 second timeout // Enable parallel processing var tasks = new List<Task<PdfDocument>>(); var urls = GetUrlsToConvert(); // Process in parallel with throttling using (var semaphore = new SemaphoreSlim(4)) // Max 4 concurrent { foreach (var url in urls) { await semaphore.WaitAsync(); tasks.Add(Task.Run(async () => { try { return await renderer.RenderUrlAsPdfAsync(url); } finally { semaphore.Release(); } })); } var results = await Task.WhenAll(tasks); // Merge results if needed var merged = PdfDocument.Merge(results); merged.SaveAs("batch-output.pdf"); } } ' Optimized batch processing example Public Async Function BatchConvertWithPerformanceMonitoring() As Task Dim renderer = New ChromePdfRenderer() ' Configure for performance renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Screen renderer.RenderingOptions.RenderDelay = 0 ' No delay for static content renderer.RenderingOptions.Timeout = 30 ' 30 second timeout ' Enable parallel processing Dim tasks = New List(Of Task(Of PdfDocument))() Dim urls = GetUrlsToConvert() ' Process in parallel with throttling Using semaphore = New SemaphoreSlim(4) ' Max 4 concurrent For Each url In urls Await semaphore.WaitAsync() tasks.Add(Task.Run(Async Function() Try Return Await renderer.RenderUrlAsPdfAsync(url) Finally semaphore.Release() End Try End Function)) Next url Dim results = Await Task.WhenAll(tasks) ' Merge results if needed Dim merged = PdfDocument.Merge(results) merged.SaveAs("batch-output.pdf") End Using End Function $vbLabelText $csharpLabel 來自生產環境的性能指標: 簡單 HTML:200-400 毫秒 搭配 CSS/JS 的複雜 HTML:800-1200 毫秒 IronPDF 確實有異步渲染方法的變體,如 ironpdf.com/examples/async 所記載。 使用 Parallel.ForEach 是我用例中批量渲染 HTML 到 PDF 最高效的策略 PDFTron(Apryse)性能 PDFTron 一般提供更快的簡單轉換原始性能: 基本 HTML:100-300 毫秒 Office 文檔:500-1000 毫秒 較低的內存佔用 更適合高容量簡單文件 然而,用戶報告更複雜場景存在問題: 有時會出現 bug。一些應該在 QA 測試中注意到的重大 bug 會偶爾出現。 修復可能需要一段時間。 現代 CSS 框架和 Bootstrap 支持 隨著企業應用程序越來越多地採用現代 CSS 框架,如 Bootstrap、Tailwind 和 Foundation,準確將這些框架轉換為 PDF 的能力成為選擇 PDF 庫的關鍵標準。 IronPDF:全面的 Chromium 基於框架支持 IronPDF 的 Chrome V8 渲染引擎提供了對所有現代 CSS 框架和 Web 標准的全面支持: Bootstrap 5:完整的彈性盒子和 CSS 網格支持,帶有所有響應式功能 Bootstrap 4:與卡片組件、導航系統和表單佈局完全兼容 Tailwind CSS:所有的工具類、響應式修飾符和 JIT 編譯模式 Foundation:完整的網格系統和組件庫支持 現代 CSS3:彈性盒子、CSS 網格、CSS 變量、動畫、變換和過渡 JavaScript 框架:React、Vue、Angular 組件渲染,具有完整的交互支持 Production validation: The Bootstrap homepage and official templates convert with 98%+ browser fidelity. 代碼示例:帶有數據表的企業儀表板 using IronPdf; var renderer = new ChromePdfRenderer(); string bootstrapDashboard = @" <!DOCTYPE html> <html> <head> <link href='https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css' rel='stylesheet'> </head> <body> <div class='container-fluid py-4'> <div class='d-flex justify-content-between align-items-center mb-4'> <h1>Sales Dashboard - Q1 2025</h1> <span class='badge bg-success fs-5'>+15.3% YoY</span> </div> <div class='row g-4 mb-4'> <div class='col-md-3'> <div class='card text-center'> <div class='card-body'> <h6 class='text-muted'>Total Revenue</h6> <h2 class='text-primary'>$1.2M</h2> <small class='text-success'>↑ 12%</small> </div> </div> </div> <div class='col-md-3'> <div class='card text-center'> <div class='card-body'> <h6 class='text-muted'>New Customers</h6> <h2 class='text-info'>1,847</h2> <small class='text-success'>↑ 8%</small> </div> </div> </div> <div class='col-md-3'> <div class='card text-center'> <div class='card-body'> <h6 class='text-muted'>Avg Order Value</h6> <h2 class='text-warning'>$649</h2> <small class='text-danger'>↓ 3%</small> </div> </div> </div> <div class='col-md-3'> <div class='card text-center'> <div class='card-body'> <h6 class='text-muted'>Conversion Rate</h6> <h2 class='text-success'>3.2%</h2> <small class='text-success'>↑ 0.4%</small> </div> </div> </div> </div> <div class='card'> <div class='card-header bg-primary text-white'> <h5 class='mb-0'>Top Products by Revenue</h5> </div> <div class='card-body p-0'> <table class='table table-striped table-hover mb-0'> <thead class='table-light'> <tr> <th>Product</th> <th>Category</th> <th>Units Sold</th> <th class='text-end'>Revenue</th> <th class='text-end'>Growth</th> </tr> </thead> <tbody> <tr> <td><strong>Professional License</strong></td> <td><span class='badge bg-primary'>Software</span></td> <td>1,234</td> <td class='text-end'>$369,000</td> <td class='text-end'><span class='badge bg-success'>+18%</span></td> </tr> <tr> <td><strong>Plus License</strong></td> <td><span class='badge bg-primary'>Software</span></td> <td>2,891</td> <td class='text-end'>$289,000</td> <td class='text-end'><span class='badge bg-success'>+15%</span></td> </tr> <tr> <td><strong>Support Package</strong></td> <td><span class='badge bg-info'>Services</span></td> <td>892</td> <td class='text-end'>$178,000</td> <td class='text-end'><span class='badge bg-success'>+22%</span></td> </tr> <tr> <td><strong>Training Program</strong></td> <td><span class='badge bg-info'>Services</span></td> <td>456</td> <td class='text-end'>$91,000</td> <td class='text-end'><span class='badge bg-warning'>+5%</span></td> </tr> </tbody> </table> </div> </div> </div> </body> </html>"; var pdf = renderer.RenderHtmlAsPdf(bootstrapDashboard); pdf.SaveAs("sales-dashboard.pdf"); using IronPdf; var renderer = new ChromePdfRenderer(); string bootstrapDashboard = @" <!DOCTYPE html> <html> <head> <link href='https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css' rel='stylesheet'> </head> <body> <div class='container-fluid py-4'> <div class='d-flex justify-content-between align-items-center mb-4'> <h1>Sales Dashboard - Q1 2025</h1> <span class='badge bg-success fs-5'>+15.3% YoY</span> </div> <div class='row g-4 mb-4'> <div class='col-md-3'> <div class='card text-center'> <div class='card-body'> <h6 class='text-muted'>Total Revenue</h6> <h2 class='text-primary'>$1.2M</h2> <small class='text-success'>↑ 12%</small> </div> </div> </div> <div class='col-md-3'> <div class='card text-center'> <div class='card-body'> <h6 class='text-muted'>New Customers</h6> <h2 class='text-info'>1,847</h2> <small class='text-success'>↑ 8%</small> </div> </div> </div> <div class='col-md-3'> <div class='card text-center'> <div class='card-body'> <h6 class='text-muted'>Avg Order Value</h6> <h2 class='text-warning'>$649</h2> <small class='text-danger'>↓ 3%</small> </div> </div> </div> <div class='col-md-3'> <div class='card text-center'> <div class='card-body'> <h6 class='text-muted'>Conversion Rate</h6> <h2 class='text-success'>3.2%</h2> <small class='text-success'>↑ 0.4%</small> </div> </div> </div> </div> <div class='card'> <div class='card-header bg-primary text-white'> <h5 class='mb-0'>Top Products by Revenue</h5> </div> <div class='card-body p-0'> <table class='table table-striped table-hover mb-0'> <thead class='table-light'> <tr> <th>Product</th> <th>Category</th> <th>Units Sold</th> <th class='text-end'>Revenue</th> <th class='text-end'>Growth</th> </tr> </thead> <tbody> <tr> <td><strong>Professional License</strong></td> <td><span class='badge bg-primary'>Software</span></td> <td>1,234</td> <td class='text-end'>$369,000</td> <td class='text-end'><span class='badge bg-success'>+18%</span></td> </tr> <tr> <td><strong>Plus License</strong></td> <td><span class='badge bg-primary'>Software</span></td> <td>2,891</td> <td class='text-end'>$289,000</td> <td class='text-end'><span class='badge bg-success'>+15%</span></td> </tr> <tr> <td><strong>Support Package</strong></td> <td><span class='badge bg-info'>Services</span></td> <td>892</td> <td class='text-end'>$178,000</td> <td class='text-end'><span class='badge bg-success'>+22%</span></td> </tr> <tr> <td><strong>Training Program</strong></td> <td><span class='badge bg-info'>Services</span></td> <td>456</td> <td class='text-end'>$91,000</td> <td class='text-end'><span class='badge bg-warning'>+5%</span></td> </tr> </tbody> </table> </div> </div> </div> </body> </html>"; var pdf = renderer.RenderHtmlAsPdf(bootstrapDashboard); pdf.SaveAs("sales-dashboard.pdf"); IRON VB CONVERTER ERROR developers@ironsoftware.com $vbLabelText $csharpLabel 輸出:使用 Bootstrap 的彈性盒子指標卡、響應式網格佈局和樣式化數據表的專業企業儀表板,所有這些都在 PDF 中完美呈現。 PDFTron(Apryse):具有框架限制的 HTML2PDF 模塊 PDFTron 的 HTML 到 PDF 轉換是通過 HTML2PDF 模塊提供的,它使用一個具有現代 CSS 框架特定限制的自定義渲染引擎: 自定義引擎:不是基於 Chromium 的,這意味着 CSS3 支持是選擇性的而不是全面的 彈性盒子支持:部分實施,Bootstrap 4/5 的彈性盒子佈局可能無法正常渲染 CSS 網格:對 CSS 網格佈局規範的支持有限 JavaScript 限制:相比完整的瀏覽器引擎,JavaScript 執行受到限制 Bootstrap 3:由於基於表格的佈局,通常比 Bootstrap 4/5 更有效 需要框架測試:複雜的 Bootstrap 組件需要廣泛的測試和潛在的解決方案 根據開發者報告,使用 Bootstrap 的 PDFTron 用戶會遇到: 基於彈性盒子的導航欄渲染時會出現對齊問題 卡片組和網格系統需要 CSS 調整 PDF 輸出中未能遵循響應性工具 需要簡化 Bootstrap 組件或使用後備 CSS 企業考量:對於基於現代 Bootstrap 版本(4+)的應用程序,PDFTron 可能需要顯著的額外開發工作來處理佈局轉換,可能會抵消其其他性能優勢。 自定義引擎的使用意味著你無法獲得與真正瀏覽器相同的渲染保真度。 要獲得全面的 Bootstrap 框架支持和測試指導,請參見 Bootstrap & Flexbox CSS 指南。 什麼時候應該選擇每個庫? 做出正確選擇取決於你的具體要求和限制。 選擇IronPDF當: HTML/CSS 保真度至關重要 現代 Web 應用,具有複雜佈局 JavaScript 密集的內容 需要保存的響應設計 快速開發是優先事項 簡單的 API 減少了開發時間 豐富的代碼示例 學習曲線較低 預算透明度很重要 發布的定價使準確預算編制成為可能 沒有隱藏的成本或額外的費用 所有功能包含在基本許可中 你需要特定功能 ASPX 到 PDF 轉換 Azure 和雲優化 全面的 HTML/CSS/JS 支持 選擇 PDFTron(Apryse)的時候: 企業文檔工作流程 複雜的表單處理,支持 XFA CAD 文件轉換(DWG、DXF) 高級 Office 文檔處理 在性能優於功能時 高容量簡單文檔處理 較低的內存需求 基本的 HTML 轉換需求 專門的需求 內置文檔查看器組件 超過 30 種注釋類型 與舊系統的集成 大型企業環境 專用支持合同 定制功能開發 合規認證 總結與結論 IronPDF 和 PDFTron(Apryse)都是強大的 PDF 庫,但它們服務於不同的市場和使用案例。 IronPDF 擅長於: 現代 Web 技術支持(HTML5,CSS3,JavaScript) 對開發者友好的 API 設計 透明且合理的價格 快速應用程序開發 雲和容器化部署 PDFTron(Apryse) 的優勢包括: 企業文檔工作流程 CAD 和專用格式支持 较低的资源消耗 广泛的注释能力 遗留系统兼容性 对於大多數 .NET 開發人員來說,IronPDF 提供了最佳的功能組合、易用性和價值,適合構建現代應用程序。 其基於 Chrome 的渲染引擎確保了像素完美的 HTML 到 PDF 轉換,而簡單的 API 加快了開發速度。 對於那些需要 CAD 轉換、複雜表單處理或與遺留文檔格式一起工作的企業,PDFTron 仍然是可行的選擇。 但是,缺乏價格透明性和模塊化許可結構可能會顯著增加總成本。 開始了解 嘗試 IronPDF: 下載免費試用版 查看文檔 瀏覽代碼示例 探索 PDFTron: 请求評估 訪問 開發者門戶 在選擇之前,請務必根據你的具體用例對這兩個選項進行詳細評估。 將長期成本、支持質量和功能路線圖與技術能力一起考慮。 立即開始使用 IronPDF。 免費啟動 請注意PDFTron 是其各自所有者的註冊商標。 本網站與 PDFTron 無關,不代表其觀點,並未獲得其批准或贊助。 所有產品名稱、徽標和品牌均為其各自所有者的財產。 比較僅供信息參考,並反映撰寫時公開可用的信息。 常見問題解答 怎樣在 C# 中將 HTML 轉換為 PDF? 您可以使用 IronPDF 的 RenderHtmlAsPdf 方法將 HTML 字符串轉換為 PDF。您還可以使用 RenderHtmlFileAsPdf 將 HTML 文件轉換為 PDF。 IronPDF 和 PDFTron 在 HTML 轉換為 PDF 的效能差異是什麼? IronPDF 提供優越的 Chrome 引擎渲染,對複雜網頁內容提供更好的 JavaScript 和 CSS3 支援。PDFTron 對簡單 HTML 的轉換較快,但可能無法有效處理複雜內容。 IronPDF 和 PDFTron 的授權選項有哪些? IronPDF 提供包括所有功能的透明且永久的授權,起價 $749。PDFTron 則需要定制報價,費用可從每年 $5,000 到 $100,000+ 不等。 這些庫是否可以將 ASPX 頁面轉換為 PDF? 可以,IronPDF 可以透過 AspxToPdf.RenderThisPageAsPdf 方法在單列程式碼內轉換 ASPX 頁面為 PDF。PDFTron 不直接支持 ASPX 頁面轉換。 哪個庫更適合像 Azure 這樣的雲端環境? IronPDF 專為雲端環境(包括 Azure 和 AWS)優化,並與 Functions 和 WebApps 無縫運作。PDFTron 可能需要額外配置以達到最佳雲端部署效果。 IronPDF 或 PDFTron 能夠創建可填寫的 PDF 表單嗎? 可以,這兩個庫都支持創建可填寫的 PDF 表單。IronPDF 使用 CreatePdfFormsFromHtml 自動將 HTML 表單轉換。PDFTron 提供多種表單欄位類型,但需要更複雜的整合。 IronPDF 和 PDFTron 使用者可獲得哪些支援選項? IronPDF 提供 24/5 工程支援,直接連接開發者,通常 24-48 小時內回覆。PDFTron 的支援選項則取決於授權層級,提供基本的論壇支援和付費的直接協助。 IronPDF 和 PDFTron 在處理具密碼保護的網站時如何比較? IronPDF 支持透過 ChromeHttpLoginCredentials 做身份驗證以處理登錄表單和 HTTP 驗證,而 PDFTron 對此功能的支持有限。 Jacob Mellor 立即與工程團隊聊天 首席技术官 Jacob Mellor 是 Iron Software 的首席技術官,作為 C# PDF 技術的先鋒工程師。作為 Iron Software 核心代碼的原作者,他自開始以來塑造了公司產品架構,與 CEO Cameron Rimington 一起將其轉變為一家擁有超過 50 名員工的公司,為 NASA、特斯拉 和 全世界政府機構服務。Jacob 持有曼徹斯特大學土木工程一級榮譽学士工程學位(BEng) (1998-2001)。他於 1999 年在倫敦開設了他的第一家軟件公司,並於 2005 年製作了他的首個 .NET 組件,專注於解決 Microsoft 生態系統內的複雜問題。他的旗艦產品 IronPDF & IronSuite .NET 庫在全球 NuGet 被安裝超過 3000 萬次,其基礎代碼繼續為世界各地的開發工具提供動力。擁有 25 年的商業經驗和 41 年的編碼專業知識,Jacob 仍專注於推動企業級 C#、Java 及 Python PDF 技術的創新,同時指導新一代技術領袖。 相關文章 發表日期 11月 13, 2025 C# HTML 與 PDF 開源版本比較 IronPDF 將開源 HTML 轉 PDF 庫與 IronPDF for C# 進行比較。探索哪種解決方案能為您的 .NET 專案提供最佳的 PDF 生成功能。 閱讀更多 發表日期 10月 27, 2025 哪個 ASP.NET Core PDF 庫具有最佳價值? 發現適用於 ASP.NET Core 應用程式的最佳 PDF 庫。比較 IronPDF 的 Chrome 引擎與 Aspose 和 Syncfusion 的替代方案。 閱讀更多 發表日期 10月 27, 2025 如何使用 Aspose C# 和 IronPDF 創建 PDF 通過這份針對開發人員設計的分步指南,學習如何使用 Aspose C# 與 IronPDF 創建 PDF。 閱讀更多 IronPDF對比GemBox.Pdf:完整.NET PDF庫比較指南,用於HTML轉PDF轉換IronPDF與HiQPdf C#之比較
發表日期 11月 13, 2025 C# HTML 與 PDF 開源版本比較 IronPDF 將開源 HTML 轉 PDF 庫與 IronPDF for C# 進行比較。探索哪種解決方案能為您的 .NET 專案提供最佳的 PDF 生成功能。 閱讀更多
發表日期 10月 27, 2025 哪個 ASP.NET Core PDF 庫具有最佳價值? 發現適用於 ASP.NET Core 應用程式的最佳 PDF 庫。比較 IronPDF 的 Chrome 引擎與 Aspose 和 Syncfusion 的替代方案。 閱讀更多
發表日期 10月 27, 2025 如何使用 Aspose C# 和 IronPDF 創建 PDF 通過這份針對開發人員設計的分步指南,學習如何使用 Aspose C# 與 IronPDF 創建 PDF。 閱讀更多