跳至页脚内容
迁移指南

如何用 C# 从 Spire.PDF 迁移到 IronPDF

从 Spire.PDF 迁移到 IronPDF:完整的 C# 迁移指南

从 Spire.PDF 迁移到IronPDF可将您的 PDF 生成工作流程从将文本渲染为图像的库转变为使用现代 Chromium 渲染引擎生成真实、可选择、可搜索文本的库。本指南提供了完整的分步迁移路径,可解决 Spire.PDF 关键的 HTML 渲染限制和字体嵌入问题。

为什么要从 Spire.PDF 迁移到 IronPDF.

了解 Spire.PDF.

Spire.PDF 是一个功能强大的商用 PDF 库,专为 .NET 开发人员高效处理 PDF 文档而设计。 Spire.PDF 因其特殊功能(尤其是在传统应用程序中)而在编程界声名鹊起,其集成功能可与 E-iceblue 工具集中的其他组件无缝对接。

然而,Spire.PDF 存在几个影响实际使用的基本问题,特别是 HTML 到 PDF 的转换和对现代网络标准的支持。

关键技术问题

问题影响IronPdf 解决方案
以图像形式呈现的文本PDF 无法搜索、无法访问、无法复制文本真实文本渲染
Internet Explorer 依赖性过时的渲染、安全风险现代 Chromium 引擎
字体嵌入失败文件在其他系统上看起来不对可靠的字体处理
大量部署足迹内存使用率高,启动速度慢高效部署
有限的 CSS 支持现代布局无法正确呈现完全支持 CSS3

核心问题:基于图像的 PDF 文件

Spire.PDF 的一个明显缺点是倾向于将 HTML 文档中的文本呈现为图像。 这将导致 PDF 文本无法选择或搜索,对于需要搜索功能或文档文本交互的应用程序来说,这可能是一个严重的限制。

当您使用 Spire.PDF 的 LoadFromHTML() 方法时,它通常会将文本渲染为位图图像而非实际文本,从而产生这些问题:

  • 文本不能选择
  • 不能搜索文本
  • 文本不得复制
  • 屏幕阅读器无法阅读(违反可访问性原则)
  • 文件较大
  • 缩放导致像素化

Spire.PDF 与IronPDF对比

特征Spire.PDFIronPDF
HTML 到 PDF 渲染文本呈现为图像真正的文本渲染(可选择、可搜索)
渲染引擎某些系统依赖于 Internet Explorer基于 Chromium,符合现代网络标准
字体处理字体嵌入的已知问题可靠、稳健的字体处理
CSS3 支持有限的满的
Flexbox/网格不支持全面支持
JavaScript语言有限的完整的 ES6+
PDF 辅助功能差(基于图像)出色的
API 设计复杂简单直观
部署足迹大型项目缓和
许可免费/商业商业翻译

对于计划在 2025 年和 2026 年之前采用 .NET 10 和 C# 14 的团队,IronPDF 通过将文本呈现为实际可选择的文本而不是图像,解决了 Spire.PDF 的 HTML 到 PDF 转换中的关键问题,确保了 PDF 的可搜索性和可访问性。


开始之前

前提条件

1..NET环境:.NET Framework 4.6.2+ 或 .NET Core 3.1+ / .NET 5/6/7/8/9+ 2.NuGet 访问:安装 NuGet 软件包的能力 3.IronPDF 许可证:从 ironpdf.com 获取许可证密钥

NuGet 软件包变更

# Remove Spire.PDF
dotnet remove package Spire.PDF
dotnet remove package FreeSpire.PDF  # If using free version

# Install IronPDF
dotnet add package IronPdf
# Remove Spire.PDF
dotnet remove package Spire.PDF
dotnet remove package FreeSpire.PDF  # If using free version

# Install IronPDF
dotnet add package IronPdf
SHELL

许可配置

// Add at application startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
// Add at application startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

完整的 API 参考

命名空间变更

// Before: Spire.PDF
using Spire.Pdf;
using Spire.Pdf.Graphics;
using Spire.Pdf.HtmlConverter;

