IRONSOFTWAREHOME
视频

如何在HTML到PDF转换中管理字体

Curtis Chau
Curtis Chau
Updated: 2026年5月18日

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

EO.Pdf 的问题

  1. 绑定的 Chromium 占用: EO.Pdf(当前 NuGet 版本 26.1.34,2026年3月)发送其自己的基于 Chromium 的渲染器,这增加了相对于非 Chromium 库的安装占用,并增加了 Docker 镜像和 CI/CD 管道的重量。

  2. 遗留架构包袱: EO.Pdf 的 HTML 转 PDF 转换器最初是在嵌入式 Internet Explorer / Trident 引擎上构建的,然后项目转移到一个基于 Chromium 的渲染器。 过渡留下了一些 API 怪异以及版本之间的行为差异。

  3. **仅 Windows 的 .NET Core:**尽管宣传为"跨平台",Essential Objects 自己的 .NET Core 文档表明 EO.Pdf 支持 .NET Core 3.1+ 和 .NET 5/6 的 Windows——Linux 和 macOS 并未得到官方支持。

  4. 静态全局选项: EO.Pdf 的主要 HTML 转 PDF 入口点是静态 HtmlToPdf 类与共享 HtmlToPdf.Options。 从多个线程改变这个全局状态是不安全的,并且在多租户 Web 应用程序中很尴尬。

  5. 付费商业许可证: EO.Pdf 作为单个、3-许可证捆绑、公司和公司 Plus 等级出售(无永久免费等级 — 只有 30 天水印试用)。 确切的价格出现在 订购页面上。

架构比较

方面EO.PdfIronPDF
渲染器捆绑的 Chromium(从 IE/Trident 转移)嵌入式 Chromium
版权问题IE/Trident 迁移包袱从开始就基于 Chromium 构建
平台支持仅在 .NET Core 上运行 WindowsWindows、Linux、macOS、Docker、Azure
配置静态 HtmlToPdf.Options (非线程安全)基于实例的 ChromePdfRenderer (线程安全)
API 设计混合(HtmlToPdf 静态 + ACM 对象模型)统一 ChromePdfRenderer + HTML/CSS
许可模式单个 / 3-许可证 / 公司 / 公司 Plus(30 天试用)每开发人员商业; 免费开发者试用
现代.NET.NET Framework + .NET Core 3.1+(仅限 Windows).NET Framework, .NET 6/7/8/9 跨平台
支持同步有限的完整 RenderHtmlAsPdfAsync / RenderUrlAsPdfAsync

主要迁移优势

  1. 跨平台 .NET Core/.NET 6+: 工作在 Linux, macOS, 和 Docker — 不仅限于 Windows
  2. 线程安全配置: 基于实例的渲染器选项,而非静态全局
  3. 现代 API: 一致的方法命名 — RenderHtmlAsPdf, RenderUrlAsPdf, PdfDocument.Merge
  4. 完整异步支持: RenderHtmlAsPdfAsyncRenderUrlAsPdfAsync 用于非阻塞管道
  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"
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
SHELL

步骤 2:更新命名空间引用

用IronPDF替换 EO.Pdf 命名空间:

// 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";

完整的 API 迁移参考

核心类映射

EO.Pdf 类IronPDF 同等产品
HtmlToPdfChromePdfRenderer
PdfDocumentPdfDocument
HtmlToPdfOptionsChromePdfRenderOptions
AcmRender不需要
AcmTextHTML <span>, <p>
AcmBlockHTML <div>

方法映射

EO.Pdf 方法IronPDF 方法
HtmlToPdf.ConvertHtml(html, path)renderer.RenderHtmlAsPdf(html) 然后 SaveAs(path)
HtmlToPdf.ConvertUrl(url, path)renderer.RenderUrlAsPdf(url) 然后 SaveAs(path)
PdfDocument.Save(path)pdf.SaveAs(path)
new PdfDocument(path)PdfDocument.FromFile(path)
PdfDocument.Merge(doc1, doc2) (静态)PdfDocument.Merge(doc1, doc2) (静态)

选项映射

EO.Pdf 选项IronPDF 渲染选项
Options.PageSize = PdfPageSizes.A4PaperSize = 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!");
    }
}

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

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

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

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

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

请注意单位转换:EO.Pdf 在 OutputArea 中使用英寸,而IronPDF使用毫米。 转换使用:inches × 25.4 = mm。 有关更多选项,请参阅渲染选项文档

合并多个 PDF 文件

两个库都提供了一个静态 PdfDocument.Merge 用于合并文档——EO.Pdf 无实例 Append 方法,因此任何使用 doc.Append(other) 的代码都是无效的,需要迁移到 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");

        // EO.Pdf has no Append; merge is a static method that returns a new PdfDocument.
        PdfDocument mergedDoc = PdfDocument.Merge(doc1, 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!");
    }
}

IronPDF 的静态 Merge 接受文档的参数列表或一个 List<PdfDocument>。 请注意从构造函数(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;

从静态配置到基于实例的配置

将所有 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;

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 直接保存于 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");

构造函数到静态工厂

new PdfDocument(path) 替换为 PdfDocument.FromFile(path)

// EO.Pdf
var doc = new PdfDocument("file.pdf");

// IronPDF
var doc = PdfDocument.FromFile("file.pdf");

迁移后核对表

完成代码迁移后,请验证以下内容:

  • 生成PDF文件的可视化比较
  • 验证页眉/页脚是否正确显示。
  • 测试安全/加密设置
  • 验证合并操作
  • 性能基准测试
  • 跨平台测试(Windows、Linux、macOS)
  • 删除 EO.Pdf 许可证文件
  • 更新文档

其他资源


从 EO.Pdf 迁移到IronPDF解决了遗留的 IE/Trident 时代包袱和 EO.Pdf 的静态全局选项的线程安全问题。 迁移到基于实例的配置确保您的 PDF 生成代码在并发负载下可靠运行,而IronPDF的跨平台支持将部署扩展到 Windows 之外的 Linux、macOS 和 Docker。

请注意: EO.Pdf 和 Essential Objects 是其所属者的商标。 本网站未与 Essential Objects 关联,未被其认可或赞助。 所有产品名称、徽标和品牌均为各自所有者的财产。 比较仅供参考,反映撰写时公开可用的信息。
Curtis Chau
技术作家

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

...
阅读更多

相关文章

Key in blue circle

立即获取免费的 30 天试用版密钥

Your trial license will be sent to your email address

无任何限制。100% 解锁。无需信用卡。

bullet_checked无需信用卡或创建账户无任何限制。100% 解锁。无需信用卡。
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
预约您的免费现场演示
Booking Badge

深受全球数百万工程师信赖

Iron Software 的客户徽标
获取您的无义务咨询
填写下面的表格或通过sales@ironsoftware.com
您的资料将始终保密。
深受全球数百万工程师信赖
Iron Software 的客户徽标
立即获取您的免费30 天试用密钥
无需信用卡或创建账户