如何用 C# 从 EO.Pdf 迁移到 IronPDF
EO.Pdf 在架构上提出了一些挑战,促使开发团队对替代方案进行评估。 了解这些问题对于规划迁移策略至关重要。
EO.Pdf 的问题
- 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.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"需要查找的常见 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;步骤 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";完整的 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!");
}
}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!");
}
}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!");
}
}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!");
}
}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.");
}
}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.");
}
}注意单位转换: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!");
}
}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!");
}
}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;从静态配置到基于实例的配置
将所有 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;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);两步保存模式
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");构造函数到静态工厂
将<代码>新建 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");迁移后核对表
完成代码迁移后,请验证以下内容:
- 生成PDF文件的可视化比较
- 验证页眉/页脚是否正确显示。
- 测试安全/加密设置
- 验证合并操作
- 性能基准测试
- 跨平台测试(Windows、Linux、macOS)
- 删除 EO.Pdf 许可证文件
- 更新文档
未来保护您的 PDF 基础架构
随着 .NET 10 即将推出,C# 14 也将引入新的语言特性,选择一个支持现代 .NET 本机的 PDF 库可以确保长期的兼容性。IronPDF基于实例的线程安全架构符合当代网络应用模式--这对于多租户 SaaS 应用程序尤为重要,因为 EO.Pdf 的静态全局选项会产生并发问题。
其他资源
从 EO.Pdf 迁移到IronPDF可以消除126MB包的臃肿、IE 时代的遗留包袱以及静态全局选项带来的线程安全问题。 向基于实例的配置过渡可确保您的 PDF 生成代码在多线程网络应用程序中可靠运行,同时提供真正的跨平台部署支持。






