產品比較 IronPDF與EvoPdf:哪個.NET PDF庫在2025年提供更好的價值? Jacob Mellor 更新日期:8月 5, 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 在構建需要 PDF 功能的現代 .NET 應用程式時,選擇合適的庫可以顯著影響您的開發速度、應用程式性能和長期維護成本。 IronPDF 和 EvoPdf 代表了 .NET 生態系統中兩種截然不同的 PDF 生成和操作方法,每種方法都有獨特的優勢,適合不同的開發場景。 這個全面的比較從渲染準確性、API 設計、性能指標、平台兼容性和總擁有成本等關鍵維度對這兩個庫進行了考察。無論您是在構建高容量文檔處理系統、實施合規的數字簽名,還是僅僅將 HTML 報告轉換為 PDF,了解這些差異將幫助您做出符合您的技術要求和預算限制的明智決定。 IronPDF 和 EvoPdf 簡介比較 在深入分析詳細比較之前,這裡是這些庫在 .NET 開發人員最關注的關鍵類別中的全面概述: class="product__comprehensive-comparison-table"> class="table-container"> class="table-number">產品比較概覽 class="table-title">IronPDF 和 EvoPdf 用於 .NET PDF 生成的比較類別特點/方面IronPDFEvoPdf關鍵優勢核心架構設計哲學簡單為主,直觀的 API功能豐富,傳統的 PDF 方法IronPDF:更快的開發API 複雜度簡單的方法,如 RenderHtmlAsPdf()多類方法,需要更多設置IronPDF:減少 60% 的代碼學習曲線1-2 天典型3-5 天典型IronPDF:更快的採用平台支持跨平台本地支持,無需額外配置需要平台特定設置IronPDF:簡單的部署.NET 版本.NET 10, 9, 8, 7, 6, 5, Core 3.1+, Framework 4.6.2+.NET 8, 7, 6, 5, Standard 2.0+, Framework 4.0+兩者:現代框架支持操作系統Windows, Linux, macOS, Docker 本地Windows, Linux, macOS, AzureIronPDF:Docker 優化HTML 到 PDF渲染引擎完整的 Chrome V8 引擎自定義 HTML 渲染引擎IronPDF:98%+ 瀏覽器忠實度CSS3/HTML5 支持完全支持良好支持(90% 覆蓋)IronPDF:現代網絡標準JavaScript 執行完整的 JavaScript 支持良好的 JavaScript 支持IronPDF:動態內容準備就緒渲染速度1.2-1.8秒典型(複雜頁面)0.8-1.2秒典型EvoPdf:對於簡單 HTML 速度更快安全和加密加密級別AES-256,自定義處理程序AES-256 標準兩者:行業標準權限選項15+ 細粒度權限8 標準權限IronPDF:更精細的控制數字簽名集成的、可視化的簽名基本簽名支持IronPDF:更簡單的簽名內容處理編輯方式真正的內容移除,一行代碼沒有內置編輯IronPDF:符合合規性水印基於 HTML/CSS,完整的樣式化模板化水印IronPDF:豐富的水印印章統一的印章類與水印功能相同IronPDF:專用工具文件轉換DOCX 到 PDF內置 DocxToPdfRenderer需要 Evo Word to PDF $450+IronPDF:無需額外費用開發者體驗代碼示例100+ 隨時執行的示例50+ 示例IronPDF:廣泛的資源文檔教程、操作指南、視頻、API 參考API 文檔和示例IronPDF:多種學習路徑錯誤訊息描述性,可行的標準錯誤報告IronPDF:更好的調試性能指標大文件處理1000 頁/分鐘水印700 頁/分鐘水印IronPDF:30%更快線程支持本地 async/await 優化多線程支持IronPDF:更好的可擴展性許可與定價入門級Lite:9(1 位開發者,1 項目)部署:0(1 台服務器,1 應用)EvoPdf:更低的初始成本團隊許可證Plus:,499(3 位開發者,3 項目)公司:$1,200(無限開發者)EvoPdf:更適合大團隊再分發+,999 免版稅包含在公司許可證中EvoPdf:內置再分發套件選項Iron Suite:$1,498(9 個產品)EVO PDF Toolkit:,400IronPDF:更多整合產品支持包括支持是,24/5 工程支持是,第一年標準支持IronPDF:直接工程訪問最佳適用於使用場景現代 Web 應用,複雜 PDF,合規性簡單的 HTML 到 PDF,基本轉換根據上下文而定 class="table-note">注意。 EvoPdf 為大型團隊提供具競爭力的定價,但缺乏編輯等一些高級功能。IronPDF 提供更全面的功能,內置文檔轉換支持。 理解 IronPDF 和 EvoPdf:核心優勢和哲學 IronPDF 在 .NET PDF 庫市場中的獨特之處是什麼? IronPDF 代表了一個以開發者生產力為核心設計的全面 PDF 解決方案。 IronPDF 在不犧牲功能的情況下提供簡單性,使 .NET 開發者能夠使用直觀的 API 創建、編輯和操作 PDF 文件,模仿熟悉的網頁開發模式。 該庫的最大特色是其基於 Chrome 的渲染引擎,這確保了像素級準確的 HTML 到 PDF 轉換,同時支持包括 CSS3、JavaScript 框架和網頁字體在內的最新網絡標準。 該庫在需要高保真文件渲染、複雜 PDF 操作和企業級安全功能的場景中表現出色。 Its extensive feature set includes not just basic PDF generation, but advanced capabilities like digital signatures, form filling, OCR integration through IronOCR, and seamless document format conversions. IronPDF 的跨平台兼容性不僅限於簡單的框架支持,而是提供了在 Windows、Linux、macOS、Docker 容器和 Azure、AWS 等雲平台上的本地性能。 EvoPdf 如何不同地處理 PDF 生成? EvoPdf 採用了一種更傳統的 PDF 操作方法,主要專注於 HTML 到 PDF 的轉換,強調定制和控制。 該庫為開發者提供了對轉換過程的細粒度控制,允許微調渲染參數、頁面佈局和轉換設置。 EvoPdf 的架構旨在為標準的網頁到 PDF 轉換場景提供可靠一致的結果。 EvoPdf 特別出色的是其輕量級的開銷和對於簡單 HTML 文檔的更快渲染速度。 對於不含複雜 JavaScript 或 CSS3 特性的簡單 HTML 頁面,EvoPdf 通常能以 0.8-1.2 秒的速度完成轉換,適合對簡單文檔進行高容量批處理。 該庫還在 ASP.NET 環境中提供了良好的伺服器端渲染支持,針對 web 應用場景進行了優化。 這些庫的跨平台能力如何比較? IronPDF 的現代跨平台架構 IronPDF 提供無縫的跨平台兼容性,不僅僅支持簡單的框架。 該庫可在以下平台上本地運行: .NET 版本支持: .NET 10, 9, 8, 7, 6, 5,和 Core 3.1+ .NET Standard 2.0+ .NET Framework 4.6.2+ 完整支持 C#、VB.NET 和 F# 操作系統兼容性: Windows(x86, x64, ARM) Linux(Ubuntu, Debian, CentOS, Alpine) macOS(Intel 和 Apple Silicon) 帶有預配置映像的 Docker 容器 雲平台集成: Azure 應用服務、功能和虛擬機 AWS Lambda 和 EC2 Google Cloud Platform Kubernetes 部署 IronPDF 的獨特之處在於其零配置部署模式。 與許多需要額外依賴或運行時安裝的 PDF 庫不同,IronPDF 所需的所有組件都包含在 NuGet 包內。 這種自包含的方法顯著減少了部署的複雜性,並消除了常見的“在我機器上可以工作”問題。 EvoPdf 的平台要求和限制 EvoPdf 支持類似範圍的 .NET 版本,但在跨平台場景中需要更仔細的配置: .NET 框架支持: .NET 8, 7, 6 和 5 .NET Standard 2.0+ .NET Framework 4.8.1, 4.7.2, 4.6.1 和 4.0+ 平台考慮: 主要針對 Windows 環境進行優化 支持 Linux 需要額外配置 通過 .NET Core 支持 macOS 雲部署需要平台特定的調整 對於跨平台部署,EvoPdf 用戶通常需要處理平台特定的依賴性和配置,特別是在 Windows 和 Linux 環境之間進行移動時。 這種額外的設置複雜性可能會影響開發時間表並增加維護開銷。 哪個庫在常見任務中提供了更好的 PDF 功能? HTML 到 PDF 轉換:渲染質量和性能 這兩個庫的最基本功能是 HTML 到 PDF 的轉換,但它們的方法和結果差異很大。 IronPDF HTML 到 PDF 示例 using IronPdf; // Initialize the Chrome-based renderer with advanced options var renderer = new ChromePdfRenderer { // Configure rendering options for optimal quality RenderingOptions = new ChromePdfRenderOptions { // Set high-quality rendering at 300 DPI for print-ready PDFs DPI = 300, // Enable JavaScript execution with custom timeout EnableJavaScript = true, RenderDelay = 2000, // Wait 2 seconds for dynamic content // Configure page layout MarginTop = 20, MarginBottom = 20, MarginLeft = 15, MarginRight = 15, // Enable modern web features CssMediaType = PdfCssMediaType.Print, ViewPortWidth = 1920, // Optimize for web fonts and images CreatePdfFormsFromHtml = true, FitToPaperMode = FitToPaperModes.Automatic } }; // Convert complex HTML with CSS3 and JavaScript var htmlContent = @" <!DOCTYPE html> <html> <head> <link href='https://fonts.googleapis.com/css2?family=Roboto:wght@300;400;700&display=swap' rel='stylesheet'> <style> body { font-family: 'Roboto', sans-serif; } .chart-container { width: 100%; height: 400px; } @media print { .no-print { display: none; } .page-break { page-break-after: always; } } </style> <script src='https://cdn.jsdelivr.net/npm/chart.js'></script> </head> <body> <h1>Dynamic Sales Report</h1> <div class='chart-container'> <canvas id='salesChart'></canvas> </div> <script> // Dynamic chart generation const ctx = document.getElementById('salesChart').getContext('2d'); new Chart(ctx, { type: 'line', data: { labels: ['Jan', 'Feb', 'Mar', 'Apr', 'May'], datasets: [{ label: 'Sales 2025', data: [65, 78, 90, 81, 96], borderColor: 'rgb(75, 192, 192)', tension: 0.4 }] } }); </script> </body> </html>"; // Generate PDF with full JavaScript chart rendering var pdf = renderer.RenderHtmlAsPdf(htmlContent); // Apply post-processing optimizations pdf.CompressImages(90); pdf.SaveAs("sales-report.pdf"); using IronPdf; // Initialize the Chrome-based renderer with advanced options var renderer = new ChromePdfRenderer { // Configure rendering options for optimal quality RenderingOptions = new ChromePdfRenderOptions { // Set high-quality rendering at 300 DPI for print-ready PDFs DPI = 300, // Enable JavaScript execution with custom timeout EnableJavaScript = true, RenderDelay = 2000, // Wait 2 seconds for dynamic content // Configure page layout MarginTop = 20, MarginBottom = 20, MarginLeft = 15, MarginRight = 15, // Enable modern web features CssMediaType = PdfCssMediaType.Print, ViewPortWidth = 1920, // Optimize for web fonts and images CreatePdfFormsFromHtml = true, FitToPaperMode = FitToPaperModes.Automatic } }; // Convert complex HTML with CSS3 and JavaScript var htmlContent = @" <!DOCTYPE html> <html> <head> <link href='https://fonts.googleapis.com/css2?family=Roboto:wght@300;400;700&display=swap' rel='stylesheet'> <style> body { font-family: 'Roboto', sans-serif; } .chart-container { width: 100%; height: 400px; } @media print { .no-print { display: none; } .page-break { page-break-after: always; } } </style> <script src='https://cdn.jsdelivr.net/npm/chart.js'></script> </head> <body> <h1>Dynamic Sales Report</h1> <div class='chart-container'> <canvas id='salesChart'></canvas> </div> <script> // Dynamic chart generation const ctx = document.getElementById('salesChart').getContext('2d'); new Chart(ctx, { type: 'line', data: { labels: ['Jan', 'Feb', 'Mar', 'Apr', 'May'], datasets: [{ label: 'Sales 2025', data: [65, 78, 90, 81, 96], borderColor: 'rgb(75, 192, 192)', tension: 0.4 }] } }); </script> </body> </html>"; // Generate PDF with full JavaScript chart rendering var pdf = renderer.RenderHtmlAsPdf(htmlContent); // Apply post-processing optimizations pdf.CompressImages(90); pdf.SaveAs("sales-report.pdf"); Imports IronPdf ' Initialize the Chrome-based renderer with advanced options Private renderer = New ChromePdfRenderer With { .RenderingOptions = New ChromePdfRenderOptions With { .DPI = 300, .EnableJavaScript = True, .RenderDelay = 2000, .MarginTop = 20, .MarginBottom = 20, .MarginLeft = 15, .MarginRight = 15, .CssMediaType = PdfCssMediaType.Print, .ViewPortWidth = 1920, .CreatePdfFormsFromHtml = True, .FitToPaperMode = FitToPaperModes.Automatic } } ' Convert complex HTML with CSS3 and JavaScript Private htmlContent = " <!DOCTYPE html> <html> <head> <link href='https://fonts.googleapis.com/css2?family=Roboto:wght@300;400;700&display=swap' rel='stylesheet'> <style> body { font-family: 'Roboto', sans-serif; } .chart-container { width: 100%; height: 400px; } @media print { .no-print { display: none; } .page-break { page-break-after: always; } } </style> <script src='https://cdn.jsdelivr.net/npm/chart.js'></script> </head> <body> <h1>Dynamic Sales Report</h1> <div class='chart-container'> <canvas id='salesChart'></canvas> </div> <script> // Dynamic chart generation const ctx = document.getElementById('salesChart').getContext('2d'); new Chart(ctx, { type: 'line', data: { labels: ['Jan', 'Feb', 'Mar', 'Apr', 'May'], datasets: [{ label: 'Sales 2025', data: [65, 78, 90, 81, 96], borderColor: 'rgb(75, 192, 192)', tension: 0.4 }] } }); </script> </body> </html>" ' Generate PDF with full JavaScript chart rendering Private pdf = renderer.RenderHtmlAsPdf(htmlContent) ' Apply post-processing optimizations pdf.CompressImages(90) pdf.SaveAs("sales-report.pdf") $vbLabelText $csharpLabel 這個 IronPDF 示例展示了幾個高級功能: Chrome V8 JavaScript 引擎:完全執行 Chart.js 以渲染動態可視化 網絡字體支持:自動下載並嵌入 Google Fonts 響應式渲染:遵循 CSS 媒體查詢進行打印優化 高 DPI 支持:以 300 DPI 生成打印就緒的 PDF 自動佈局:智能地將內容適配到頁面邊界 EvoPdf HTML 到 PDF 示例 using EvoPdf; // Create converter with configuration HtmlToPdfConverter converter = new HtmlToPdfConverter(); // Set license key (required for production use) converter.LicenseKey = "your-license-key"; // Configure conversion settings converter.PdfDocumentOptions.PdfPageSize = PdfPageSize.A4; converter.PdfDocumentOptions.PdfPageOrientation = PdfPageOrientation.Portrait; converter.PdfDocumentOptions.TopMargin = 20; converter.PdfDocumentOptions.BottomMargin = 20; converter.PdfDocumentOptions.LeftMargin = 15; converter.PdfDocumentOptions.RightMargin = 15; // Enable JavaScript execution converter.JavaScriptEnabled = true; converter.ConversionDelay = 2; // seconds // Set authentication if needed converter.AuthenticationOptions.Username = "username"; converter.AuthenticationOptions.Password = "password"; // Convert HTML string string htmlString = @" <html> <head> <style> body { font-family: Arial, sans-serif; } table { border-collapse: collapse; width: 100%; } th, td { border: 1px solid #ddd; padding: 8px; } </style> </head> <body> <h1>Invoice</h1> <table> <tr> <th>Item</th> <th>Quantity</th> <th>Price</th> </tr> <tr> <td>Product A</td> <td>5</td> <td>$50.00</td> </tr> </table> </body> </html>"; // Perform conversion byte[] pdfBytes = converter.ConvertHtml(htmlString, ""); // Save to file System.IO.File.WriteAllBytes("invoice.pdf", pdfBytes); using EvoPdf; // Create converter with configuration HtmlToPdfConverter converter = new HtmlToPdfConverter(); // Set license key (required for production use) converter.LicenseKey = "your-license-key"; // Configure conversion settings converter.PdfDocumentOptions.PdfPageSize = PdfPageSize.A4; converter.PdfDocumentOptions.PdfPageOrientation = PdfPageOrientation.Portrait; converter.PdfDocumentOptions.TopMargin = 20; converter.PdfDocumentOptions.BottomMargin = 20; converter.PdfDocumentOptions.LeftMargin = 15; converter.PdfDocumentOptions.RightMargin = 15; // Enable JavaScript execution converter.JavaScriptEnabled = true; converter.ConversionDelay = 2; // seconds // Set authentication if needed converter.AuthenticationOptions.Username = "username"; converter.AuthenticationOptions.Password = "password"; // Convert HTML string string htmlString = @" <html> <head> <style> body { font-family: Arial, sans-serif; } table { border-collapse: collapse; width: 100%; } th, td { border: 1px solid #ddd; padding: 8px; } </style> </head> <body> <h1>Invoice</h1> <table> <tr> <th>Item</th> <th>Quantity</th> <th>Price</th> </tr> <tr> <td>Product A</td> <td>5</td> <td>$50.00</td> </tr> </table> </body> </html>"; // Perform conversion byte[] pdfBytes = converter.ConvertHtml(htmlString, ""); // Save to file System.IO.File.WriteAllBytes("invoice.pdf", pdfBytes); Imports EvoPdf ' Create converter with configuration Private converter As New HtmlToPdfConverter() ' Set license key (required for production use) converter.LicenseKey = "your-license-key" ' Configure conversion settings converter.PdfDocumentOptions.PdfPageSize = PdfPageSize.A4 converter.PdfDocumentOptions.PdfPageOrientation = PdfPageOrientation.Portrait converter.PdfDocumentOptions.TopMargin = 20 converter.PdfDocumentOptions.BottomMargin = 20 converter.PdfDocumentOptions.LeftMargin = 15 converter.PdfDocumentOptions.RightMargin = 15 ' Enable JavaScript execution converter.JavaScriptEnabled = True converter.ConversionDelay = 2 ' seconds ' Set authentication if needed converter.AuthenticationOptions.Username = "username" converter.AuthenticationOptions.Password = "password" ' Convert HTML string Dim htmlString As String = " <html> <head> <style> body { font-family: Arial, sans-serif; } table { border-collapse: collapse; width: 100%; } th, td { border: 1px solid #ddd; padding: 8px; } </style> </head> <body> <h1>Invoice</h1> <table> <tr> <th>Item</th> <th>Quantity</th> <th>Price</th> </tr> <tr> <td>Product A</td> <td>5</td> <td>$50.00</td> </tr> </table> </body> </html>" ' Perform conversion Dim pdfBytes() As Byte = converter.ConvertHtml(htmlString, "") ' Save to file System.IO.File.WriteAllBytes("invoice.pdf", pdfBytes) $vbLabelText $csharpLabel EvoPdf 的方法側重於直接的 HTML 轉換,對基本的樣式和佈局提供了良好的支持。 雖然它能很好地處理標準 HTML 和 CSS,但對於像 CSS Grid、Flexbox 動畫或複雜的 JavaScript 框架等現代Web特性,可能會存在困難。 PDF 安全和加密:保護敏感文檔 在處理敏感文檔時,安全性是非常重要的。 兩個庫都提供了加密功能,但有不同的複雜程度。 IronPDF 高級安全實現 using IronPdf; using IronPdf.Security; // Load an existing PDF or create new one var pdf = PdfDocument.FromFile("confidential-report.pdf"); // Configure comprehensive security settings pdf.SecuritySettings = new SecuritySettings { // Set owner password (full permissions) OwnerPassword = "admin-complex-password-2025", // Set user password (restricted permissions) UserPassword = "user-password-readonly", // Configure granular permissions AllowAccessibilityExtractContent = false, AllowAnnotations = false, AllowAssembleDocument = false, AllowCopy = false, AllowFillForms = true, AllowFullQualityPrint = false, AllowModifyDocument = false, AllowPrint = true, // Use strongest encryption available EncryptionLevel = EncryptionLevel.AES256Bit }; // Add metadata security pdf.MetaData.Author = "Authorized Personnel Only"; pdf.MetaData.ModifiedDate = DateTime.UtcNow; pdf.MetaData.Title = "Confidential: Internal Use Only"; // Apply digital signature for authenticity var signature = new PdfSignature("certificate.pfx", "cert-password") { SigningReason = "Document Approval", SigningLocation = "Corporate Headquarters", SigningContact = "security@company.com", // Visual signature appearance IsVisible = true, X = 100, Y = 100, Width = 200, Height = 50, PageIndex = 0, // Custom appearance SignatureImage = new PdfSignatureImage("signature.png"), DateFormat = "yyyy-MM-dd HH:mm:ss" }; pdf.Sign(signature); // Add watermark for additional security pdf.ApplyWatermark("<h2 style='color:red; opacity:0.5;'>CONFIDENTIAL</h2>", 45, VerticalAlignment.Middle, HorizontalAlignment.Center); pdf.SaveAs("secured-document.pdf"); using IronPdf; using IronPdf.Security; // Load an existing PDF or create new one var pdf = PdfDocument.FromFile("confidential-report.pdf"); // Configure comprehensive security settings pdf.SecuritySettings = new SecuritySettings { // Set owner password (full permissions) OwnerPassword = "admin-complex-password-2025", // Set user password (restricted permissions) UserPassword = "user-password-readonly", // Configure granular permissions AllowAccessibilityExtractContent = false, AllowAnnotations = false, AllowAssembleDocument = false, AllowCopy = false, AllowFillForms = true, AllowFullQualityPrint = false, AllowModifyDocument = false, AllowPrint = true, // Use strongest encryption available EncryptionLevel = EncryptionLevel.AES256Bit }; // Add metadata security pdf.MetaData.Author = "Authorized Personnel Only"; pdf.MetaData.ModifiedDate = DateTime.UtcNow; pdf.MetaData.Title = "Confidential: Internal Use Only"; // Apply digital signature for authenticity var signature = new PdfSignature("certificate.pfx", "cert-password") { SigningReason = "Document Approval", SigningLocation = "Corporate Headquarters", SigningContact = "security@company.com", // Visual signature appearance IsVisible = true, X = 100, Y = 100, Width = 200, Height = 50, PageIndex = 0, // Custom appearance SignatureImage = new PdfSignatureImage("signature.png"), DateFormat = "yyyy-MM-dd HH:mm:ss" }; pdf.Sign(signature); // Add watermark for additional security pdf.ApplyWatermark("<h2 style='color:red; opacity:0.5;'>CONFIDENTIAL</h2>", 45, VerticalAlignment.Middle, HorizontalAlignment.Center); pdf.SaveAs("secured-document.pdf"); Imports IronPdf Imports IronPdf.Security ' Load an existing PDF or create new one Private pdf = PdfDocument.FromFile("confidential-report.pdf") ' Configure comprehensive security settings pdf.SecuritySettings = New SecuritySettings With { .OwnerPassword = "admin-complex-password-2025", .UserPassword = "user-password-readonly", .AllowAccessibilityExtractContent = False, .AllowAnnotations = False, .AllowAssembleDocument = False, .AllowCopy = False, .AllowFillForms = True, .AllowFullQualityPrint = False, .AllowModifyDocument = False, .AllowPrint = True, .EncryptionLevel = EncryptionLevel.AES256Bit } ' Add metadata security pdf.MetaData.Author = "Authorized Personnel Only" pdf.MetaData.ModifiedDate = DateTime.UtcNow pdf.MetaData.Title = "Confidential: Internal Use Only" ' Apply digital signature for authenticity Dim signature = New PdfSignature("certificate.pfx", "cert-password") With { .SigningReason = "Document Approval", .SigningLocation = "Corporate Headquarters", .SigningContact = "security@company.com", .IsVisible = True, .X = 100, .Y = 100, .Width = 200, .Height = 50, .PageIndex = 0, .SignatureImage = New PdfSignatureImage("signature.png"), .DateFormat = "yyyy-MM-dd HH:mm:ss" } pdf.Sign(signature) ' Add watermark for additional security pdf.ApplyWatermark("<h2 style='color:red; opacity:0.5;'>CONFIDENTIAL</h2>", 45, VerticalAlignment.Middle, HorizontalAlignment.Center) pdf.SaveAs("secured-document.pdf") $vbLabelText $csharpLabel IronPDF 的安全實現提供企業級功能: 15+ 細粒度權限:精確調整用戶的可操作內容 可視化數字簽名:包括簽名圖像和時間戳 元數據保護:保護文檔屬性和審計追踪 分層安全:結合加密、簽名和水印 EvoPdf 安全配置 using EvoPdf; // Create security manager PdfSecurityOptions securityOptions = new PdfSecurityOptions(); // Set basic security parameters securityOptions.UserPassword = "user123"; securityOptions.OwnerPassword = "owner456"; securityOptions.KeySize = EncryptionKeySize.Key256Bit; // Configure permissions securityOptions.CanPrint = true; securityOptions.CanCopyContent = false; securityOptions.CanEditContent = false; securityOptions.CanEditAnnotations = false; securityOptions.CanFillFormFields = true; securityOptions.CanAssembleDocument = false; // Apply security to existing PDF PdfSecurityManager securityManager = new PdfSecurityManager(securityOptions); securityManager.SaveSecuredPdfToFile("input.pdf", "secured-output.pdf"); using EvoPdf; // Create security manager PdfSecurityOptions securityOptions = new PdfSecurityOptions(); // Set basic security parameters securityOptions.UserPassword = "user123"; securityOptions.OwnerPassword = "owner456"; securityOptions.KeySize = EncryptionKeySize.Key256Bit; // Configure permissions securityOptions.CanPrint = true; securityOptions.CanCopyContent = false; securityOptions.CanEditContent = false; securityOptions.CanEditAnnotations = false; securityOptions.CanFillFormFields = true; securityOptions.CanAssembleDocument = false; // Apply security to existing PDF PdfSecurityManager securityManager = new PdfSecurityManager(securityOptions); securityManager.SaveSecuredPdfToFile("input.pdf", "secured-output.pdf"); Imports EvoPdf ' Create security manager Private securityOptions As New PdfSecurityOptions() ' Set basic security parameters securityOptions.UserPassword = "user123" securityOptions.OwnerPassword = "owner456" securityOptions.KeySize = EncryptionKeySize.Key256Bit ' Configure permissions securityOptions.CanPrint = True securityOptions.CanCopyContent = False securityOptions.CanEditContent = False securityOptions.CanEditAnnotations = False securityOptions.CanFillFormFields = True securityOptions.CanAssembleDocument = False ' Apply security to existing PDF Dim securityManager As New PdfSecurityManager(securityOptions) securityManager.SaveSecuredPdfToFile("input.pdf", "secured-output.pdf") $vbLabelText $csharpLabel EvoPdf 提供適合基本文檔保護的基本安全特性,但缺少一些 IronPDF 提供的高級選項。 內容編輯:合規與隱私保護 在當今隱私意識強烈的環境中,能夠永久刪除 PDF 中的敏感信息對於符合 GDPR、HIPAA 和 CCPA 等法規是至關重要的。 IronPDF 編輯示例 using IronPdf; // Load PDF containing sensitive information PdfDocument pdf = PdfDocument.FromFile("customer-records.pdf"); // Redact using multiple strategies // 1. Redact specific text patterns (SSN format) pdf.RedactTextOnAllPages(@"\b\d{3}-\d{2}-\d{4}\b", isRegex: true, new RedactionOptions { RedactionColor = Color.Black, RedactionStyle = RedactionStyle.Filled, DrawRedactionBorder = true, BorderColor = Color.Red }); // 2. Redact specific phrases pdf.RedactTextOnPages("Confidential", new[] { 0, 1, 2 }, // Specific pages caseSensitive: false); // 3. Redact regions by coordinates pdf.RedactRegion(new Rectangle(100, 200, 300, 50), 0); // 4. Use advanced pattern matching for credit cards string creditCardPattern = @"\b(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|3[47][0-9]{13})\b"; pdf.RedactTextOnAllPages(creditCardPattern, isRegex: true); // Apply OCR-based redaction for scanned documents pdf.ApplyOcr(new TesseractLanguage[] { TesseractLanguage.English }); pdf.RedactTextOnAllPages("Salary:"); // Save with audit trail pdf.MetaData.CustomProperties.Add("Redacted", DateTime.UtcNow.ToString()); pdf.MetaData.CustomProperties.Add("RedactedBy", Environment.UserName); pdf.SaveAs("redacted-records.pdf"); using IronPdf; // Load PDF containing sensitive information PdfDocument pdf = PdfDocument.FromFile("customer-records.pdf"); // Redact using multiple strategies // 1. Redact specific text patterns (SSN format) pdf.RedactTextOnAllPages(@"\b\d{3}-\d{2}-\d{4}\b", isRegex: true, new RedactionOptions { RedactionColor = Color.Black, RedactionStyle = RedactionStyle.Filled, DrawRedactionBorder = true, BorderColor = Color.Red }); // 2. Redact specific phrases pdf.RedactTextOnPages("Confidential", new[] { 0, 1, 2 }, // Specific pages caseSensitive: false); // 3. Redact regions by coordinates pdf.RedactRegion(new Rectangle(100, 200, 300, 50), 0); // 4. Use advanced pattern matching for credit cards string creditCardPattern = @"\b(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|3[47][0-9]{13})\b"; pdf.RedactTextOnAllPages(creditCardPattern, isRegex: true); // Apply OCR-based redaction for scanned documents pdf.ApplyOcr(new TesseractLanguage[] { TesseractLanguage.English }); pdf.RedactTextOnAllPages("Salary:"); // Save with audit trail pdf.MetaData.CustomProperties.Add("Redacted", DateTime.UtcNow.ToString()); pdf.MetaData.CustomProperties.Add("RedactedBy", Environment.UserName); pdf.SaveAs("redacted-records.pdf"); Imports IronPdf ' Load PDF containing sensitive information Private pdf As PdfDocument = PdfDocument.FromFile("customer-records.pdf") ' Redact using multiple strategies ' 1. Redact specific text patterns (SSN format) pdf.RedactTextOnAllPages("\b\d{3}-\d{2}-\d{4}\b", isRegex:= True, New RedactionOptions With { .RedactionColor = Color.Black, .RedactionStyle = RedactionStyle.Filled, .DrawRedactionBorder = True, .BorderColor = Color.Red }) ' 2. Redact specific phrases pdf.RedactTextOnPages("Confidential", { 0, 1, 2 }, caseSensitive:= False) ' 3. Redact regions by coordinates pdf.RedactRegion(New Rectangle(100, 200, 300, 50), 0) ' 4. Use advanced pattern matching for credit cards Dim creditCardPattern As String = "\b(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|3[47][0-9]{13})\b" pdf.RedactTextOnAllPages(creditCardPattern, isRegex:= True) ' Apply OCR-based redaction for scanned documents pdf.ApplyOcr(New TesseractLanguage() { TesseractLanguage.English }) pdf.RedactTextOnAllPages("Salary:") ' Save with audit trail pdf.MetaData.CustomProperties.Add("Redacted", DateTime.UtcNow.ToString()) pdf.MetaData.CustomProperties.Add("RedactedBy", Environment.UserName) pdf.SaveAs("redacted-records.pdf") $vbLabelText $csharpLabel IronPDF 的編輯能力包括: 真正的內容移除:永久刪除文本,而不是僅僅覆蓋它 模式識別:支持 SSNs、信用卡、電子郵件的正則表達式 視覺編輯樣式:可自定義外觀以供審計 trails OCR 集成:編輯掃描文檔中的文字 選擇性編輯:針對特定頁面或區域 EvoPdf 不包含內置的編輯功能,這對需要遵循隱私法規的應用來說是一個顯著的限制。 表單處理:創建交互式 PDF 這兩個庫都支持 PDF 表單,但創建和操作的方法不同。 IronPDF 表單示例 using IronPdf; using IronPdf.Forms; // Create a new PDF with an HTML form var html = @" <html> <body> <h2>Employee Information Form</h2> <form> <label>Full Name:</label> <input type='text' name='fullName' required /> <label>Email:</label> <input type='email' name='email' required /> <label>Department:</label> <select name='department'> <option value=''>Select Department</option> <option value='IT'>Information Technology</option> <option value='HR'>Human Resources</option> <option value='Sales'>Sales</option> </select> <label>Start Date:</label> <input type='date' name='startDate' /> <label> <input type='checkbox' name='agreement' /> I agree to the terms and conditions </label> <button type='submit'>Submit</button> </form> </body> </html>"; var renderer = new ChromePdfRenderer { RenderingOptions = new ChromePdfRenderOptions { CreatePdfFormsFromHtml = true // Enable form field creation } }; var pdf = renderer.RenderHtmlAsPdf(html); // Programmatically fill form fields pdf.Form.SetFieldValue("fullName", "John Doe"); pdf.Form.SetFieldValue("email", "john.doe@company.com"); pdf.Form.SetFieldValue("department", "IT"); pdf.Form.SetFieldValue("startDate", DateTime.Now.ToString("yyyy-MM-dd")); pdf.Form.SetCheckBoxValue("agreement", true); // Make specific fields read-only pdf.Form.Fields["email"].ReadOnly = true; // Add form field validation foreach (var field in pdf.Form.Fields) { if (field.Name == "email") { field.Annotation.BorderColor = Color.Blue; field.Annotation.BackgroundColor = Color.LightGray; } } // Flatten form (convert to static content) var flattenedPdf = pdf.Flatten(); flattenedPdf.SaveAs("completed-form.pdf"); // Or save as fillable form pdf.SaveAs("fillable-form.pdf"); using IronPdf; using IronPdf.Forms; // Create a new PDF with an HTML form var html = @" <html> <body> <h2>Employee Information Form</h2> <form> <label>Full Name:</label> <input type='text' name='fullName' required /> <label>Email:</label> <input type='email' name='email' required /> <label>Department:</label> <select name='department'> <option value=''>Select Department</option> <option value='IT'>Information Technology</option> <option value='HR'>Human Resources</option> <option value='Sales'>Sales</option> </select> <label>Start Date:</label> <input type='date' name='startDate' /> <label> <input type='checkbox' name='agreement' /> I agree to the terms and conditions </label> <button type='submit'>Submit</button> </form> </body> </html>"; var renderer = new ChromePdfRenderer { RenderingOptions = new ChromePdfRenderOptions { CreatePdfFormsFromHtml = true // Enable form field creation } }; var pdf = renderer.RenderHtmlAsPdf(html); // Programmatically fill form fields pdf.Form.SetFieldValue("fullName", "John Doe"); pdf.Form.SetFieldValue("email", "john.doe@company.com"); pdf.Form.SetFieldValue("department", "IT"); pdf.Form.SetFieldValue("startDate", DateTime.Now.ToString("yyyy-MM-dd")); pdf.Form.SetCheckBoxValue("agreement", true); // Make specific fields read-only pdf.Form.Fields["email"].ReadOnly = true; // Add form field validation foreach (var field in pdf.Form.Fields) { if (field.Name == "email") { field.Annotation.BorderColor = Color.Blue; field.Annotation.BackgroundColor = Color.LightGray; } } // Flatten form (convert to static content) var flattenedPdf = pdf.Flatten(); flattenedPdf.SaveAs("completed-form.pdf"); // Or save as fillable form pdf.SaveAs("fillable-form.pdf"); Imports IronPdf Imports IronPdf.Forms ' Create a new PDF with an HTML form Private html = " <html> <body> <h2>Employee Information Form</h2> <form> <label>Full Name:</label> <input type='text' name='fullName' required /> <label>Email:</label> <input type='email' name='email' required /> <label>Department:</label> <select name='department'> <option value=''>Select Department</option> <option value='IT'>Information Technology</option> <option value='HR'>Human Resources</option> <option value='Sales'>Sales</option> </select> <label>Start Date:</label> <input type='date' name='startDate' /> <label> <input type='checkbox' name='agreement' /> I agree to the terms and conditions </label> <button type='submit'>Submit</button> </form> </body> </html>" Private renderer = New ChromePdfRenderer With { .RenderingOptions = New ChromePdfRenderOptions With {.CreatePdfFormsFromHtml = True} } Private pdf = renderer.RenderHtmlAsPdf(html) ' Programmatically fill form fields pdf.Form.SetFieldValue("fullName", "John Doe") pdf.Form.SetFieldValue("email", "john.doe@company.com") pdf.Form.SetFieldValue("department", "IT") pdf.Form.SetFieldValue("startDate", DateTime.Now.ToString("yyyy-MM-dd")) pdf.Form.SetCheckBoxValue("agreement", True) ' Make specific fields read-only pdf.Form.Fields("email").ReadOnly = True ' Add form field validation For Each field In pdf.Form.Fields If field.Name = "email" Then field.Annotation.BorderColor = Color.Blue field.Annotation.BackgroundColor = Color.LightGray End If Next field ' Flatten form (convert to static content) Dim flattenedPdf = pdf.Flatten() flattenedPdf.SaveAs("completed-form.pdf") ' Or save as fillable form pdf.SaveAs("fillable-form.pdf") $vbLabelText $csharpLabel IronPDF 的表單處理功能: 自動表單生成:將 HTML 表單轉換為 PDF 表單 程式化操作:通過 API 填寫、閱讀和修改表單字段 字段類型:文本、複選框、單選、下拉、簽名字段 驗證:設置字段屬性和約束 表單扁平化:將填寫的表單轉換為靜態 PDF 性能基准:實際場景 性能特徵在很大程度上取決於文檔的複雜性和使用場景: 批量處理性能測試 // Performance comparison for batch processing public class PerformanceBenchmark { public static async Task RunBenchmark() { var htmlTemplates = GenerateInvoiceTemplates(1000); var stopwatch = new Stopwatch(); // IronPDF batch processing with optimization Console.WriteLine("IronPDF Batch Processing:"); stopwatch.Start(); var renderer = new ChromePdfRenderer { RenderingOptions = new ChromePdfRenderOptions { RenderDelay = 0, // No delay for static content EnableJavaScript = false, // Disable JS for speed DPI = 150 // Lower DPI for faster rendering } }; // Parallel processing var tasks = htmlTemplates.Select(async (html, index) => { var pdf = await renderer.RenderHtmlAsPdfAsync(html); await pdf.SaveAsAsync($"ironpdf-invoice-{index}.pdf"); }); await Task.WhenAll(tasks); stopwatch.Stop(); Console.WriteLine($"Time: {stopwatch.ElapsedMilliseconds}ms"); Console.WriteLine($"Average: {stopwatch.ElapsedMilliseconds / 1000.0}ms per PDF"); // Memory usage var process = Process.GetCurrentProcess(); Console.WriteLine($"Memory: {process.WorkingSet64 / 1024 / 1024}MB"); } } // Performance comparison for batch processing public class PerformanceBenchmark { public static async Task RunBenchmark() { var htmlTemplates = GenerateInvoiceTemplates(1000); var stopwatch = new Stopwatch(); // IronPDF batch processing with optimization Console.WriteLine("IronPDF Batch Processing:"); stopwatch.Start(); var renderer = new ChromePdfRenderer { RenderingOptions = new ChromePdfRenderOptions { RenderDelay = 0, // No delay for static content EnableJavaScript = false, // Disable JS for speed DPI = 150 // Lower DPI for faster rendering } }; // Parallel processing var tasks = htmlTemplates.Select(async (html, index) => { var pdf = await renderer.RenderHtmlAsPdfAsync(html); await pdf.SaveAsAsync($"ironpdf-invoice-{index}.pdf"); }); await Task.WhenAll(tasks); stopwatch.Stop(); Console.WriteLine($"Time: {stopwatch.ElapsedMilliseconds}ms"); Console.WriteLine($"Average: {stopwatch.ElapsedMilliseconds / 1000.0}ms per PDF"); // Memory usage var process = Process.GetCurrentProcess(); Console.WriteLine($"Memory: {process.WorkingSet64 / 1024 / 1024}MB"); } } ' Performance comparison for batch processing Public Class PerformanceBenchmark Public Shared Async Function RunBenchmark() As Task Dim htmlTemplates = GenerateInvoiceTemplates(1000) Dim stopwatch As New Stopwatch() ' IronPDF batch processing with optimization Console.WriteLine("IronPDF Batch Processing:") stopwatch.Start() Dim renderer = New ChromePdfRenderer With { .RenderingOptions = New ChromePdfRenderOptions With { .RenderDelay = 0, .EnableJavaScript = False, .DPI = 150 } } ' Parallel processing Dim tasks = htmlTemplates.Select(Async Function(html, index) Dim pdf = Await renderer.RenderHtmlAsPdfAsync(html) Await pdf.SaveAsAsync($"ironpdf-invoice-{index}.pdf") End Function) Await Task.WhenAll(tasks) stopwatch.Stop() Console.WriteLine($"Time: {stopwatch.ElapsedMilliseconds}ms") Console.WriteLine($"Average: {stopwatch.ElapsedMilliseconds / 1000.0}ms per PDF") ' Memory usage Dim process As System.Diagnostics.Process = System.Diagnostics.Process.GetCurrentProcess() Console.WriteLine($"Memory: {process.WorkingSet64 \ 1024 \ 1024}MB") End Function End Class $vbLabelText $csharpLabel 來自實際測試的性能發現: 簡單 HTML:EvoPdf 更快 30-40%(0.8s vs 1.2s) 複雜 JavaScript:IronPDF 更可靠,EvoPdf 可能失敗 批量處理:IronPDF 的並行化更好 內存使用量:EvoPdf 的基線更低,IronPDF 的垃圾回收更好 大文件:IronPDF 1000多頁文件處理快30% 對於不同團隊規模,哪個定價模型更具性價比? IronPDF 許可結構 IronPDF 提供各種定價選擇,包括 Lite、Plus 和 Professional 許可證,並提供選擇免版稅再分發的選項。 其許可證模式設計是為了隨著您的團隊和項目需求而擴展(截至 2025 年的定價): Lite 許可證:$799 1 名開發者 1 個地點 1 個項目 電子郵件支持 理想用於:個人開發者,小型項目 Plus 許可證:$1,199 3 名開發者 3 個地點 3 個項目 電子郵件、聊天和電話支持 理想用於:小型團隊,多個項目 Professional 許可證:$2,399 10 名開發者 10 個地點 10 個項目 具有屏幕共享的優先支援 理想用於:中到大型團隊 其他選項: 免版稅方式:+$2,399 5年支持和更新:$1,999(或 $999/年) Iron Suite:$1,498,包含所有 9 個 Iron Software 產品 EvoPdf 許可證選擇 EVO PDF Toolkit 的部署版本費用為 $650,公司版本為 $1,400,而獨立的 HTML 到 PDF 轉換器費用為 $450(部署版)和 $1,200(公司版): 部署許可證: EVO HTML 到 PDF:$450 EVO PDF Toolkit:$650 單台伺服器,單個應用 不允許再分發 第一年標準支持 公司許可證: EVO HTML 到 PDF:$1,200 EVO PDF Toolkit:$1,400 無限開發者 無限部署 完整的再分發權限 第一年優先支持 總擁有成本分析 讓我們通過實際場景了解實際的成本影響: 場景 1:有 2 名開發者的初創公司 IronPDF Lite:$799 (需要 2 個許可證 = $1,498) EvoPDF Company:$1,200(涵蓋無限開發者) 優勝者:EvoPDF 初始成本更低 場景 2:成長中的團隊(5 名開發者,多個項目) IronPDF Plus:$1,199(最多涵蓋 3 名開發者,需要 Professional) IronPDF Professional:$2,399 EvoPDF Company:$1,200 優勝者:EvoPDF 團隊擴展更合適 場景 3:需要多種 PDF 工具的企業 IronPDF Professional + IronOCR + IronBarcode:~$9,000 Iron Suite:$1,498(包含所有9個產品) EvoPdf Toolkit + 其他工具:每個工具 $1,400+ 優勝者:Iron Suite 能滿足綜合需求 場景 4:有再分發需求的 SaaS 产品 IronPDF Professional + 再分發:$4,998 EvoPDF Company:$1,200 (includes redistribution) 優勝者:EvoPDF 在再分發場景中更具優勢 現代 CSS 框架如何影響您的選擇? PDF 庫選擇中常被低估的因素之一是對現代 CSS 框架的支持。 隨著 Bootstrap、Tailwind CSS 和 Foundation 在網絡開發中的主導地位,所用庫對這些框架的支持將直接影響開發效率和輸出質量。 IronPDF:全面框架支持 IronPDF 的完整 Chrome V8 引擎為所有現代 CSS 框架提供了內置支持,無需妥協: Bootstrap 5:對複雜佈局全面的 Flexbox 和 CSS Grid 支持 Tailwind CSS:所有實用工具類均準確渲染 現代 CSS3:支持變換、動畫、自定義屬性 Production validation: Successfully renders the Bootstrap homepage and Bootstrap templates 代碼示例:Bootstrap 時間軸組件 using IronPdf; var renderer = new ChromePdfRenderer(); string bootstrapTimeline = @" <!DOCTYPE html> <html> <head> <link href='https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css' rel='stylesheet'> <style> .timeline { position: relative; padding: 20px 0; } .timeline::before { content: ''; position: absolute; left: 50%; width: 2px; height: 100%; background: #dee2e6; } .timeline-item { position: relative; margin: 20px 0; } </style> </head> <body> <div class='container py-5'> <h2 class='text-center mb-5'>Project Timeline</h2> <div class='timeline'> <div class='timeline-item'> <div class='row'> <div class='col-md-6'> <div class='card shadow-sm'> <div class='card-body'> <h5 class='card-title'>Phase 1: Planning</h5> <p class='text-muted'>Q1 2025</p> <p class='card-text'>Initial project scope and requirements gathering completed.</p> <span class='badge bg-success'>Completed</span> </div> </div> </div> </div> </div> <!-- Additional timeline items... --> </div> </div> </body> </html>"; var pdf = renderer.RenderHtmlAsPdf(bootstrapTimeline); pdf.SaveAs("project-timeline.pdf"); using IronPdf; var renderer = new ChromePdfRenderer(); string bootstrapTimeline = @" <!DOCTYPE html> <html> <head> <link href='https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css' rel='stylesheet'> <style> .timeline { position: relative; padding: 20px 0; } .timeline::before { content: ''; position: absolute; left: 50%; width: 2px; height: 100%; background: #dee2e6; } .timeline-item { position: relative; margin: 20px 0; } </style> </head> <body> <div class='container py-5'> <h2 class='text-center mb-5'>Project Timeline</h2> <div class='timeline'> <div class='timeline-item'> <div class='row'> <div class='col-md-6'> <div class='card shadow-sm'> <div class='card-body'> <h5 class='card-title'>Phase 1: Planning</h5> <p class='text-muted'>Q1 2025</p> <p class='card-text'>Initial project scope and requirements gathering completed.</p> <span class='badge bg-success'>Completed</span> </div> </div> </div> </div> </div> <!-- Additional timeline items... --> </div> </div> </body> </html>"; var pdf = renderer.RenderHtmlAsPdf(bootstrapTimeline); pdf.SaveAs("project-timeline.pdf"); IRON VB CONVERTER ERROR developers@ironsoftware.com $vbLabelText $csharpLabel EvoPdf:良好的 CSS 支持但有限制 EvoPdf 的自定義 HTML 渲染引擎提供了穩定的 CSS 支持,但對一些現代框架有限制: Bootstrap 3:一般與較老版本的 Bootstrap 兼容良好 Bootstrap 4+:Flexbox 佈局可能需要調整 CSS3 支持:良好覆盖 (~90%) 但不完整 可用變通方法:對於複雜佈局通常需要手動調整CSS 實際考量: 根據開發者經驗: 基本的 Bootstrap 組件(按鈕、警示、表格)通常渲染正確 高級組件(導航欄、模態窗口、複雜網格)可能需要定制 CSS Grid 佈局需要測試和潛在備選方案 自定義 Bootstrap 主題有時會有意想不到的渲染問題 開發影響:如果您的應用中廣泛使用了 Bootstrap 用於 UI 並且需要生成匹配網頁界面的報告或文檔,IronPDF 的無縫渲染將節省大量開發時間。EvoPdf 可能需要為 PDF 生成創建單獨、簡化的模板版本。 關於 CSS 框架兼容性的全面資訊,請參見Bootstrap & Flexbox CSS 指南。 哪些文檔和支持選項更好地為開發者服務? IronPDF 的開發者資源 IronPDF 提供詳細的文檔、24/5 工程師支持、視頻教程、社區論壇和定期更新。 支持生態系統包括: 文件質量: 全面的 API 參考 分步教程 100+ 代碼示例 YouTube 上的視頻教程 來自其他庫的遷移指南 支持渠道: 24/5 工程支持(直接訪問開發者) 回應時間:典型為 24-48 小時 Plus+ 許可證的實時聊天 Professional 許可證的電話支持 遠程共享屏幕解決複雜問題 社區論壇和 Stack Overflow 的存在 學習資源: 入門指南 架構文檔 性能優化指南 安全最佳實踐 雲部署指南 EvoPdf 的支持結構 EvoPdf 通過以下方式提供文檔和支持: 文檔: API 參考文檔 常見情境的代碼示例 網站上的實時示範部分 基本故障排除指南 支持選項: 電子郵件和電話支持(包含第一年) 標準與優先支持等級 支持論壇提供社區幫助 第一年度後需續約 主要區別在於 IronPDF 對教育內容和直接工程支持的投入,這顯著降低了學習曲線和故障排除時間。 每個庫的最佳用例是什麼? 什麼時候選擇 IronPDF IronPDF 在需要以下場景中表現出色: 1. 現代 Web 應用集成 生成動態報告的 SaaS 平台 具有圖表的電子商務網站創建發票 商業智能儀表板導出的 PDF 使用 React、Angular 或 Vue.js 的應用 2. 合規性和安全要求 需要 HIPAA 合規的醫療系統 需要審計追蹤的金融服務 包含編輯功能的法律文檔管理 有安全要求的政府應用程式 3. 複雜文檔處理 多格式文檔轉換(DOCX、HTML、影像) 對掃描文檔進行 OCR 集成 有並行執行的批量處理 具有數字簽名的文檔 4. 跨平台部署 Docker 容器化應用 基於 Linux 的雲部署 微服務架構 無伺服器功能(AWS Lambda,Azure Functions) 真實世界例子:醫療報告生成 public class HealthcareReportGenerator { private readonly ChromePdfRenderer _renderer; public HealthcareReportGenerator() { _renderer = new ChromePdfRenderer { RenderingOptions = new ChromePdfRenderOptions { DPI = 300, // High quality for medical imaging EnableJavaScript = true, RenderDelay = 3000, // Allow charts to fully render CreatePdfFormsFromHtml = true } }; } public async Task<byte[]> GeneratePatientReport(PatientData patient) { // Generate HTML with patient data and charts var html = await GenerateReportHtml(patient); // Convert to PDF var pdf = await _renderer.RenderHtmlAsPdfAsync(html); // Apply security and compliance pdf.SecuritySettings = new SecuritySettings { AllowPrint = true, AllowCopy = false, EncryptionLevel = EncryptionLevel.AES256Bit, UserPassword = patient.AccessCode }; // Redact SSN except last 4 digits pdf.RedactTextOnAllPages(@"\b\d{3}-\d{2}-(\d{4})\b", replacement: "XXX-XX-$1", isRegex: true); // Add audit metadata pdf.MetaData.Author = "Healthcare System"; pdf.MetaData.Title = $"Patient Report - {patient.PatientId}"; pdf.MetaData.CreationDate = DateTime.UtcNow; pdf.MetaData.CustomProperties.Add("HIPAA_Compliant", "true"); // Add digital signature var signature = new PdfSignature("hospital-cert.pfx", "password") { SigningReason = "Medical Record Authenticity", SigningLocation = "Hospital Name" }; pdf.Sign(signature); return pdf.BinaryData; } } public class HealthcareReportGenerator { private readonly ChromePdfRenderer _renderer; public HealthcareReportGenerator() { _renderer = new ChromePdfRenderer { RenderingOptions = new ChromePdfRenderOptions { DPI = 300, // High quality for medical imaging EnableJavaScript = true, RenderDelay = 3000, // Allow charts to fully render CreatePdfFormsFromHtml = true } }; } public async Task<byte[]> GeneratePatientReport(PatientData patient) { // Generate HTML with patient data and charts var html = await GenerateReportHtml(patient); // Convert to PDF var pdf = await _renderer.RenderHtmlAsPdfAsync(html); // Apply security and compliance pdf.SecuritySettings = new SecuritySettings { AllowPrint = true, AllowCopy = false, EncryptionLevel = EncryptionLevel.AES256Bit, UserPassword = patient.AccessCode }; // Redact SSN except last 4 digits pdf.RedactTextOnAllPages(@"\b\d{3}-\d{2}-(\d{4})\b", replacement: "XXX-XX-$1", isRegex: true); // Add audit metadata pdf.MetaData.Author = "Healthcare System"; pdf.MetaData.Title = $"Patient Report - {patient.PatientId}"; pdf.MetaData.CreationDate = DateTime.UtcNow; pdf.MetaData.CustomProperties.Add("HIPAA_Compliant", "true"); // Add digital signature var signature = new PdfSignature("hospital-cert.pfx", "password") { SigningReason = "Medical Record Authenticity", SigningLocation = "Hospital Name" }; pdf.Sign(signature); return pdf.BinaryData; } } Public Class HealthcareReportGenerator Private ReadOnly _renderer As ChromePdfRenderer Public Sub New() _renderer = New ChromePdfRenderer With { .RenderingOptions = New ChromePdfRenderOptions With { .DPI = 300, .EnableJavaScript = True, .RenderDelay = 3000, .CreatePdfFormsFromHtml = True } } End Sub Public Async Function GeneratePatientReport(ByVal patient As PatientData) As Task(Of Byte()) ' Generate HTML with patient data and charts Dim html = Await GenerateReportHtml(patient) ' Convert to PDF Dim pdf = Await _renderer.RenderHtmlAsPdfAsync(html) ' Apply security and compliance pdf.SecuritySettings = New SecuritySettings With { .AllowPrint = True, .AllowCopy = False, .EncryptionLevel = EncryptionLevel.AES256Bit, .UserPassword = patient.AccessCode } ' Redact SSN except last 4 digits pdf.RedactTextOnAllPages("\b\d{3}-\d{2}-(\d{4})\b", replacement:= "XXX-XX-$1", isRegex:= True) ' Add audit metadata pdf.MetaData.Author = "Healthcare System" pdf.MetaData.Title = $"Patient Report - {patient.PatientId}" pdf.MetaData.CreationDate = DateTime.UtcNow pdf.MetaData.CustomProperties.Add("HIPAA_Compliant", "true") ' Add digital signature Dim signature = New PdfSignature("hospital-cert.pfx", "password") With { .SigningReason = "Medical Record Authenticity", .SigningLocation = "Hospital Name" } pdf.Sign(signature) Return pdf.BinaryData End Function End Class $vbLabelText $csharpLabel 何時選擇 EvoPdf EvoPdf 適合於: 1. 簡單的 HTML 到 PDF 轉換 不含複雜 JavaScript 的基本報告 靜態 HTML 模板 簡單發票和收據 使用一致模板的大量文檔生成 2. 精打細算的團隊 單個許可證包含無限開發者 初始成本較低,適用於基本功能 不需要高級 PDF 操作的項目 3. 特定服務器環境 以 Windows 為中心的部署 使用簡單 PDF 要求的應用程式 與舊系統的集成 4. 大量簡單轉換 郵件到 PDF 歸檔 靜態報告生成 文檔系統 可打印文檔創建 實際案例:發票生成系統 public class InvoiceGenerator { private readonly HtmlToPdfConverter _converter; public InvoiceGenerator() { _converter = new HtmlToPdfConverter { LicenseKey = "your-license-key", JavaScriptEnabled = false, // Not needed for static invoices ConversionDelay = 0 }; // Configure for A4 invoices _converter.PdfDocumentOptions.PdfPageSize = PdfPageSize.A4; _converter.PdfDocumentOptions.TopMargin = 30; _converter.PdfDocumentOptions.BottomMargin = 30; } public byte[] GenerateInvoice(InvoiceData data) { // Load HTML template var template = File.ReadAllText("invoice-template.html"); // Simple string replacement for data var html = template .Replace("{{InvoiceNumber}}", data.InvoiceNumber) .Replace("{{Date}}", data.Date.ToString("yyyy-MM-dd")) .Replace("{{CustomerName}}", data.CustomerName) .Replace("{{Total}}", data.Total.ToString("C")); // Convert to PDF return _converter.ConvertHtml(html, ""); } } public class InvoiceGenerator { private readonly HtmlToPdfConverter _converter; public InvoiceGenerator() { _converter = new HtmlToPdfConverter { LicenseKey = "your-license-key", JavaScriptEnabled = false, // Not needed for static invoices ConversionDelay = 0 }; // Configure for A4 invoices _converter.PdfDocumentOptions.PdfPageSize = PdfPageSize.A4; _converter.PdfDocumentOptions.TopMargin = 30; _converter.PdfDocumentOptions.BottomMargin = 30; } public byte[] GenerateInvoice(InvoiceData data) { // Load HTML template var template = File.ReadAllText("invoice-template.html"); // Simple string replacement for data var html = template .Replace("{{InvoiceNumber}}", data.InvoiceNumber) .Replace("{{Date}}", data.Date.ToString("yyyy-MM-dd")) .Replace("{{CustomerName}}", data.CustomerName) .Replace("{{Total}}", data.Total.ToString("C")); // Convert to PDF return _converter.ConvertHtml(html, ""); } } Public Class InvoiceGenerator Private ReadOnly _converter As HtmlToPdfConverter Public Sub New() _converter = New HtmlToPdfConverter With { .LicenseKey = "your-license-key", .JavaScriptEnabled = False, .ConversionDelay = 0 } ' Configure for A4 invoices _converter.PdfDocumentOptions.PdfPageSize = PdfPageSize.A4 _converter.PdfDocumentOptions.TopMargin = 30 _converter.PdfDocumentOptions.BottomMargin = 30 End Sub Public Function GenerateInvoice(ByVal data As InvoiceData) As Byte() ' Load HTML template Dim template = File.ReadAllText("invoice-template.html") ' Simple string replacement for data Dim html = template.Replace("{{InvoiceNumber}}", data.InvoiceNumber).Replace("{{Date}}", data.Date.ToString("yyyy-MM-dd")).Replace("{{CustomerName}}", data.CustomerName).Replace("{{Total}}", data.Total.ToString("C")) ' Convert to PDF Return _converter.ConvertHtml(html, "") End Function End Class $vbLabelText $csharpLabel 高級實施模式和最佳實踐 在生產中優化性能 兩個庫都受益於適當的配置和使用模式: IronPDF 性能優化 public class OptimizedPdfService { private readonly ChromePdfRenderer _renderer; private readonly SemaphoreSlim _semaphore; public OptimizedPdfService(int maxConcurrency = 4) { _semaphore = new SemaphoreSlim(maxConcurrency); _renderer = new ChromePdfRenderer { RenderingOptions = new ChromePdfRenderOptions { // Optimize for performance EnableJavaScript = false, // Only if not needed RenderDelay = 0, DPI = 150, // Balance quality vs speed CssMediaType = PdfCssMediaType.Screen, Timeout = 30, // Memory optimization OptimizeForLowMemory = true } }; // Enable connection pooling Installation.ChromeGpuMode = ChromeGpuModes.Disabled; Installation.LinuxAndDockerDependenciesAutoConfig = false; } public async Task<byte[]> GeneratePdfAsync(string html) { await _semaphore.WaitAsync(); try { var pdf = await _renderer.RenderHtmlAsPdfAsync(html); // Optimize file size pdf.CompressImages(85); pdf.RemoveUnusedResources(); return pdf.BinaryData; } finally { _semaphore.Release(); } } } public class OptimizedPdfService { private readonly ChromePdfRenderer _renderer; private readonly SemaphoreSlim _semaphore; public OptimizedPdfService(int maxConcurrency = 4) { _semaphore = new SemaphoreSlim(maxConcurrency); _renderer = new ChromePdfRenderer { RenderingOptions = new ChromePdfRenderOptions { // Optimize for performance EnableJavaScript = false, // Only if not needed RenderDelay = 0, DPI = 150, // Balance quality vs speed CssMediaType = PdfCssMediaType.Screen, Timeout = 30, // Memory optimization OptimizeForLowMemory = true } }; // Enable connection pooling Installation.ChromeGpuMode = ChromeGpuModes.Disabled; Installation.LinuxAndDockerDependenciesAutoConfig = false; } public async Task<byte[]> GeneratePdfAsync(string html) { await _semaphore.WaitAsync(); try { var pdf = await _renderer.RenderHtmlAsPdfAsync(html); // Optimize file size pdf.CompressImages(85); pdf.RemoveUnusedResources(); return pdf.BinaryData; } finally { _semaphore.Release(); } } } Public Class OptimizedPdfService Private ReadOnly _renderer As ChromePdfRenderer Private ReadOnly _semaphore As SemaphoreSlim Public Sub New(Optional ByVal maxConcurrency As Integer = 4) _semaphore = New SemaphoreSlim(maxConcurrency) _renderer = New ChromePdfRenderer With { .RenderingOptions = New ChromePdfRenderOptions With { .EnableJavaScript = False, .RenderDelay = 0, .DPI = 150, .CssMediaType = PdfCssMediaType.Screen, .Timeout = 30, .OptimizeForLowMemory = True } } ' Enable connection pooling Installation.ChromeGpuMode = ChromeGpuModes.Disabled Installation.LinuxAndDockerDependenciesAutoConfig = False End Sub Public Async Function GeneratePdfAsync(ByVal html As String) As Task(Of Byte()) Await _semaphore.WaitAsync() Try Dim pdf = Await _renderer.RenderHtmlAsPdfAsync(html) ' Optimize file size pdf.CompressImages(85) pdf.RemoveUnusedResources() Return pdf.BinaryData Finally _semaphore.Release() End Try End Function End Class $vbLabelText $csharpLabel EvoPdf 性能模式 public class EvoPdfOptimizedService { private readonly ObjectPool<HtmlToPdfConverter> _converterPool; public EvoPdfOptimizedService() { // Create object pool for converter reuse _converterPool = new DefaultObjectPool<HtmlToPdfConverter>( new ConverterPoolPolicy(), Environment.ProcessorCount * 2); } public async Task<byte[]> GeneratePdfAsync(string html) { var converter = _converterPool.Get(); try { // Configure for speed converter.ConversionDelay = 0; converter.JavaScriptEnabled = false; // Use async pattern return await Task.Run(() => converter.ConvertHtml(html, "")); } finally { _converterPool.Return(converter); } } private class ConverterPoolPolicy : IPooledObjectPolicy<HtmlToPdfConverter> { public HtmlToPdfConverter Create() { return new HtmlToPdfConverter { LicenseKey = "your-license-key" }; } public bool Return(HtmlToPdfConverter obj) { // Reset to default state obj.ConversionDelay = 2; return true; } } } public class EvoPdfOptimizedService { private readonly ObjectPool<HtmlToPdfConverter> _converterPool; public EvoPdfOptimizedService() { // Create object pool for converter reuse _converterPool = new DefaultObjectPool<HtmlToPdfConverter>( new ConverterPoolPolicy(), Environment.ProcessorCount * 2); } public async Task<byte[]> GeneratePdfAsync(string html) { var converter = _converterPool.Get(); try { // Configure for speed converter.ConversionDelay = 0; converter.JavaScriptEnabled = false; // Use async pattern return await Task.Run(() => converter.ConvertHtml(html, "")); } finally { _converterPool.Return(converter); } } private class ConverterPoolPolicy : IPooledObjectPolicy<HtmlToPdfConverter> { public HtmlToPdfConverter Create() { return new HtmlToPdfConverter { LicenseKey = "your-license-key" }; } public bool Return(HtmlToPdfConverter obj) { // Reset to default state obj.ConversionDelay = 2; return true; } } } Public Class EvoPdfOptimizedService Private ReadOnly _converterPool As ObjectPool(Of HtmlToPdfConverter) Public Sub New() ' Create object pool for converter reuse _converterPool = New DefaultObjectPool(Of HtmlToPdfConverter)(New ConverterPoolPolicy(), Environment.ProcessorCount * 2) End Sub Public Async Function GeneratePdfAsync(ByVal html As String) As Task(Of Byte()) Dim converter = _converterPool.Get() Try ' Configure for speed converter.ConversionDelay = 0 converter.JavaScriptEnabled = False ' Use async pattern Return Await Task.Run(Function() converter.ConvertHtml(html, "")) Finally _converterPool.Return(converter) End Try End Function Private Class ConverterPoolPolicy Implements IPooledObjectPolicy(Of HtmlToPdfConverter) Public Function Create() As HtmlToPdfConverter Return New HtmlToPdfConverter With {.LicenseKey = "your-license-key"} End Function Public Function [Return](ByVal obj As HtmlToPdfConverter) As Boolean ' Reset to default state obj.ConversionDelay = 2 Return True End Function End Class End Class $vbLabelText $csharpLabel 錯誤處理和調試 健全的錯誤處理對於生產應用至關重要: IronPDF 錯誤處理 public class RobustPdfGenerator { private readonly ILogger<RobustPdfGenerator> _logger; private readonly ChromePdfRenderer _renderer; public async Task<Result<byte[]>> TryGeneratePdfAsync(string html) { try { // Enable detailed logging IronPdf.Logging.Logger.EnableDebugging = true; IronPdf.Logging.Logger.LogFilePath = "ironpdf.log"; IronPdf.Logging.Logger.LoggingLevel = LoggingLevels.All; var pdf = await _renderer.RenderHtmlAsPdfAsync(html); // Validate output if (pdf.PageCount == 0) { return Result<byte[]>.Failure("Generated PDF has no pages"); } return Result<byte[]>.Success(pdf.BinaryData); } catch (IronPdf.Exceptions.IronPdfRenderException ex) { _logger.LogError(ex, "Rendering failed: {Message}", ex.Message); // Attempt fallback with simpler settings return await FallbackRender(html); } catch (Exception ex) { _logger.LogError(ex, "Unexpected error in PDF generation"); return Result<byte[]>.Failure($"PDF generation failed: {ex.Message}"); } } private async Task<Result<byte[]>> FallbackRender(string html) { var fallbackRenderer = new ChromePdfRenderer { RenderingOptions = new ChromePdfRenderOptions { EnableJavaScript = false, DPI = 96, Timeout = 60 } }; try { var pdf = await fallbackRenderer.RenderHtmlAsPdfAsync(html); return Result<byte[]>.Success(pdf.BinaryData); } catch (Exception ex) { return Result<byte[]>.Failure($"Fallback render failed: {ex.Message}"); } } } public class RobustPdfGenerator { private readonly ILogger<RobustPdfGenerator> _logger; private readonly ChromePdfRenderer _renderer; public async Task<Result<byte[]>> TryGeneratePdfAsync(string html) { try { // Enable detailed logging IronPdf.Logging.Logger.EnableDebugging = true; IronPdf.Logging.Logger.LogFilePath = "ironpdf.log"; IronPdf.Logging.Logger.LoggingLevel = LoggingLevels.All; var pdf = await _renderer.RenderHtmlAsPdfAsync(html); // Validate output if (pdf.PageCount == 0) { return Result<byte[]>.Failure("Generated PDF has no pages"); } return Result<byte[]>.Success(pdf.BinaryData); } catch (IronPdf.Exceptions.IronPdfRenderException ex) { _logger.LogError(ex, "Rendering failed: {Message}", ex.Message); // Attempt fallback with simpler settings return await FallbackRender(html); } catch (Exception ex) { _logger.LogError(ex, "Unexpected error in PDF generation"); return Result<byte[]>.Failure($"PDF generation failed: {ex.Message}"); } } private async Task<Result<byte[]>> FallbackRender(string html) { var fallbackRenderer = new ChromePdfRenderer { RenderingOptions = new ChromePdfRenderOptions { EnableJavaScript = false, DPI = 96, Timeout = 60 } }; try { var pdf = await fallbackRenderer.RenderHtmlAsPdfAsync(html); return Result<byte[]>.Success(pdf.BinaryData); } catch (Exception ex) { return Result<byte[]>.Failure($"Fallback render failed: {ex.Message}"); } } } Public Class RobustPdfGenerator Private ReadOnly _logger As ILogger(Of RobustPdfGenerator) Private ReadOnly _renderer As ChromePdfRenderer Public Async Function TryGeneratePdfAsync(ByVal html As String) As Task(Of Result(Of Byte())) Try ' Enable detailed logging IronPdf.Logging.Logger.EnableDebugging = True IronPdf.Logging.Logger.LogFilePath = "ironpdf.log" IronPdf.Logging.Logger.LoggingLevel = LoggingLevels.All Dim pdf = Await _renderer.RenderHtmlAsPdfAsync(html) ' Validate output If pdf.PageCount = 0 Then Return Result(Of Byte()).Failure("Generated PDF has no pages") End If Return Result(Of Byte()).Success(pdf.BinaryData) Catch ex As IronPdf.Exceptions.IronPdfRenderException _logger.LogError(ex, "Rendering failed: {Message}", ex.Message) ' Attempt fallback with simpler settings Return Await FallbackRender(html) Catch ex As Exception _logger.LogError(ex, "Unexpected error in PDF generation") Return Result(Of Byte()).Failure($"PDF generation failed: {ex.Message}") End Try End Function Private Async Function FallbackRender(ByVal html As String) As Task(Of Result(Of Byte())) Dim fallbackRenderer = New ChromePdfRenderer With { .RenderingOptions = New ChromePdfRenderOptions With { .EnableJavaScript = False, .DPI = 96, .Timeout = 60 } } Try Dim pdf = Await fallbackRenderer.RenderHtmlAsPdfAsync(html) Return Result(Of Byte()).Success(pdf.BinaryData) Catch ex As Exception Return Result(Of Byte()).Failure($"Fallback render failed: {ex.Message}") End Try End Function End Class $vbLabelText $csharpLabel 行業特定的實施案例 金融服務:合規性 金融機構需要特定功能以滿足合規: public class FinancialStatementGenerator { public async Task<byte[]> GenerateQuarterlyReport(FinancialData data) { var renderer = new ChromePdfRenderer(); // Generate report with charts and tables var html = await BuildFinancialReportHtml(data); var pdf = renderer.RenderHtmlAsPdf(html); // Add compliance watermark pdf.ApplyWatermark(@" <div style='text-align: center; color: rgba(0,0,0,0.1); font-size: 120px; transform: rotate(-45deg); font-family: Arial;'> DRAFT </div>", 30, VerticalAlignment.Middle, HorizontalAlignment.Center); // Embed audit information pdf.MetaData.Author = "Financial Reporting System"; pdf.MetaData.Keywords = "Quarterly Report, SOX Compliant"; pdf.MetaData.CustomProperties.Add("ReportPeriod", data.Quarter); pdf.MetaData.CustomProperties.Add("GeneratedBy", Environment.UserName); pdf.MetaData.CustomProperties.Add("Timestamp", DateTime.UtcNow.ToString("O")); // Apply tamper-evident signature var cert = new X509Certificate2("financial-cert.pfx", "password"); var signature = new PdfSignature(cert) { SigningReason = "Financial Report Certification", SigningLocation = "Corporate Finance Department", IsVisible = true, SignatureImage = new PdfSignatureImage("cfo-signature.png") }; pdf.Sign(signature); // Lock document from editing pdf.SecuritySettings = new SecuritySettings { AllowModifyDocument = false, AllowCopy = true, AllowPrint = true, EncryptionLevel = EncryptionLevel.AES256Bit }; return pdf.BinaryData; } } public class FinancialStatementGenerator { public async Task<byte[]> GenerateQuarterlyReport(FinancialData data) { var renderer = new ChromePdfRenderer(); // Generate report with charts and tables var html = await BuildFinancialReportHtml(data); var pdf = renderer.RenderHtmlAsPdf(html); // Add compliance watermark pdf.ApplyWatermark(@" <div style='text-align: center; color: rgba(0,0,0,0.1); font-size: 120px; transform: rotate(-45deg); font-family: Arial;'> DRAFT </div>", 30, VerticalAlignment.Middle, HorizontalAlignment.Center); // Embed audit information pdf.MetaData.Author = "Financial Reporting System"; pdf.MetaData.Keywords = "Quarterly Report, SOX Compliant"; pdf.MetaData.CustomProperties.Add("ReportPeriod", data.Quarter); pdf.MetaData.CustomProperties.Add("GeneratedBy", Environment.UserName); pdf.MetaData.CustomProperties.Add("Timestamp", DateTime.UtcNow.ToString("O")); // Apply tamper-evident signature var cert = new X509Certificate2("financial-cert.pfx", "password"); var signature = new PdfSignature(cert) { SigningReason = "Financial Report Certification", SigningLocation = "Corporate Finance Department", IsVisible = true, SignatureImage = new PdfSignatureImage("cfo-signature.png") }; pdf.Sign(signature); // Lock document from editing pdf.SecuritySettings = new SecuritySettings { AllowModifyDocument = false, AllowCopy = true, AllowPrint = true, EncryptionLevel = EncryptionLevel.AES256Bit }; return pdf.BinaryData; } } Public Class FinancialStatementGenerator Public Async Function GenerateQuarterlyReport(ByVal data As FinancialData) As Task(Of Byte()) Dim renderer = New ChromePdfRenderer() ' Generate report with charts and tables Dim html = Await BuildFinancialReportHtml(data) Dim pdf = renderer.RenderHtmlAsPdf(html) ' Add compliance watermark pdf.ApplyWatermark(" <div style='text-align: center; color: rgba(0,0,0,0.1); font-size: 120px; transform: rotate(-45deg); font-family: Arial;'> DRAFT </div>", 30, VerticalAlignment.Middle, HorizontalAlignment.Center) ' Embed audit information pdf.MetaData.Author = "Financial Reporting System" pdf.MetaData.Keywords = "Quarterly Report, SOX Compliant" pdf.MetaData.CustomProperties.Add("ReportPeriod", data.Quarter) pdf.MetaData.CustomProperties.Add("GeneratedBy", Environment.UserName) pdf.MetaData.CustomProperties.Add("Timestamp", DateTime.UtcNow.ToString("O")) ' Apply tamper-evident signature Dim cert = New X509Certificate2("financial-cert.pfx", "password") Dim signature = New PdfSignature(cert) With { .SigningReason = "Financial Report Certification", .SigningLocation = "Corporate Finance Department", .IsVisible = True, .SignatureImage = New PdfSignatureImage("cfo-signature.png") } pdf.Sign(signature) ' Lock document from editing pdf.SecuritySettings = New SecuritySettings With { .AllowModifyDocument = False, .AllowCopy = True, .AllowPrint = True, .EncryptionLevel = EncryptionLevel.AES256Bit } Return pdf.BinaryData End Function End Class $vbLabelText $csharpLabel 電子商務:動態發票生成 電子商務平台需要快速、可靠的發票生成: public class EcommerceInvoiceService { private readonly ChromePdfRenderer _renderer; public EcommerceInvoiceService() { _renderer = new ChromePdfRenderer { RenderingOptions = new ChromePdfRenderOptions { MarginTop = 10, MarginBottom = 10, PaperSize = PdfPaperSize.A4, DPI = 200 // High quality for barcodes } }; } public async Task<byte[]> GenerateInvoice(Order order) { // Build invoice HTML with order details var html = $@" <html> <head> <style> @page {{ size: A4; margin: 0; }} body {{ font-family: Arial, sans-serif; }} .invoice-header {{ background: #f0f0f0; padding: 20px; }} .barcode {{ text-align: center; margin: 20px 0; }} table {{ width: 100%; border-collapse: collapse; }} th, td {{ padding: 10px; border-bottom: 1px solid #ddd; }} </style> </head> <body> <div class='invoice-header'> <h1>Invoice #{order.InvoiceNumber}</h1> <p>Date: {order.Date:yyyy-MM-dd}</p> </div> <div class='barcode'> <img src='data:image/png;base64,{GenerateBarcode(order.InvoiceNumber)}' /> </div> <table> <tr> <th>Item</th> <th>Quantity</th> <th>Price</th> <th>Total</th> </tr> {string.Join("", order.Items.Select(item => $@" <tr> <td>{item.Name}</td> <td>{item.Quantity}</td> <td>${item.Price:F2}</td> <td>${item.Total:F2}</td> </tr>"))} <tr> <td colspan='3'><strong>Total</strong></td> <td><strong>${order.Total:F2}</strong></td> </tr> </table> <div class='footer'> <p>Thank you for your business!</p> <p>Return policy and terms at: www.example.com/terms</p> </div> </body> </html>"; var pdf = await _renderer.RenderHtmlAsPdfAsync(html); // Add QR code for mobile payment verification var qrStamper = new ImageStamper($"https://api.qrserver.com/v1/create-qr-code/?data={order.PaymentId}") { HorizontalAlignment = HorizontalAlignment.Right, VerticalAlignment = VerticalAlignment.Bottom, Width = 100, Height = 100 }; pdf.ApplyStamp(qrStamper); return pdf.BinaryData; } } public class EcommerceInvoiceService { private readonly ChromePdfRenderer _renderer; public EcommerceInvoiceService() { _renderer = new ChromePdfRenderer { RenderingOptions = new ChromePdfRenderOptions { MarginTop = 10, MarginBottom = 10, PaperSize = PdfPaperSize.A4, DPI = 200 // High quality for barcodes } }; } public async Task<byte[]> GenerateInvoice(Order order) { // Build invoice HTML with order details var html = $@" <html> <head> <style> @page {{ size: A4; margin: 0; }} body {{ font-family: Arial, sans-serif; }} .invoice-header {{ background: #f0f0f0; padding: 20px; }} .barcode {{ text-align: center; margin: 20px 0; }} table {{ width: 100%; border-collapse: collapse; }} th, td {{ padding: 10px; border-bottom: 1px solid #ddd; }} </style> </head> <body> <div class='invoice-header'> <h1>Invoice #{order.InvoiceNumber}</h1> <p>Date: {order.Date:yyyy-MM-dd}</p> </div> <div class='barcode'> <img src='data:image/png;base64,{GenerateBarcode(order.InvoiceNumber)}' /> </div> <table> <tr> <th>Item</th> <th>Quantity</th> <th>Price</th> <th>Total</th> </tr> {string.Join("", order.Items.Select(item => $@" <tr> <td>{item.Name}</td> <td>{item.Quantity}</td> <td>${item.Price:F2}</td> <td>${item.Total:F2}</td> </tr>"))} <tr> <td colspan='3'><strong>Total</strong></td> <td><strong>${order.Total:F2}</strong></td> </tr> </table> <div class='footer'> <p>Thank you for your business!</p> <p>Return policy and terms at: www.example.com/terms</p> </div> </body> </html>"; var pdf = await _renderer.RenderHtmlAsPdfAsync(html); // Add QR code for mobile payment verification var qrStamper = new ImageStamper($"https://api.qrserver.com/v1/create-qr-code/?data={order.PaymentId}") { HorizontalAlignment = HorizontalAlignment.Right, VerticalAlignment = VerticalAlignment.Bottom, Width = 100, Height = 100 }; pdf.ApplyStamp(qrStamper); return pdf.BinaryData; } } Public Class EcommerceInvoiceService Private ReadOnly _renderer As ChromePdfRenderer Public Sub New() _renderer = New ChromePdfRenderer With { .RenderingOptions = New ChromePdfRenderOptions With { .MarginTop = 10, .MarginBottom = 10, .PaperSize = PdfPaperSize.A4, .DPI = 200 } } End Sub Public Async Function GenerateInvoice(ByVal order As Order) As Task(Of Byte()) ' Build invoice HTML with order details , order.InvoiceNumbstring.Format(r, order.Date, GenerateBarcode(order.InvoiceNumber), String.Join(TangibleTempVerbatimDoubleQuote, order.Items.Select(Function(item) $TangibleTempVerbatimCloseTag"ignoreignoreignoreignoreignoreignoreignoreignoreignoreignoreignoreignoreignoreignoreignoreignoreignoreignoreignoreignoreignoreignoreignoreignoreignoreignoreignoreignoreignore<tr><td>{item.Name}</td><td>{item.Quantity}</td><td>${item.Price:F2}</td><td>${item.Total:F2}</td></tr>")), TangibleStringInterpolationMarker) var html = $"TangibleTempVerbatimOpenTagTangibleTempVerbatimStringLiteralLineJoin <html>TangibleTempVerbatimStringLiteralLineJoin <head>TangibleTempVerbatimStringLiteralLineJoin <style>TangibleTempVerbatimStringLiteralLineJoin @page {{ size: A4; margin: 0; }}TangibleTempVerbatimStringLiteralLineJoin body {{ font-family: Arial, sans-serif; }}TangibleTempVerbatimStringLiteralLineJoin .invoice-header {{ background: #f0f0f0; padding: 20px; }}TangibleTempVerbatimStringLiteralLineJoin .barcode {{ text-align: center; margin: 20px 0; }}TangibleTempVerbatimStringLiteralLineJoin table {{ width: 100%; border-collapse: collapse; }}TangibleTempVerbatimStringLiteralLineJoin th, td {{ padding: 10px; border-bottom: 1px solid #ddd; }}TangibleTempVerbatimStringLiteralLineJoin </style>TangibleTempVerbatimStringLiteralLineJoin </head>TangibleTempVerbatimStringLiteralLineJoin <body>TangibleTempVerbatimStringLiteralLineJoin <div class='invoice-header'>TangibleTempVerbatimStringLiteralLineJoin <h1>Invoice #{0}</h1>TangibleTempVerbatimStringLiteralLineJoin <p>Date: {1:yyyy-MM-dd}</p>TangibleTempVerbatimStringLiteralLineJoin </div>TangibleTempVerbatimStringLiteralLineJoinTangibleTempVerbatimStringLiteralLineJoin <div class='barcode'>TangibleTempVerbatimStringLiteralLineJoin <img src='data:image/png;base64,{2}' />TangibleTempVerbatimStringLiteralLineJoin </div>TangibleTempVerbatimStringLiteralLineJoinTangibleTempVerbatimStringLiteralLineJoin <table>TangibleTempVerbatimStringLiteralLineJoin <tr>TangibleTempVerbatimStringLiteralLineJoin <th>Item</th>TangibleTempVerbatimStringLiteralLineJoin <th>Quantity</th>TangibleTempVerbatimStringLiteralLineJoin <th>Price</th>TangibleTempVerbatimStringLiteralLineJoin <th>Total</th>TangibleTempVerbatimStringLiteralLineJoin </tr>TangibleTempVerbatimStringLiteralLineJoin {3}ignoreignoreignoreignoreignoreignoreignoreignoreignoreignoreignoreignoreignoreignoreignoreignoreignoreignoreignoreignoreignoreignoreignoreignoreignoreignoreignoreignoreignoreignoreignoreignoreignoreignoreignore<tr><td colspan='3'><strong>Total</strong></td><td><strong>${order.Total:F2}</strong></td></tr></table><div class='footer'><p>Thank you for your business!</p><p>Return policy and terms at: www.example.com/terms</p></div></body></html>" Dim pdf = Await _renderer.RenderHtmlAsPdfAsync(html) ' Add QR code for mobile payment verification Dim qrStamper = New ImageStamper($"https://api.qrserver.com/v1/create-qr-code/?data={order.PaymentId}") With { .HorizontalAlignment = HorizontalAlignment.Right, .VerticalAlignment = VerticalAlignment.Bottom, .Width = 100, .Height = 100 } pdf.ApplyStamp(qrStamper) Return pdf.BinaryData End Function End Class $vbLabelText $csharpLabel 遷移策略:在庫之間轉移 如果您正在考慮在庫之間切換,這裡有一個遷移方法: 從 EvoPdf 遷移到 IronPDF // EvoPdf pattern HtmlToPdfConverter evoPdfConverter = new HtmlToPdfConverter(); evoPdfConverter.PdfDocumentOptions.PdfPageSize = PdfPageSize.A4; byte[] pdfBytes = evoPdfConverter.ConvertUrl(url); // Equivalent IronPDF pattern var ironPdfRenderer = new ChromePdfRenderer { RenderingOptions = new ChromePdfRenderOptions { PaperSize = PdfPaperSize.A4 } }; var pdf = ironPdfRenderer.RenderUrlAsPdf(url); byte[] pdfBytes = pdf.BinaryData; // Migration wrapper for gradual transition public interface IPdfConverter { byte[] ConvertHtmlToPdf(string html); byte[] ConvertUrlToPdf(string url); } public class IronPdfAdapter : IPdfConverter { private readonly ChromePdfRenderer _renderer = new ChromePdfRenderer(); public byte[] ConvertHtmlToPdf(string html) { return _renderer.RenderHtmlAsPdf(html).BinaryData; } public byte[] ConvertUrlToPdf(string url) { return _renderer.RenderUrlAsPdf(url).BinaryData; } } public class EvoPdfAdapter : IPdfConverter { private readonly HtmlToPdfConverter _converter = new HtmlToPdfConverter(); public byte[] ConvertHtmlToPdf(string html) { return _converter.ConvertHtml(html, ""); } public byte[] ConvertUrlToPdf(string url) { return _converter.ConvertUrl(url); } } // EvoPdf pattern HtmlToPdfConverter evoPdfConverter = new HtmlToPdfConverter(); evoPdfConverter.PdfDocumentOptions.PdfPageSize = PdfPageSize.A4; byte[] pdfBytes = evoPdfConverter.ConvertUrl(url); // Equivalent IronPDF pattern var ironPdfRenderer = new ChromePdfRenderer { RenderingOptions = new ChromePdfRenderOptions { PaperSize = PdfPaperSize.A4 } }; var pdf = ironPdfRenderer.RenderUrlAsPdf(url); byte[] pdfBytes = pdf.BinaryData; // Migration wrapper for gradual transition public interface IPdfConverter { byte[] ConvertHtmlToPdf(string html); byte[] ConvertUrlToPdf(string url); } public class IronPdfAdapter : IPdfConverter { private readonly ChromePdfRenderer _renderer = new ChromePdfRenderer(); public byte[] ConvertHtmlToPdf(string html) { return _renderer.RenderHtmlAsPdf(html).BinaryData; } public byte[] ConvertUrlToPdf(string url) { return _renderer.RenderUrlAsPdf(url).BinaryData; } } public class EvoPdfAdapter : IPdfConverter { private readonly HtmlToPdfConverter _converter = new HtmlToPdfConverter(); public byte[] ConvertHtmlToPdf(string html) { return _converter.ConvertHtml(html, ""); } public byte[] ConvertUrlToPdf(string url) { return _converter.ConvertUrl(url); } } ' EvoPdf pattern Dim evoPdfConverter As New HtmlToPdfConverter() evoPdfConverter.PdfDocumentOptions.PdfPageSize = PdfPageSize.A4 Dim pdfBytes() As Byte = evoPdfConverter.ConvertUrl(url) ' Equivalent IronPDF pattern Dim ironPdfRenderer = New ChromePdfRenderer With { .RenderingOptions = New ChromePdfRenderOptions With {.PaperSize = PdfPaperSize.A4} } Dim pdf = ironPdfRenderer.RenderUrlAsPdf(url) Dim pdfBytes() As Byte = pdf.BinaryData ' Migration wrapper for gradual transition 'INSTANT VB TODO TASK: Local functions are not converted by Instant VB: 'public interface IPdfConverter '{ ' byte[] ConvertHtmlToPdf(string html); ' byte[] ConvertUrlToPdf(string url); '} 'INSTANT VB TODO TASK: Local functions are not converted by Instant VB: 'public class IronPdfAdapter : IPdfConverter '{ ' private readonly ChromePdfRenderer _renderer = New ChromePdfRenderer(); ' ' public byte[] ConvertHtmlToPdf(string html) ' { ' Return _renderer.RenderHtmlAsPdf(html).BinaryData; ' } ' ' public byte[] ConvertUrlToPdf(string url) ' { ' Return _renderer.RenderUrlAsPdf(url).BinaryData; ' } '} 'INSTANT VB TODO TASK: Local functions are not converted by Instant VB: 'public class EvoPdfAdapter : IPdfConverter '{ ' private readonly HtmlToPdfConverter _converter = New HtmlToPdfConverter(); ' ' public byte[] ConvertHtmlToPdf(string html) ' { ' Return _converter.ConvertHtml(html, ""); ' } ' ' public byte[] ConvertUrlToPdf(string url) ' { ' Return _converter.ConvertUrl(url); ' } '} $vbLabelText $csharpLabel 結論:為您的項目做出正確選擇 IronPDF 和 EvoPdf 在 .NET PDF 庫生態系統中發揮著重要作用,但它們針對的是不同的使用案例和開發理念。 當您需要以下功能時,選擇 IronPDF: 現代 web 標準支持(CSS3、JavaScript 框架) 全面的 PDF 操作,不僅僅是生成 企業安全功能和合規工具 跨平台部署靈活性 豐富的文檔和直接的工程支持 與其他文檔處理工具的集成 當您需要以下功能時,選擇 EvoPdf: 低成本的簡單 HTML 到 PDF 轉換 對於簡單文檔的基本 PDF 生成 大型團隊的無限開發者許可 更快的簡單 HTML 內容處理 以 Windows 為中心的部署環境 最終決定取決於您的具體要求、預算限制以及長期可擴展性需求。 對於大多數現代應用程序需要強大的 PDF 功能,IronPDF 全面的功能集和卓越的渲染引擎證明了它的投資價值。 然而,EvoPdf 在成本是首要考量的簡單使用案例中仍然是一個可行的選擇。 Consider starting with the 30-day free trial of IronPDF to evaluate its capabilities in your specific use case. 試用版包含所有功能,沒有任何限制,允許您根據實際性能在您的環境中做出明智的決定。 請記住,PDF 庫的真正成本超出了許可價格——將開發時間、維護負擔以及隨著應用程序增長可能需要的額外功能考慮在內。 選擇不僅能滿足您當前需求且能滿足您未來需求的庫。 請注意EvoPdf 是其各自所有者的註冊商標。 本網站未與 EvoPdf 相關聯、未獲 EvoPdf 認可或贊助。 所有產品名稱、徽標和品牌均為其各自所有者的財產。 比較僅供信息參考,並反映撰寫時公開可用的信息。 常見問題解答 如何使用.NET庫在C#中將HTML轉換為PDF? 您可以使用 IronPDF 的 RenderHtmlAsPdf 方法將 HTML 字符串轉換為 PDF。您還可以使用 RenderHtmlFileAsPdf 將 HTML 文件轉換為 PDF。 什麼是處理複雜JavaScript和CSS的最佳.NET PDF庫? IronPDF是處理複雜JavaScript和CSS的最佳選擇,因為它使用完整的Chrome V8渲染引擎,提供98%+的瀏覽器保真度,支持像React和Angular這樣的現代框架。 哪個.NET PDF庫提供更好的跨平台支持? IronPDF提供卓越的跨平台支持,具有對Windows、Linux、macOS和Docker容器的原生兼容性,允許零配置部署。 IronPDF的關鍵安全和合規功能是什麼? IronPDF提供全面的安全功能,包括AES-256加密、15+顆粒度的權限設置、可視化數字簽名,及使用RedactTextOnAllPages()方法的真正內容遮罩。 如何在.NET中高效地進行批處理PDF處理? IronPDF通過提供本地async/await優化和更佳的內存管理,擅長批處理PDF處理,適合高效處理大型文檔。 哪個庫為開發者提供更好的支持和文檔? IronPDF提供廣泛的支持和文檔,包括24/5的工程支持、全面的API文檔、100多個代碼示例和視頻教程,顯著縮短開發時間。 我可以使用.NET庫將DOCX文件轉換為PDF嗎? 可以,IronPDF通過其DocxToPdfRenderer類包含內置的DOCX到PDF轉換,允許您在保留格式的情況下轉換Word文檔。 使用IronPDF對於現代Web應用程序有什麼優勢? IronPDF由於其基於Chrome的渲染引擎、全面的PDF操作功能和跨平台兼容性,適合現代Web應用程序,適用於動態內容生成和複雜文檔處理。 IronPDF如何處理PDF遮罩以滿足合規要求? IronPDF提供全面的遮罩能力,包括基於正則表達式的內容移除和基於OCR的遮罩,確保符合GDPR和HIPAA等隱私法規。 IronPDF為什麼適合SaaS和電子商務平台? IronPDF非常適合SaaS和電子商務平台,因為其能生成動態發票,支持數字簽名,並與現代Web技術無縫集成。 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與SelectPdf:完整的.NET Core PDF庫比較HTML到PDF轉換iTextSharp C# HTML到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。 閱讀更多