比較

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.PdfIronPDF
包大小更大的部署足跡優化的包裝
遺留問題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 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 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 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, RenderingOptions對象上。 單位差異需要轉換: inches × 25.4 = millimeters

方法對應參考

對於評估EO.Pdf遷移或比較功能的開發者,此對應顯示等效操作。

核心操作

EO.PdfIronPDF
HtmlToPdf.ConvertHtml(html, path)renderer.RenderHtmlAsPdf(html) 然後 SaveAs()
HtmlToPdf.ConvertUrl(url, path)renderer.RenderUrlAsPdf(url) 然後 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選項IronPDF RenderingOptions
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

在處理多個並發請求的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")
$vbLabelText   $csharpLabel

每個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的優勢

  • 優化的足跡: 約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,通過免費試用,並查看更多詳細文檔,來評估其對您的具體需求是否合適。