跳過到頁腳內容
MIGRATION GUIDES

How to Migrate from EO.Pdf to IronPDF in C#

EO.Pdf 提出了幾個架構方面的挑戰,促使開發團隊評估各種替代方案。 了解這些問題對於制定遷移策略至關重要。

EO.Pdf 問題

  1. 126MB 的龐大軟體包大小: EO.Pdf 捆綁了自己的 Chromium 引擎,導致部署佔用空間達到 126MB。 這會導致 Docker 映像體積膨脹,降低 CI/CD 管線速度,並增加基礎設施成本。

2.遺留架構包袱: EO.Pdf 最初是基於 Internet Explorer 的渲染引擎構建的,之後遷移到了 Chromium。 這種遺留問題導致了 IE 時代的兼容性問題、API 設計中的技術債以及版本之間的不一致行為。

3.以 Windows 為中心的設計:儘管 EO.Pdf 被宣傳為"跨平台",但其對 Linux 和 macOS 的支援卻很有限。 許多開發者反映在非 Windows 部署環境中存在問題。

4.靜態全域選項: EO.Pdf 使用靜態HtmlToPdf.Options進行配置,並非執行緒安全,在多租戶 Web 應用程式中存在問題。

5.每許可證 799 美元: EO.Pdf 的開發者許可證價格為 799 美元,與其他提供類似或更好功能的替代方案相比,價格昂貴。

架構比較

方面 EO.Pdf IronPDF
包裝尺寸 126MB 優化後(約50MB)
遺留問題 IE移民行李 簡潔、現代的程式碼庫
平台支援 以 Windows 為中心的 真正的跨平台
配置 靜態/全域(非線程安全) 基於實例,線程安全
API設計 混合(HtmlToPdf + ACM) 統一、一致
文件 有限的 綜合教程
近代 .NET .NET 標準 .NET 6/7/8/9+ 原生
非同步支援 有限的 完全異步/等待

遷移的主要優勢

1.佔用空間減少 50%: IronPDF 優化的 Chromium 封裝 2.真正的跨平台:在 Windows、Linux、macOS 和 Docker 上都能完美運作 3.執行緒安全配置:基於實例的渲染器選項 4.現代 API:一致且直覺的方法名稱 5.更完善的文件:豐富的教學與範例

遷移前準備

先決條件

請確保您的環境符合以下要求:

  • .NET Framework 4.6.2+ 或 .NET Core 3.1 / .NET 5-9
  • Visual Studio 2019+ 或帶有 C# 擴充功能的 VS Code
  • 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"
SHELL

常見的 EO.Pdf 命名空間:

  • EO.Pdf - 核心 HTML 轉 PDF
  • EO.Pdf.Acm - 高級內容模型 (ACM)
  • EO.Pdf.Contents - 低階內容操縱
  • EO.Pdf.Drawing - 圖形操作

理解核心模式變化

EO.Pdf 和 IronPDF 之間最顯著的架構差異在於配置範圍。 EO.Pdf 使用具有全域選項的靜態方法,這些選項會影響所有轉換—這種模式會導致 Web 應用程式出現執行緒安全性問題。 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
SHELL

步驟 2:更新命名空間引用

將 EO.Pdf 命名空間替換為 IronPDF:

// 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;
$vbLabelText   $csharpLabel

步驟 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";
$vbLabelText   $csharpLabel

完整的 API 遷移參考

核心類別映射

EO.Pdf 類 IronPDF當量 筆記
HtmlToPdf ChromePdfRenderer 基於實例
PdfDocument PdfDocument 相似但不同的方法
HtmlToPdfOptions ChromePdfRenderOptions 透過RenderingOptions
AcmRender 不需要 改用 HTML/CSS
AcmText HTML<span><p>
AcmBlock HTML<div>

方法映射

EO.Pdf 方法 IronPDF 方法 筆記
HtmlToPdf.ConvertHtml(html, path) renderer.RenderHtmlAsPdf(html)然後SaveAs(path) IronPDF 中的兩步驟法
HtmlToPdf.ConvertUrl(url, path) renderer.RenderUrlAsPdf(url)然後SaveAs(path)
PdfDocument.Save(path) pdf.SaveAs(path)
new PdfDocument(path) PdfDocument.FromFile(path) 靜態工廠
doc.Append(other) PdfDocument.Merge(doc1, doc2) 靜態合併方法

