EO.Pdf與IronPDF:技術比較指南
當.NET開發者研究PDF生成程式庫時,EO.Pdf作為一個具備Chromium基於渲染能力的商用選項顯得尤為突出。 然而,其較大的部署足跡、舊版Internet Explorer的遷移問題以及靜態的全球配置方法導致許多團隊考慮替代方案。 IronPDF提供了一個經過優化的Chromium實現,配有優化的包裝、基於實例的、線程安全的配置以及真正的跨平台支援。
此比較涵蓋了技術上相關的各方面,以幫助專業開發人員和建築師為他們的.NET PDF需求做出知情決策。
了解EO.Pdf
EO.Pdf是一個商用的PDF程式庫,每位開發者授權的價格為$2,998,具備基於Chromium的渲染,用於高質量的PDF生成。 該程式庫基於一個自訂引擎構建,已經從其最初的Internet Explorer渲染基礎轉變為一個基於Chromium的系統。
儘管做了此更新,但該程式庫向Chromium的轉變由於其由Internet Explorer時代帶來的遺留包袱,引入了兼容性問題。 它包含自己的Chromium引擎,造成更大的部署足跡,增加Docker鏡像的大小,減慢CI/CD管道並提高基礎設施成本。
此外,雖然EO.Pdf被標榜為一個跨平台工具,但其性能和易用性主要是為Windows而設計,對於Linux的支援往往被描述為第二位。 轉換器使用靜態HtmlToPdf.Options進行配置,這在多租戶的Web應用程式中產生了線程安全問題。
瞭解IronPDF
IronPDF是一個為現代.NET環境設計的.NET PDF程式庫,通過優化的Chromium包裝方法,實現了更小的部署足跡。 該程式庫對所有平台提供相等的支援,而非偏向Windows,使其適合部署在不同環境的應用程式。
IronPDF通過ChromePdfRenderer對象使用基於實例的配置,確保在並發場景中的線程安全操作。 每個渲染器實例都維護其自己的RenderingOptions,將配置與其他操作隔離開來。
架構和配置比較
這些.NET PDF程式庫之間的基本架構差異在於其配置方法和部署特點。
| 方面 | EO.Pdf | IronPDF |
|---|---|---|
| 包大小 | 更大的部署足跡 | 優化的包裝 |
| 遺留問題 | IE遷移包袱 | 乾淨、現代的代碼基礎 |
| 平台支持 | 偏向Windows | 真正的跨平台 |
| 配置 | 靜態/全球 | 基於實例,線程安全 |
| 價格 | $2,998/開發者 | 具有競爭力的定價 |
| API設計 | 混合 (HtmlToPdf + ACM) | 統一、一致 |
| 文件資料 | 有限 | 詳細的教學 |
| 現代 .NET | .NET Standard | .NET 6/7/8/9+ 原生 |
| Async支持 | 有限 | 完全異步/等待 |
配置模型代表了關鍵的區別。 該程式庫的靜態HtmlToPdf.Options影響了所有全局轉換,在多線程應用程式中創建競爭條件。 IronPDF的基於實例的方法確保對每個渲染器的隔離配置。
程式碼比較:常見的PDF操作
HTML到PDF的轉換
將HTML內容轉換為PDF展示了基本API的差異。
EO.Pdf:
// NuGet: Install-Package EO.Pdf
using EO.Pdf;
using System;
class Program
{
static void Main()
{
string html = "<html><body><h1>Hello World</h1><p>This is a PDF generated from HTML.</p></body></html>";
HtmlToPdf.ConvertHtml(html, "output.pdf");
Console.WriteLine("PDF created successfully!");
}
}// NuGet: Install-Package EO.Pdf
using EO.Pdf;
using System;
class Program
{
static void Main()
{
string html = "<html><body><h1>Hello World</h1><p>This is a PDF generated from HTML.</p></body></html>";
HtmlToPdf.ConvertHtml(html, "output.pdf");
Console.WriteLine("PDF created successfully!");
}
}Imports EO.Pdf
Imports System
Class Program
Shared Sub Main()
Dim html As String = "<html><body><h1>Hello World</h1><p>This is a PDF generated from HTML.</p></body></html>"
HtmlToPdf.ConvertHtml(html, "output.pdf")
Console.WriteLine("PDF created successfully!")
End Sub
End ClassIronPDF:
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
string html = "<html><body><h1>Hello World</h1><p>This is a PDF generated from HTML.</p></body></html>";
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
Console.WriteLine("PDF created successfully!");
}
}// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
string html = "<html><body><h1>Hello World</h1><p>This is a PDF generated from HTML.</p></body></html>";
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
Console.WriteLine("PDF created successfully!");
}
}Imports IronPdf
Imports System
Class Program
Shared Sub Main()
Dim html As String = "<html><body><h1>Hello World</h1><p>This is a PDF generated from HTML.</p></body></html>"
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("output.pdf")
Console.WriteLine("PDF created successfully!")
End Sub
End Class該程式庫使用一個靜態HtmlToPdf.ConvertHtml()方法,直接保存到文件路徑。 IronPDF使用兩步法: SaveAs()之前進一步操作。 這種兩步模式為後處理操作提供了更多靈活性,比如合併、添加水印或應用安全設置。
有關進階HTML渲染選項,請查看HTML到PDF轉換指南。
URL到PDF轉換
將網頁捕捉為PDF文件顯示了類似的API模式。
EO.Pdf:
// NuGet: Install-Package EO.Pdf
using EO.Pdf;
using System;
class Program
{
static void Main()
{
string url = "https://www.example.com";
HtmlToPdf.ConvertUrl(url, "webpage.pdf");
Console.WriteLine("PDF from URL created successfully!");
}
}// NuGet: Install-Package EO.Pdf
using EO.Pdf;
using System;
class Program
{
static void Main()
{
string url = "https://www.example.com";
HtmlToPdf.ConvertUrl(url, "webpage.pdf");
Console.WriteLine("PDF from URL created successfully!");
}
}Imports EO.Pdf
Imports System
Module Program
Sub Main()
Dim url As String = "https://www.example.com"
HtmlToPdf.ConvertUrl(url, "webpage.pdf")
Console.WriteLine("PDF from URL created successfully!")
End Sub
End ModuleIronPDF:
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
string url = "https://www.example.com";
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderUrlAsPdf(url);
pdf.SaveAs("webpage.pdf");
Console.WriteLine("PDF from URL created successfully!");
}
}// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
string url = "https://www.example.com";
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderUrlAsPdf(url);
pdf.SaveAs("webpage.pdf");
Console.WriteLine("PDF from URL created successfully!");
}
}Imports IronPdf
Imports System
Class Program
Shared Sub Main()
Dim url As String = "https://www.example.com"
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderUrlAsPdf(url)
pdf.SaveAs("webpage.pdf")
Console.WriteLine("PDF from URL created successfully!")
End Sub
End Class兩個程式庫都提供URL到PDF的功能,EO.Pdf使用靜態RenderUrlAsPdf()。 同樣的線程安全區別適用。
了解有關URL渲染的更多信息,請參見URL to PDF文檔。
PDF合併操作
合併多個PDF文件展示了不同的對象模型方法。
EO.Pdf:
// NuGet: Install-Package EO.Pdf
using EO.Pdf;
using System;
class Program
{
static void Main()
{
PdfDocument doc1 = new PdfDocument("file1.pdf");
PdfDocument doc2 = new PdfDocument("file2.pdf");
PdfDocument mergedDoc = new PdfDocument();
mergedDoc.Append(doc1);
mergedDoc.Append(doc2);
mergedDoc.Save("merged.pdf");
Console.WriteLine("PDFs merged successfully!");
}
}// NuGet: Install-Package EO.Pdf
using EO.Pdf;
using System;
class Program
{
static void Main()
{
PdfDocument doc1 = new PdfDocument("file1.pdf");
PdfDocument doc2 = new PdfDocument("file2.pdf");
PdfDocument mergedDoc = new PdfDocument();
mergedDoc.Append(doc1);
mergedDoc.Append(doc2);
mergedDoc.Save("merged.pdf");
Console.WriteLine("PDFs merged successfully!");
}
}Imports EO.Pdf
Imports System
Class Program
Shared Sub Main()
Dim doc1 As New PdfDocument("file1.pdf")
Dim doc2 As New PdfDocument("file2.pdf")
Dim mergedDoc As New PdfDocument()
mergedDoc.Append(doc1)
mergedDoc.Append(doc2)
mergedDoc.Save("merged.pdf")
Console.WriteLine("PDFs merged successfully!")
End Sub
End ClassIronPDF:
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
var pdf1 = PdfDocument.FromFile("file1.pdf");
var pdf2 = PdfDocument.FromFile("file2.pdf");
var merged = PdfDocument.Merge(new List<PdfDocument> { pdf1, pdf2 });
merged.SaveAs("merged.pdf");
Console.WriteLine("PDFs merged successfully!");
}
}// NuGet: Install-Package IronPdf
using IronPdf;
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
var pdf1 = PdfDocument.FromFile("file1.pdf");
var pdf2 = PdfDocument.FromFile("file2.pdf");
var merged = PdfDocument.Merge(new List<PdfDocument> { pdf1, pdf2 });
merged.SaveAs("merged.pdf");
Console.WriteLine("PDFs merged successfully!");
}
}Imports IronPdf
Imports System
Imports System.Collections.Generic
Module Program
Sub Main()
Dim pdf1 = PdfDocument.FromFile("file1.pdf")
Dim pdf2 = PdfDocument.FromFile("file2.pdf")
Dim merged = PdfDocument.Merge(New List(Of PdfDocument) From {pdf1, pdf2})
merged.SaveAs("merged.pdf")
Console.WriteLine("PDFs merged successfully!")
End Sub
End Module此解決方案通過構造函數(Append()將文件添加到一個空容器中。 IronPDF使用靜態工廠方法(PdfDocument.Merge()方法,該方法接受一個集合並返回合併結果。
如需了解更多合併操作,請參閱PDF合併文檔。
自定義頁面設置
配置頁面大小和邊距展示了配置模型的差異。
EO.Pdf:
// NuGet: Install-Package EO.Pdf
using EO.Pdf;
using System;
class Program
{
static void Main()
{
HtmlToPdfOptions options = new HtmlToPdfOptions();
options.PageSize = PdfPageSizes.A4;
options.OutputArea = new RectangleF(0.5f, 0.5f, 7.5f, 10.5f);
HtmlToPdf.ConvertUrl("file:///C:/input.html", "output.pdf", options);
Console.WriteLine("PDF with custom settings created.");
}
}// NuGet: Install-Package EO.Pdf
using EO.Pdf;
using System;
class Program
{
static void Main()
{
HtmlToPdfOptions options = new HtmlToPdfOptions();
options.PageSize = PdfPageSizes.A4;
options.OutputArea = new RectangleF(0.5f, 0.5f, 7.5f, 10.5f);
HtmlToPdf.ConvertUrl("file:///C:/input.html", "output.pdf", options);
Console.WriteLine("PDF with custom settings created.");
}
}Imports EO.Pdf
Imports System
Class Program
Shared Sub Main()
Dim options As New HtmlToPdfOptions()
options.PageSize = PdfPageSizes.A4
options.OutputArea = New RectangleF(0.5F, 0.5F, 7.5F, 10.5F)
HtmlToPdf.ConvertUrl("file:///C:/input.html", "output.pdf", options)
Console.WriteLine("PDF with custom settings created.")
End Sub
End ClassIronPDF:
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.MarginTop = 20;
renderer.RenderingOptions.MarginBottom = 20;
renderer.RenderingOptions.MarginLeft = 20;
renderer.RenderingOptions.MarginRight = 20;
var pdf = renderer.RenderHtmlFileAsPdf("C:/input.html");
pdf.SaveAs("output.pdf");
Console.WriteLine("PDF with custom settings created.");
}
}// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.MarginTop = 20;
renderer.RenderingOptions.MarginBottom = 20;
renderer.RenderingOptions.MarginLeft = 20;
renderer.RenderingOptions.MarginRight = 20;
var pdf = renderer.RenderHtmlFileAsPdf("C:/input.html");
pdf.SaveAs("output.pdf");
Console.WriteLine("PDF with custom settings created.");
}
}Imports IronPdf
Imports IronPdf.Rendering
Imports System
Class Program
Shared Sub Main()
Dim renderer As New ChromePdfRenderer()
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4
renderer.RenderingOptions.MarginTop = 20
renderer.RenderingOptions.MarginBottom = 20
renderer.RenderingOptions.MarginLeft = 20
renderer.RenderingOptions.MarginRight = 20
Dim pdf = renderer.RenderHtmlFileAsPdf("C:/input.html")
pdf.SaveAs("output.pdf")
Console.WriteLine("PDF with custom settings created.")
End Sub
End Class轉換器使用RectangleF英寸。 IronPDF使用個別的邊距屬性(MarginTop, MarginBottom, MarginLeft, RenderingOptions對象上。 單位差異需要轉換: inches × 25.4 = millimeters。
方法對應參考
對於評估EO.Pdf遷移或比較功能的開發者,此對應顯示等效操作。
核心操作
| EO.Pdf | IronPDF |
|---|---|
HtmlToPdf.ConvertHtml(html, path) | renderer.RenderHtmlAsPdf(html) 然後 SaveAs() |
HtmlToPdf.ConvertUrl(url, path) | renderer.RenderUrlAsPdf(url) 然後 SaveAs() |
HtmlToPdf.Options.PageSize | renderer.RenderingOptions.PaperSize |
HtmlToPdf.Options.OutputArea | MarginTop/Bottom/Left/Right |
new PdfDocument(path) | PdfDocument.FromFile(path) |
doc.Append(other) | PdfDocument.Merge(doc1, doc2) |
doc.Save(path) | pdf.SaveAs(path) |
配置映射
| EO.Pdf選項 | IronPDF RenderingOptions |
|---|---|
Options.PageSize = PdfPageSizes.A4 | PaperSize = PdfPaperSize.A4 |
Options.PageSize = PdfPageSizes.Letter | PaperSize = PdfPaperSize.Letter |
Options.OutputArea (RectangleF) | MarginTop, MarginBottom 等。 |
Options.BaseUrl | BaseUrl |
類映射
| EO.Pdf類 | IronPDF等效 |
|---|---|
HtmlToPdf | ChromePdfRenderer |
PdfDocument | PdfDocument |
HtmlToPdfOptions | ChromePdfRenderOptions |
AcmRender | 不需要 |
AcmText | HTML <span>, <p> |
AcmBlock | HTML <div> |
功能比較總結
| 功能 | EO.Pdf | IronPDF |
|---|---|---|
| HTML到PDF | 是 | 是 |
| URL到PDF | 是 | 是 |
| PDF合併 | 是 | 是 |
| 頁面操作 | 是 | 是 |
| 頁眉/頁尾 | 是 | 是 (基於HTML) |
| 安全性/加密 | 是 | 是 |
| 表單欄位 | 是 | 是 |
| 水印 | 是 | 是 |
| ACM渲染 | 是 | HTML/CSS (無ACM) |
| 線程安全配置 | 是 (每個線程隔離) | 是 (實例) |
| 跨平台 | 有限 | 支持 |
線程安全問題
EO.Pdf的靜態配置在多線程應用程式中創建了基本問題。
// EO.Pdf - DANGER: Static options affect ALL threads!
HtmlToPdf.Options.PageSize = PdfPageSizes.A4;
HtmlToPdf.Options.OutputArea = new RectangleF(0.5f, 0.5f, 7.5f, 10.5f);
HtmlToPdf.ConvertHtml(html, "output.pdf");// EO.Pdf - DANGER: Static options affect ALL threads!
HtmlToPdf.Options.PageSize = PdfPageSizes.A4;
HtmlToPdf.Options.OutputArea = new RectangleF(0.5f, 0.5f, 7.5f, 10.5f);
HtmlToPdf.ConvertHtml(html, "output.pdf");' EO.Pdf - DANGER: Static options affect ALL threads!
HtmlToPdf.Options.PageSize = PdfPageSizes.A4
HtmlToPdf.Options.OutputArea = New RectangleF(0.5F, 0.5F, 7.5F, 10.5F)
HtmlToPdf.ConvertHtml(html, "output.pdf")在處理多個並發請求的Web應用程式中,一個請求的配置會影響所有其他請求。 這造成競爭條件,生成的PDF可能具有意想不到的設置。
IronPDF的基於實例的方法消除了此問題。
//IronPDF- Thread-safe, isolated options per renderer instance
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.MarginTop = 12.7;
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");//IronPDF- Thread-safe, isolated options per renderer instance
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.MarginTop = 12.7;
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");'IronPDF- Thread-safe, isolated options per renderer instance
Dim renderer As New ChromePdfRenderer()
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4
renderer.RenderingOptions.MarginTop = 12.7
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("output.pdf")每個ChromePdfRenderer實例維持其自身的配置,確保在並發場景中的隔離。
團隊考慮從EO.Pdf轉向IronPDF的時候
開發團隊評估從EO.Pdf轉向IronPDF的原因有很多。
包大小優化: EO.Pdf的更大部署足跡膨脹了Docker影像,降低CI/CD管道速度,並增加了基礎設施成本。 IronPDF的優化包裝提供了部署效率的提升。
線程安全需求: 多租戶的Web應用程式需要每個請求的隔離配置。該程式庫的靜態HtmlToPdf.Options造成競爭條件,而IronPDF的基於實例的方法消除了這一問題。
跨平台部署: 針對Linux或macOS環境的應用程式在EO.Pdf的以Windows為中心的設計中遇到限制。 IronPDF提供真正的跨平台支援,並具有持續一致的行為。
遺留包袱迴避: 其從Internet Explorer向Chromium遷移引入了兼容性問題。 IronPDF乾淨的現代代碼基礎避免了這一技術債務。
現代.NET支援: 針對.NET 6/7/8/9+的應用程式從IronPDF的本地支援中獲益,相比EO.Pdf的.NET Standard目標。
ACM遷移: 使用EO.Pdf的先進內容模型(AcmRender, AcmText, AcmBlock)的團隊發現IronPDF的HTML/CSS方法更簡單且更易於維護。
優勢和考量
EO.Pdf優勢
- Chromium渲染: 高質量W3C兼容輸出
- 已建立的程式庫: 在生產環境中得到驗證
- 單步轉換: 通過
ConvertHtml()直接文件輸出
考慮EO.Pdf
- 龐大的包大小: 126MB的部署足跡
- 遺留IE包袱: 遷移中產生的兼容性問題
- 靜態配置: 在多租戶應用程式中線程安全問題
- Windows為中心: 對Linux/macOS支援有限
- 價格點: $2,998 每位開發者授權
- 有限的文檔: 教學和範例較少
IronPDF的優勢
IronPDF的考量
- 兩步保存: 渲染返回
SaveAs() - 單位差異: 使用毫米作為邊距單位(相比EO.Pdf的英寸)
結論
EO.Pdf和IronPDF都為.NET開發者提供基於Chromium的PDF生成,但它們代表不同的架構方法。 EO.Pdf提供了已建立的功能性,但帶有126MB的包大小、舊版Internet Explorer的遷移包袱以及線程不安全的靜態配置。
IronPDF提供了一個現代的替代方案,具有優化的包裝、真正的跨平台支援和基於實例的線程安全配置。 對於需要部署效率、並發操作安全或跨平台目標的團隊來說,IronPDF滿足這些特定需求。
隨著組織計畫.NET 10、C# 14,並通過2026年的應用開發,選擇取決於具體優先事項。 對於在單線程Windows環境中已有EO.Pdf實施的團隊來說,仍可能找到其價值所在。 對於現代多租戶應用程式、容器化部署或跨平台要求,IronPDF提供了一個更合適的方法。