// After: IronPDF
using IronPdf;
using IronPdf.Editing;
// Before: Spire.PDF
using Spire.Pdf;
using Spire.Pdf.Graphics;
using Spire.Pdf.HtmlConverter;

// After: IronPDF
using IronPdf;
using IronPdf.Editing;
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

核心 API 映射

Spire.PDFIronPDF备注
<代码>new PdfDocument()</ 代码<代码>new ChromePdfRenderer()</ 代码用于 HTML 渲染
<代码>pdf.LoadFromHTML()</代码<代码>renderer.RenderHtmlAsPdf()</代码HTML 转换
<代码>pdf.LoadFromFile()</代码<代码>PdfDocument.FromFile()</代码加载现有 PDF
<代码>pdf.SaveToFile()</代码<代码>pdf.SaveAs()</代码保存到文件
<代码>pdf.Close()</代码不需要使用处置模式
<代码>pdf.Pages.Add()</代码<代码>renderer.RenderHtmlAsPdf()</代码从 HTML 创建页面
<代码>pdf.InsertPageRange()</代码<代码>PdfDocument.Merge()</代码合并 PDF
<代码>page.Canvas.DrawString()</代码TextStamper + ApplyStamp()添加文本
<代码>PDFFont</代码HTML 中的 CSS 样式字体配置
<代码>PdfBrush</代码HTML 中的 CSS 样式颜色/填充配置

代码迁移示例

示例 1:HTML 到 PDF 的转换

之前 (Spire.PDF):

// NuGet: Install-Package Spire.PDF
using Spire.Pdf;
using Spire.Pdf.Graphics;
using System;

class Program
{
    static void Main()
    {
        PdfDocument pdf = new PdfDocument();
        PdfHtmlLayoutFormat htmlLayoutFormat = new PdfHtmlLayoutFormat();

        string htmlString = "<html><body><h1>Hello World</h1><p>This is a PDF from HTML.</p></body></html>";

        pdf.LoadFromHTML(htmlString, false, true, true);
        pdf.SaveToFile("output.pdf");
        pdf.Close();
    }
}
// NuGet: Install-Package Spire.PDF
using Spire.Pdf;
using Spire.Pdf.Graphics;
using System;