選項映射

EO.Pdf選項 IronPDF渲染選項 筆記
Options.PageSize = PdfPageSizes.A4 PaperSize = PdfPaperSize.A4
Options.OutputArea (RectangleF) MarginTopMarginBottom等。 單一屬性(毫米)

程式碼遷移範例

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!");
    }
}
$vbLabelText   $csharpLabel

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!");
    }
}
$vbLabelText   $csharpLabel

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!");
    }
}
$vbLabelText   $csharpLabel

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!");
    }
}
$vbLabelText   $csharpLabel

IronPDF 的RenderUrlAsPdf提供完整的 JavaScript 執行和現代 CSS 支援。 更多選項請參閱PDF 文件的 URL

帶有自訂設定的 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.");
    }
}
$vbLabelText   $csharpLabel

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.");
    }
}
$vbLabelText   $csharpLabel

請注意單位轉換:EO.Pdf 在OutputArea中使用英寸,而 IronPDF 使用毫米。 換算方法: inches × 25.4 = mm 。 更多選項請參閱渲染選項文件

合併多個PDF文件

PDF 合併示範了 EO.Pdf 的Append循環模式與 IronPDF 的靜態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");

        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!");
    }
}
$vbLabelText   $csharpLabel

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!");
    }
}
$vbLabelText   $csharpLabel

IronPDF 的靜態Merge方法接受一組文檔,簡化了多文檔合併。 請注意建構函式( new PdfDocument(path) )到靜態工廠( 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;
$vbLabelText   $csharpLabel

從靜態配置到基於實例的配置

將所有HtmlToPdf.Options.X替換為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;
$vbLabelText   $csharpLabel

ACM 到 HTML 的遷移

如果使用 EO.Pdf 的高階內容模型( AcmRenderAcmTextAcmBlock ),請移轉至標準 HTML/CSS:

// EO.Pdf ACM approach
var acmContent = new AcmContent();
acmContent.Add(new AcmText("Sample Text"));

// IronPDF HTML 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"));

// IronPDF HTML approach
var html = "<div>Sample Text</div>";
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
$vbLabelText   $csharpLabel

兩步驟保存模式

EO.Pdf 直接保存在ConvertHtml()中。 IronPDF 傳回PdfDocument對象,然後呼叫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");
$vbLabelText   $csharpLabel

建構函數到靜態工廠

new PdfDocument(path)替換為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");
$vbLabelText   $csharpLabel

遷移後檢查清單

程式碼遷移完成後,請驗證以下內容:

  • 產生PDF檔案的可視化比較
  • 驗證頁首/頁尾是否正確顯示。
  • 測試安全/加密設置
  • 驗證合併操作
  • 性能基準測試
  • 跨平台測試(Windows、Linux、macOS)
  • 刪除 EO.Pdf 授權文件
  • 更新文檔

讓您的 PDF 基礎架構面向未來

隨著 .NET 10 即將到來,C# 14 也引入了新的語言特性,選擇一個具有現代 .NET 原生支援的 PDF 程式庫可以確保長期的兼容性。 IronPDF 基於實例、線程安全的架構符合當代 Web 應用程式模式——這對於多租戶 SaaS 應用程式來說尤其重要,因為 EO.Pdf 的靜態全域選項會造成並發問題。

其他資源

IronPDF 文件


從 EO.Pdf 遷移到 IronPDF 可以消除 126MB 的包膨脹、遺留的 IE 時代遺留問題以及靜態全局選項帶來的線程安全問題。 過渡到基於實例的配置可確保您的 PDF 生成程式碼在多執行緒 Web 應用程式中可靠地運行,同時提供真正的跨平台部署支援。

Curtis Chau
技術撰稿人

Curtis Chau 擁有電腦科學學士學位(卡爾頓大學),專長於前端開發,精通 Node.js、TypeScript、JavaScript 和 React。Curtis 對製作直覺且美觀的使用者介面充滿熱情,他喜歡使用現代化的架構,並製作結構良好且視覺上吸引人的手冊。

除了開發之外,Curtis 對物聯網 (IoT) 也有濃厚的興趣,他喜歡探索整合硬體與軟體的創新方式。在空閒時間,他喜歡玩遊戲和建立 Discord bots,將他對技術的熱愛與創意結合。