比較

EO.Pdf vs 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進行配置,這在多租戶網頁應用程式中造成執行緒安全性的擔憂。

了解IronPDF

IronPDF是一個為現代.NET環境設計的.NET PDF程式庫,採用優化的Chromium包裝方法,從而減少了部署佔用空間。 該程式庫提供對所有平台的平等支援,而不是偏好Windows,使其適用於部署在多樣化環境中的應用程式。

IronPDF通過ChromePdfRenderer物件使用基於實例的配置,確保在並發場景下執行執行緒安全。 每個渲染器實例維護自己的RenderingOptions,將配置與其他操作隔離。

架構和配置比較

這些.NET PDF程式庫的根本架構差異在於它們的配置方法和部署特徵。

方面EO.PdfIronPDF
包大小較大的部署佔用空間優化的包裝
遺留問題IE遷移包袱乾淨、現代程式碼庫
平台支持以Windows為主真正的跨平台
配置靜態/全域基於實例,執行緒安全
價格$2,998/開發者有競爭力的定價
API設計混合型(HtmlToPdf + ACM)統一且一致
文件有限詳細的教程
現代.NET.NET Standard.NET 6/7/8/9+ 原生支援
Async 支援有限完整的async/await

配置模型代表了一個關鍵的區別。 程式庫的靜態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 Class
$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!");
    }
}
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
$vbLabelText   $csharpLabel

該程式庫使用靜態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 Module
$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!");
    }
}
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
$vbLabelText   $csharpLabel

這兩個程式庫都提供URL到PDF的能力,EO.Pdf使用靜態RenderUrlAsPdf()。 相同的執行緒安全性區別適用。

了解更多關於URL渲染的資訊,請參閱URL到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 Class
$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!");
    }
}
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
$vbLabelText   $csharpLabel

這個解決方案通過構造函式載入文件(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 Class
$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.");
    }
}
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
$vbLabelText   $csharpLabel

轉換器使用RectangleF。 IronPDF在MarginTop, MarginBottom, MarginLeft, MarginRight)。 單位差異需要轉換:inches × 25.4 = millimeters

方法映射參考

對於評估EO.Pdf遷移或比較功能的開發者,這個映射顯示了等價的操作:

核心操作

EO.PdfIronPDF
HtmlToPdf.ConvertHtml(html, path)SaveAs()
HtmlToPdf.ConvertUrl(url, path)SaveAs()
HtmlToPdf.Options.PageSizerenderer.RenderingOptions.PaperSize
HtmlToPdf.Options.OutputAreaMarginTop/Bottom/Left/Right
new PdfDocument(path)PdfDocument.FromFile(path)
doc.Append(other)PdfDocument.Merge(doc1, doc2)
doc.Save(path)pdf.SaveAs(path)

配置映射

EO.Pdf選項IronPDFRenderingOptions
Options.PageSize = PdfPageSizes.A4PaperSize = PdfPaperSize.A4
Options.PageSize = PdfPageSizes.LetterPaperSize = PdfPaperSize.Letter
Options.OutputArea(RectangleF)MarginTop, MarginBottom, 等等。
Options.BaseUrlBaseUrl

類映射

EO.Pdf類IronPDF等效
HtmlToPdfChromePdfRenderer
PdfDocumentPdfDocument
HtmlToPdfOptionsChromePdfRenderOptions
AcmRender無需
AcmTextHTML <span>, <p>
AcmBlockHTML <div>

功能比較總結

功能EO.PdfIronPDF
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")
$vbLabelText   $csharpLabel

在處理多個並發請求的網頁應用程式中,一個請求的配置會影響所有其他請求。 這會創造競態條件,導致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")
$vbLabelText   $csharpLabel

每個ChromePdfRenderer實例維持其自己的配置,確保在並發場景中的隔離。

團隊考慮從EO.Pdf轉移到IronPDF的時候

開發團隊因多種原因評估從EO.Pdf遷移到IronPDF:

包大小優化: EO.Pdf的較大部署佔用空間會膨脹Docker映像,減慢CI/CD流程,並增加基礎設施成本。 IronPDF的優化包裝提供了部署效率的改進。

執行緒安全需求:多租戶網頁應用程式需要每個請求的隔離配置。程式庫的靜態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的Advanced Content Model(AcmRender, AcmText, AcmBlock)的團隊發現IronPDF的HTML/CSS方法更簡單和更易維護。

優勢和考量

EO.Pdf優勢

  • Chromium渲染: 高質量的W3C相容輸出
  • 成熟的程式庫: 在生產環境中經受住驗證
  • 單步驟轉換: 通過ConvertHtml()直接文件輸出

EO.Pdf考量

  • 包大小巨大: 126MB的部署佔用空間
  • 遺留IE包袱: 從遷移帶來的相容性問題
  • 靜態配置: 多租戶應用中的執行緒安全問題
  • 以Windows為中心: 有限的Linux/macOS支援
  • 價格點: $2,998每開發者授權
  • 有限的文件: 較少的教程和範例

IronPDF的優勢

  • 優化的佔用空間:大約50MB的包大小(縮小50%)
  • 真正的跨平台: Windows, Linux, macOS, Docker
  • 執行緒安全配置: 基於實例的渲染器選項
  • 現代API:一致的、直觀的方法名稱
  • 積極的開發:定期更新和安全補丁
  • 全面的資源: 豐富的教程文件

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提供了一個更合適的方法。

免費試用 開始評估 IronPDF,並探索全面的文件以評估特定需求的適用性。