如何在 C# 中從 EO.Pdf 遷移到 IronPDF
EO.Pdf帶來的幾個架構挑戰推動了開發團隊評估替代方案。 了解這些問題對於計劃遷移策略至關重要。
EO.Pdf問題
-
內建Chromium足跡:EO.Pdf(當前NuGet版本26.1.34,2026年3月)提供自身的基於Chromium的渲染器,這相較於非Chromium程式庫增加了安裝足跡,並增加了Docker映像和CI/CD管道的負擔。
-
遺留架構包袱:EO.Pdf的HTML至PDF轉換器最初是基於嵌入式Internet Explorer/Trident引擎構建的,然後該項目轉向基於Chromium的渲染器。 這次轉變留下了一些API怪癖和版本之間的行為差異。
-
僅針對Windows的.NET Core:儘管宣稱為 "跨平台" ,Essential Objects自身的.NET Core文件指出EO.Pdf僅支持Windows上的.NET Core 3.1+和.NET 5/6,不支持Linux和macOS。
-
靜態全域選項:EO.Pdf的主要HTML至PDF入口點是靜態
HtmlToPdf.Options。 從多執行緒中變更全域狀態是不安全的,並且在多租戶Web應用中很不便。 - 付費商業授權:EO.Pdf分為單一、3授權套裝、企業和企業加強階層(沒有永久免費階層——只有30天的加水印試用)。 精確價格顯示在訂購頁面。
架構比較
| 方面 | EO.Pdf | IronPDF |
|---|---|---|
| 渲染器 | 內建Chromium(從IE/Trident轉換) | 嵌入的Chromium |
| 遺留問題 | IE/Trident遷移包袱 | 從開始到結束都採用Chromium構建 |
| 平台支持 | 僅針對.NET Core的Windows | Windows、Linux、macOS、Docker、Azure |
| 配置 | 靜態HtmlToPdf.Options(非執行緒安全) |
基於實例的ChromePdfRenderer(執行緒安全) |
| API設計 | 混合(HtmlToPdf靜態 + ACM物件模型) |
統一的ChromePdfRenderer + HTML/CSS |
| 授權模式 | 單一/3授權/企業/企業加強(30天試用) | 每開發者收費商業; 免費開發者試用 |
| 現代 .NET | .NET Framework + .NET Core 3.1+(僅限Windows) | .NET Framework、.NET 6/7/8/9跨平台 |
| 異步支援 | 有限 | 完整的RenderHtmlAsPdfAsync / RenderUrlAsPdfAsync |
主要遷移利益
- 跨平台支持.NET Core / .NET 6+:能在Linux、macOS和Docker上運行——不僅限於Windows
- 執行緒安全配置:基於實例而非靜態全域的渲染器選項
- 現代API:一致的方法名稱——
PdfDocument.Merge - 完整的異步支持:
RenderUrlAsPdfAsync用於非阻塞管道 - 文件說明:詳盡的教程、操作指南和活躍的物件參考
遷移前準備
前提條件
確保您的環境符合以下要求:
- .NET Framework 4.6.2+ or .NET Core 3.1 / .NET 5-9
- Visual Studio 2019+或VS Code與C#擴展
- NuGet包管理器存取 -IronPDF許可證金鑰(免費試用可在 ironpdf.com 獲得)
審核EO.Pdf使用情況
在您的方案目錄中運行這些命令以確定所有EO.Pdf引用:
# Find all EO.Pdf references
grep -r "EO.Pdf\|HtmlToPdf\|AcmRender\|PdfDocument" --include="*.cs" .
# Check NuGet packages
dotnet list package | grep -i "EO.Pdf"
# Find all EO.Pdf references
grep -r "EO.Pdf\|HtmlToPdf\|AcmRender\|PdfDocument" --include="*.cs" .
# Check NuGet packages
dotnet list package | grep -i "EO.Pdf"
需查找的常見EO.Pdf命名空間:
EO.Pdf- 核心HTML至PDFEO.Pdf.Acm- 高級內容模型(ACM)EO.Pdf.Contents- 低級內容操作EO.Pdf.Drawing- 圖形操作
理解核心模式變更
EO.Pdf和IronPDF之間最大的架構差異是配置範圍。 EO.Pdf使用具有全域選項的靜態方法,影響所有轉換——該模式在網頁應用中引發了執行緒安全問題。 IronPDF使用帶有本地選項的基於實例的渲染器,確保每次轉換都是獨立的。
逐步遷移過程
步驟1:更新NuGet包
移除EO.Pdf並安裝IronPDF:
# Remove EO.Pdf
dotnet remove package EO.Pdf
# Install IronPDF
dotnet add package IronPdf
# Remove EO.Pdf
dotnet remove package EO.Pdf
# Install IronPDF
dotnet add package IronPdf
步驟 2:更新命名空間引用
用IronPDF替換EO.Pdf命名空間:
// Remove these
using EO.Pdf;
using EO.Pdf.Acm;
// Add this
using IronPdf;
// Remove these
using EO.Pdf;
using EO.Pdf.Acm;
// Add this
using IronPdf;
Imports IronPdf
步驟3:配置授權
// Add at application startup (Program.cs or Startup.cs)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
// Add at application startup (Program.cs or Startup.cs)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
' Add at application startup (Program.vb or Startup.vb)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
完整 API 遷移參考
核心類映射
| EO.Pdf類別 | IronPDF等價 |
|---|---|
HtmlToPdf |
ChromePdfRenderer |
PdfDocument |
PdfDocument |
HtmlToPdfOptions |
ChromePdfRenderOptions |
AcmRender |
不需要 |
AcmText |
HTML <p> |
AcmBlock |
HTML |
方法映射
| EO.Pdf方法 | IronPDF方法 |
|---|---|
HtmlToPdf.ConvertHtml(html, path) |
renderer.RenderHtmlAsPdf(html) 然後 SaveAs(path) |
HtmlToPdf.ConvertUrl(url, path) |
renderer.RenderUrlAsPdf(url) 然後 SaveAs(path) |
PdfDocument.Save(path) |
pdf.SaveAs(path) |
new PdfDocument(path) |
PdfDocument.FromFile(path) |
PdfDocument.Merge(doc1, doc2)(靜態) |
PdfDocument.Merge(doc1, doc2)(靜態) |
選項映射
| EO.Pdf選項 | IronPDF RenderingOptions |
|---|---|
Options.PageSize = PdfPageSizes.A4 |
PaperSize = PdfPaperSize.A4 |
Options.OutputArea(RectangleF) |
MarginBottom,等等。 |
程式碼遷移範例
HTML到PDF轉換
基本的HTML至PDF轉換展示了從靜態方法到基於實例的渲染的轉變。
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 Class
IronPDF實現:
// 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
IronPDF的兩步模式(渲染,然後保存)允許存取PdfDocument物件,在保存前進行額外操作。 有關更多選項,請參閱HTML轉PDF文件。
URL 到 PDF 轉換
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 Module
IronPDF實現:
// 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
IronPDF的RenderUrlAsPdf提供完整的JavaScript執行和現代CSS支持。 有關更多選項,請參閱URL轉PDF文件。
具自定義設置的HTML文件
本例展示了配置模式的關鍵區別——EO.Pdf的OutputArea以英吋為單位,而IronPDF則在毫米中使用個別邊距屬性。
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 Class
IronPDF實現:
// 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
注意單位轉換:EO.Pdf在OutputArea中使用英吋,而IronPDF使用毫米。 轉換使用:inches × 25.4 = mm。 如需更多選項,請參閱渲染選項文件說明。
合併多個 PDF
兩個程式庫都公開了一個靜態Merge。
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");
// EO.Pdf has no Append; merge is a static method that returns a new PdfDocument.
PdfDocument mergedDoc = PdfDocument.Merge(doc1, 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");
// EO.Pdf has no Append; merge is a static method that returns a new PdfDocument.
PdfDocument mergedDoc = PdfDocument.Merge(doc1, doc2);
mergedDoc.Save("merged.pdf");
Console.WriteLine("PDFs merged successfully!");
}
}
Imports EO.Pdf
Imports System
Module Program
Sub Main()
Dim doc1 As New PdfDocument("file1.pdf")
Dim doc2 As New PdfDocument("file2.pdf")
' EO.Pdf has no Append; merge is a static method that returns a new PdfDocument.
Dim mergedDoc As PdfDocument = PdfDocument.Merge(doc1, doc2)
mergedDoc.Save("merged.pdf")
Console.WriteLine("PDFs merged successfully!")
End Sub
End Module
IronPDF實現:
// 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
IronPDF的靜態List。 注意從構造函式(PdfDocument.FromFile(path))的變化。 欲了解更多選項,請參閱 PDF合併文件。
關鍵遷移注意事項
邊距單位轉換
EO.Pdf在OutputArea中使用英吋。 IronPDF使用毫米。 轉換使用:inches × 25.4 = mm
// EO.Pdf - 0.5 inch margins
options.OutputArea = new RectangleF(0.5f, 0.5f, 7.5f, 10.5f);
//IronPDF- equivalent in millimeters (0.5" = 12.7mm)
renderer.RenderingOptions.MarginTop = 12.7;
renderer.RenderingOptions.MarginBottom = 12.7;
renderer.RenderingOptions.MarginLeft = 12.7;
renderer.RenderingOptions.MarginRight = 12.7;
// EO.Pdf - 0.5 inch margins
options.OutputArea = new RectangleF(0.5f, 0.5f, 7.5f, 10.5f);
//IronPDF- equivalent in millimeters (0.5" = 12.7mm)
renderer.RenderingOptions.MarginTop = 12.7;
renderer.RenderingOptions.MarginBottom = 12.7;
renderer.RenderingOptions.MarginLeft = 12.7;
renderer.RenderingOptions.MarginRight = 12.7;
' EO.Pdf - 0.5 inch margins
options.OutputArea = New RectangleF(0.5F, 0.5F, 7.5F, 10.5F)
' IronPDF- equivalent in millimeters (0.5" = 12.7mm)
renderer.RenderingOptions.MarginTop = 12.7
renderer.RenderingOptions.MarginBottom = 12.7
renderer.RenderingOptions.MarginLeft = 12.7
renderer.RenderingOptions.MarginRight = 12.7
從靜態轉為基於實例的配置
將所有renderer.RenderingOptions.X:
// EO.Pdf - static options (NOT thread-safe!)
HtmlToPdf.Options.PageSize = PdfPageSizes.A4;
//IronPDF- instance options (thread-safe)
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
// EO.Pdf - static options (NOT thread-safe!)
HtmlToPdf.Options.PageSize = PdfPageSizes.A4;
//IronPDF- instance options (thread-safe)
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
' EO.Pdf - static options (NOT thread-safe!)
HtmlToPdf.Options.PageSize = PdfPageSizes.A4
' IronPDF- instance options (thread-safe)
Dim renderer As New ChromePdfRenderer()
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4
ACM至HTML遷移
如果使用EO.Pdf的高級內容模型(AcmBlock),轉移至標準HTML/CSS:
// EO.Pdf ACM approach
var acmContent = new AcmContent();
acmContent.Add(new AcmText("Sample Text"));
//IronPDFHTML approach
var html = "<div>Sample Text</div>";
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
// EO.Pdf ACM approach
var acmContent = new AcmContent();
acmContent.Add(new AcmText("Sample Text"));
//IronPDFHTML approach
var html = "<div>Sample Text</div>";
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
' EO.Pdf ACM approach
Dim acmContent As New AcmContent()
acmContent.Add(New AcmText("Sample Text"))
' IronPDFHTML approach
Dim html As String = "<div>Sample Text</div>"
Dim renderer As New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf(html)
兩步保存模式
EO.Pdf直接在ConvertHtml()中保存。 IronPDF返回SaveAs():
// EO.Pdf - one step
HtmlToPdf.ConvertHtml(html, "output.pdf");
//IronPDF- two steps (enables manipulation before save)
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
// EO.Pdf - one step
HtmlToPdf.ConvertHtml(html, "output.pdf");
//IronPDF- two steps (enables manipulation before save)
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
' EO.Pdf - one step
HtmlToPdf.ConvertHtml(html, "output.pdf")
' IronPDF- two steps (enables manipulation before save)
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("output.pdf")
從構造函式到靜態工廠
將PdfDocument.FromFile(path):
// EO.Pdf
var doc = new PdfDocument("file.pdf");
// IronPDF
var doc = PdfDocument.FromFile("file.pdf");
// EO.Pdf
var doc = new PdfDocument("file.pdf");
// IronPDF
var doc = PdfDocument.FromFile("file.pdf");
' EO.Pdf
Dim doc = New PdfDocument("file.pdf")
' IronPDF
Dim doc = PdfDocument.FromFile("file.pdf")
後遷移檢查清單
完成程式碼遷移後,請驗證以下內容:
- 生成的PDF文件的視覺比較
- 驗證頁眉/頁腳正確渲染
- 測試安全/加密設置
- 驗證合併操作
- 性能基準測試
- 跨平台測試(Windows、Linux、macOS)
- 移除EO.Pdf授權文件
- 更新文件
其他資源
從EO.Pdf遷移到IronPDF解決了IE/Trident時代的遺留問題和EO.Pdf靜態全域選項的執行緒安全顧慮。 轉向基於實例的配置確保您的PDF生成程式碼能夠在併發載入下可靠運行,同時IronPDF的跨平台支持將部署擴展到Linux、macOS和Docker,不再局限於Windows。