class Program
{
    static void Main()
    {
        PdfDocument pdf = new PdfDocument();
        PdfHtmlLayoutFormat htmlLayoutFormat = new PdfHtmlLayoutFormat();

        string htmlString = "<html><body><h1>Hello World</h1><p>This is a PDF from HTML.</p></body></html>";

        pdf.LoadFromHTML(htmlString, false, true, true);
        pdf.SaveToFile("output.pdf");
        pdf.Close();
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

After (IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();

        string htmlString = "<html><body><h1>Hello World</h1><p>This is a PDF from HTML.</p></body></html>";

        var pdf = renderer.RenderHtmlAsPdf(htmlString);
        pdf.SaveAs("output.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();

        string htmlString = "<html><body><h1>Hello World</h1><p>This is a PDF from HTML.</p></body></html>";

        var pdf = renderer.RenderHtmlAsPdf(htmlString);
        pdf.SaveAs("output.pdf");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

本例展示了 HTML 渲染的根本区别。 Spire.PDF 使用 LoadFromHTML()PdfHtmlLayoutFormat 对象,该对象通常将文本渲染为位图图像。 结果是用户无法选择、复制或搜索文本的 PDF 文件。

IronPDF 使用 ChromePdfRendererRenderHtmlAsPdf() ,生成完全可选择、可搜索和可访问的真实文本。 无需调用 Close() -IronPDF使用处置模式进行自动清理。有关全面的示例,请参阅 HTML to PDF 文档

示例 2:合并多个 PDF 文件

之前 (Spire.PDF):

// NuGet: Install-Package Spire.PDF
using Spire.Pdf;
using System;

class Program
{
    static void Main()
    {
        PdfDocument pdf1 = new PdfDocument();
        pdf1.LoadFromFile("document1.pdf");

        PdfDocument pdf2 = new PdfDocument();
        pdf2.LoadFromFile("document2.pdf");

        pdf1.InsertPageRange(pdf2, 0, pdf2.Pages.Count - 1);

        pdf1.SaveToFile("merged.pdf");
        pdf1.Close();
        pdf2.Close();
    }
}
// NuGet: Install-Package Spire.PDF
using Spire.Pdf;
using System;

class Program
{
    static void Main()
    {
        PdfDocument pdf1 = new PdfDocument();
        pdf1.LoadFromFile("document1.pdf");

        PdfDocument pdf2 = new PdfDocument();
        pdf2.LoadFromFile("document2.pdf");

        pdf1.InsertPageRange(pdf2, 0, pdf2.Pages.Count - 1);

        pdf1.SaveToFile("merged.pdf");
        pdf1.Close();
        pdf2.Close();
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

After (IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Program
{
    static void Main()
    {
        var pdf1 = PdfDocument.FromFile("document1.pdf");
        var pdf2 = PdfDocument.FromFile("document2.pdf");

        var merged = PdfDocument.Merge(pdf1, pdf2);

        merged.SaveAs("merged.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Program
{
    static void Main()
    {
        var pdf1 = PdfDocument.FromFile("document1.pdf");
        var pdf2 = PdfDocument.FromFile("document2.pdf");

        var merged = PdfDocument.Merge(pdf1, pdf2);

        merged.SaveAs("merged.pdf");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Spire.PDF 需要使用<代码>new PdfDocument()</ 代码+ LoadFromFile() 手动加载每个文档,然后使用 InsertPageRange() 指定要插入的页面,最后在每个文档上调用 Close()

IronPDF 使用更简单的<代码>PdfDocument.FromFile()</代码模式和静态<代码>PdfDocument.Merge()</代码方法,该方法可接受多个文档。 无需调用 Close()。 在我们的教程中了解更多信息。

示例 3:向 PDF 添加文本

之前 (Spire.PDF):

// NuGet: Install-Package Spire.PDF
using Spire.Pdf;
using Spire.Pdf.Graphics;
using System.Drawing;
using System;

class Program
{
    static void Main()
    {
        PdfDocument pdf = new PdfDocument();
        PdfPageBase page = pdf.Pages.Add();

        PdfFont font = new PdfFont(PdfFontFamily.Helvetica, 20);
        PdfBrush brush = new PdfSolidBrush(Color.Black);

        page.Canvas.DrawString("Hello from Spire.PDF!", font, brush, new PointF(50, 50));

        pdf.SaveToFile("output.pdf");
        pdf.Close();
    }
}
// NuGet: Install-Package Spire.PDF
using Spire.Pdf;
using Spire.Pdf.Graphics;
using System.Drawing;
using System;

class Program
{
    static void Main()
    {
        PdfDocument pdf = new PdfDocument();
        PdfPageBase page = pdf.Pages.Add();

        PdfFont font = new PdfFont(PdfFontFamily.Helvetica, 20);
        PdfBrush brush = new PdfSolidBrush(Color.Black);

        page.Canvas.DrawString("Hello from Spire.PDF!", font, brush, new PointF(50, 50));

        pdf.SaveToFile("output.pdf");
        pdf.Close();
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

After (IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Editing;
using System;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf("<html><body></body></html>");

        var textStamper = new TextStamper()
        {
            Text = "Hello from IronPDF!",
            FontSize = 20,
            VerticalOffset = 50,
            HorizontalOffset = 50
        };

        pdf.ApplyStamp(textStamper);
        pdf.SaveAs("output.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Editing;
using System;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf("<html><body></body></html>");

        var textStamper = new TextStamper()
        {
            Text = "Hello from IronPDF!",
            FontSize = 20,
            VerticalOffset = 50,
            HorizontalOffset = 50
        };

        pdf.ApplyStamp(textStamper);
        pdf.SaveAs("output.pdf");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Spire.PDF 采用基于画布的绘图模型,使用 PdfFont,<代码>PdfBrush</代码和<代码>page.Canvas.DrawString()</代码在特定坐标处使用 PointF 定位文本。

IronPdf 使用一个 TextStamper 对象,该对象具有 Text, FontSize, VerticalOffsetHorizontalOffset 等直观属性,然后使用 ApplyStamp() 进行应用。 这种方法更具声明性,更易于维护。


文本即图像问题

为什么这一点至关重要

当 Spire.PDF 使用基于图像的渲染技术将 HTML 转换为 PDF 时,您的文档将失去基本功能:

1.无文本搜索:用户不能使用 Ctrl+F 查找文本。 文档管理系统无法对内容进行索引。

2.无文本选择/复制:用户在尝试复制引用、参考或数据时无法选择文本--这是一张图片。

3.可访问性违规:基于图像的 PDF 不符合 WCAG 2.1 合规性、第 508 条合规性(美国政府)、ADA 要求和屏幕阅读器兼容性。

4.文件大小:相同内容比较显示,Spire.PDF(基于图像)生成的文件比 IronPDF(基于文本)大 16 倍。

检测:您的 PDF 是否基于图像? 打开 Spire.PDF 生成的文档并尝试这些测试: 1.**文本选择**:单击并拖动文本。 如果没有什么亮点 → 基于图像 2.**Ctrl+F搜索**:搜索页面上的任何单词。 如果 "未找到匹配内容",请选择 "基于图像"。 3.**复制/粘贴**:选择并复制文本到记事本。 如果没有粘贴 → 基于图像 --- ## Internet Explorer 问题 ### Spire.PDF 的渲染引擎 在某些环境中,Spire.PDF 的 HTML 渲染依赖于 Internet Explorer/Edge Legacy。 IE 已于 2022 年废弃,现代 CSS 无法使用,JavaScript 支持有限,不同系统的渲染效果不一致。 ### 在 Spire.PDF 中失效的现代 CSS. ```html
Column 1
Column 2
Item 1
Item 2
Item 3
``` IronPDF 使用现代 Chromium 渲染技术,因此所有这些 CSS 功能都能正常工作。 --- ## 迁移后的新功能 迁移到IronPDF后,您将获得 Spire.PDF 无法提供的功能: ### 可选择、可搜索文本 ```csharp var renderer = new ChromePdfRenderer(); var pdf = renderer.RenderHtmlAsPdf("

Important Contract

"); pdf.SaveAs("contract.pdf"); // Result: // ✅ Text is fully selectable // ✅ Text is searchable with Ctrl+F // ✅ Text can be copied to clipboard // ✅ Screen readers work perfectly // ✅ File size is compact // ✅ Zooming is crystal clear ``` ### 现代 CSS 支持 ```csharp var renderer = new ChromePdfRenderer(); var html = @"
Column 1
Column 2
Item 1
Item 2
Item 3
"; var pdf = renderer.RenderHtmlAsPdf(html); // All modern CSS features render correctly! ``` ### 基于 HTML 的水印 ```csharp var pdf = renderer.RenderHtmlAsPdf(html); pdf.ApplyWatermark(@"
DRAFT
"); ``` --- ## 迁移清单 ### 迁移前 - [ ] 清点代码库中所有 Spire.PDF 的用法 - [测试现有 PDF 文本的可选择性(关键问题检测) - [文档中的 `LoadFromHTML()` 调用(优先修复这些调用) - [ ] 从 [ironpdf.com](https://ironpdf.com) 获取IronPDF许可证密钥 ### 代码更新 - [ ] 移除 `Spire.PDF` NuGet 软件包(如果使用免费版本,则移除 FreeSpire.PDFnew PdfDocument()PdfDocument.FromFile()PdfDocument.Merge()pdf.LoadFromHTML()→<代码>renderer.RenderHtmlAsPdf()InsertPageRange()→<代码>PdfDocument.Merge()SaveToFile()→<代码>SaveAs()
Curtis Chau
技术作家

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

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