跳過到頁腳內容
遷移指南

如何在 C# 中從 Spire.PDF 遷移到 IronPDF

從 Spire.PDF 遷移到 IronPDF:完整的 C# 遷移指南。

從 Spire.PDF 轉換到IronPDF可將您的 PDF 生成工作流程從將文字渲染為圖像的函式庫轉換為使用現代 Chromium 渲染引擎生成真實、可選、可搜尋文字的函式庫。本指南提供完整的逐步遷移路徑,可解決 Spire.PDF 的關鍵 HTML 渲染限制和字型嵌入問題。

為什麼要從 Spire.PDF 移轉到 IronPDF?

瞭解 Spire.PDF

Spire.PDF 是專為 .NET 開發人員設計的強大商用 PDF 函式庫,可有效率地處理 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-to-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()新的 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 使用 ChromePdfRenderer 搭配 RenderHtmlAsPdf() 產生可完全選擇、搜尋及存取的真實文字。 不需要呼叫 Close() -IronPDF使用 dispose 模式進行自動清理。請參閱 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, VerticalOffset, 和 HorizontalOffset, 然後用 ApplyStamp() 套用。 這種方法更具宣言性,也更容易維護。


文字即圖片的問題

為什麼這非常重要

當 Spire.PDF 使用影像渲染將 HTML 轉換為 PDF 時,您的文件會失去基本功能:

1.無文字搜尋:使用者無法使用 Ctrl+F 來尋找文字。 文件管理系統無法索引內容。

2.無法選擇/複製文字:使用者嘗試複製引文、參考資料或資料時無法選擇文字 - 這是一種圖像。

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

4.檔案大小大:相同內容比較顯示 Spire.PDF(以影像為基礎)產生的檔案比 IronPDF(以文字為基礎)大 16 倍。

檢測:您的 PDF 是否基於圖像? 開啟 Spire.PDF 產生的文件,並嘗試這些測試: 1.**文字選擇**:在文字上按一下並拖曳。 如果沒有任何重點 → IMAGE-BASED 2.**Ctrl+F搜尋**:搜尋頁面上的任何字詞。 如果 "未找到匹配內容",請 → IMAGE-BASED 3.**複製/貼上**:選取並複製文字至記事本。 如果沒有貼上 → IMAGE-BASED --- ## Internet Explorer 的問題 ### Spire.PDF 的渲染引擎 在某些環境中,Spire.PDF 依賴 Internet Explorer/Edge Legacy 來呈現 HTML。 IE 已於 2022 年廢棄,現代 CSS 無法運作,JavaScript 支援有限,而且不同系統的呈現方式也不一致。 ### Modern CSS That Fails in Spire.PDF ```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.PDF`) - [ ] 安裝 `IronPdf` NuGet 套件 - [ ] 更新命名空間匯入 (`using Spire.Pdf;` → `using IronPdf;`) - [將 `LoadFromHTML()` 改為 `RenderHtmlAsPdf()` (CRITICAL FIX) - [ ] 將`new PdfDocument()`+ `LoadFromFile()` 改為 `PdfDocument.FromFile()` - [ ] 使用<代碼>PdfDocument.Merge()
Curtis Chau
技術作家

Curtis Chau 擁有卡爾頓大學計算機科學學士學位,專注於前端開發,擅長於 Node.js、TypeScript、JavaScript 和 React。Curtis 熱衷於創建直觀且美觀的用戶界面,喜歡使用現代框架並打造結構良好、視覺吸引人的手冊。

除了開發之外,Curtis 對物聯網 (IoT) 有著濃厚的興趣,探索將硬體和軟體結合的創新方式。在閒暇時間,他喜愛遊戲並構建 Discord 機器人,結合科技與創意的樂趣。