跳至页脚内容
迁移指南

如何用 C# 从 EO.Pdf 迁移到 IronPDF

EO.Pdf 在架构上提出了一些挑战,促使开发团队对替代方案进行评估。 了解这些问题对于规划迁移策略至关重要。

EO.Pdf 的问题

  1. 126MB 的庞大软件包大小: EO.Pdf 捆绑了自己的 Chromium 引擎,导致部署占用空间达到 126MB。 在翻译过程中,我们必须注意到,很多开发人员在使用 Docker 时,都会将 Docker 镜像放在 Docker 上,这样会膨胀 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.PdfIronPDF
软件包大小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 使用静态方法,其全局选项会影响所有转换--这种模式会导致网络应用程序中的线程安全问题。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:更新命名空间引用

用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;
$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</代码基于实例
<代码>PDF 文档</代码<代码>PDF 文档</代码相似但不同的方法
<代码>HtmlToPdfOptions</代码<代码>ChromePdfRenderOptions</代码通过 RenderingOptions
<代码>AcmRender</代码不需要使用 HTML/CSS 代替
<代码>AcmText</代码HTML <span>, <p>
<代码>AcmBlock</代码HTML <div>

方法映射

EO.Pdf 方法IronPdf 方法备注
<代码>HtmlToPdf.ConvertHtml(html,路径)</代码renderer.RenderHtmlAsPdf(html) then SaveAs(path) 然后IronPDF 中的两个步骤
<代码>HtmlToPdf.ConvertUrl(url, path)</ 代码renderer.RenderUrlAsPdf(url) 然后SaveAs(path)
<代码>PdfDocument.Save(路径)</代码<代码>pdf.SaveAs(路径)</代码
<代码>新建 PdfDocument(path)</ 代码<代码>PdfDocument.FromFile(路径)</代码静态工厂
<代码>doc.Append(其他)</代码<代码>PdfDocument.Merge(doc1, doc2)</ 代码静态合并法

选项映射

EO.Pdf 选项IronPdf 渲染选项备注
<代码>Options.PageSize = PdfPageSizes.A4</ 代码<代码>PaperSize = PdfPaperSize.A4</ 代码
Options.OutputArea (RectangleF)MarginTop, 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!");
    }
}
$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 的两步模式(渲染,然后保存)提供了对<代码>PDF 文档</代码对象的访问,以便在保存前进行额外操作。 有关更多选项,请参阅 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 支持。 有关更多选项,请参阅 URL to 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.");
    }
}
$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 使用毫米。 转换使用:<代码>英寸 × 25.4 = 毫米</代码>。 有关更多选项,请参阅渲染选项文档

合并多个 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 使用毫米。 转换使用:<代码>英寸 × 25.4 = 毫米</代码

// 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 的高级内容模型(AcmRender, AcmText, 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);
$vbLabelText   $csharpLabel

两步保存模式

EO.Pdf 可直接保存在 ConvertHtml() 中。IronPDF返回一个<代码>PDF 文档</代码对象,然后您调用 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

构造函数到静态工厂

将<代码>新建 PdfDocument(path)</ 代码替换为<代码>PdfDocument.FromFile(路径)</代码:

// 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基于实例的线程安全架构符合当代网络应用模式--这对于多租户 SaaS 应用程序尤为重要,因为 EO.Pdf 的静态全局选项会产生并发问题。

其他资源


从 EO.Pdf 迁移到IronPDF可以消除126MB包的臃肿、IE 时代的遗留包袱以及静态全局选项带来的线程安全问题。 向基于实例的配置过渡可确保您的 PDF 生成代码在多线程网络应用程序中可靠运行,同时提供真正的跨平台部署支持。

Curtis Chau
技术作家

Curtis Chau 拥有卡尔顿大学的计算机科学学士学位,专注于前端开发,精通 Node.js、TypeScript、JavaScript 和 React。他热衷于打造直观且美观的用户界面,喜欢使用现代框架并创建结构良好、视觉吸引力强的手册。

除了开发之外,Curtis 对物联网 (IoT) 有浓厚的兴趣,探索将硬件和软件集成的新方法。在空闲时间,他喜欢玩游戏和构建 Discord 机器人,将他对技术的热爱与创造力相结合。