跳過到頁腳內容
MIGRATION GUIDES

How to Migrate from PeachPDF to IronPDF in C#

從 PeachPDF 遷移到 IronPDF 可以獲得企業級 PDF 生成功能,包括全面的功能、積極的開發和專業的支援。 本指南提供了一個完整的、逐步的遷移路徑,將您的基本 HTML 到 PDF 工作流程轉換為具有現代 Chromium 渲染、高級安全選項和廣泛操作功能的全功能 PDF 解決方案。

為什麼要從 PeachPDF 遷移到 IronPDF

了解 PeachPDF

PeachPDF 是 .NET 生態系統中相對較新的產品,專為需要將 HTML 轉換為 PDF 的開發人員而設計。 作為一款函式庫,PeachPDF 承諾提供純 .NET 實現,其獨特之處在於不依賴外部流程,從而確保它可以無縫整合到支援 .NET 的平台上。 這項特性使 PeachPDF 成為尋求輕量級、可管理庫解決方案的專案的理想選擇。

儘管 PeachPDF 具有很大的潛力,但它仍在開發中,這不僅展現了令人興奮的可能性,也暴露出明顯的限制。 PeachPDF 仍然具有吸引力,因為它基於純 .NET Core,這意味著它可以在各種環境中輕鬆部署。 然而,這也意味著其普及程度有限,使用者群體較小,且主要依賴社群支持。

PeachPDF 的局限性

PeachPDF 是一個相對較新、知名度較低的 PDF 庫,它缺乏成熟解決方案所具備的功能、功能和支援。 遷移的主要原因:

1.功能集有限: PeachPDF 缺乏數位簽章、PDF/A 合規性和複雜的文字擷取等進階功能。

2.小型社群:文件、範例和社群支援有限。 由於使用者群體較小,社群支援可能也比較稀少,因此很難獲得協助或找到全面的文件。

3.不確定的未來:沒有既定業績記錄的新圖書館有被採用的風險。

4.基本 HTML 支援:有限的 CSS 和 JavaScript 渲染功能。

5.無企業支援:無專業支援或 SLA 選項。

PeachPDF 與 IronPDF 對比

特徵/特性 PeachPDF IronPDF
執行 純.NET 具有廣泛的兼容性
執照 開源(BSD-3條款) 商業的
使用者群 小的 大型(下載量超過 4000 萬次)
支援 社區驅動 專業人員提供專屬支持
HTML渲染 基本的 全鉻
CSS 支援 有限的 完整的 CSS3
JavaScript 基本的 完整版 ES2024
數位簽名 是的
PDF/A 合規性 是的
文件 有限的 廣泛的
發展狀況 開發中 成熟穩定的釋放

IronPDF 的優勢在於其更廣泛的功能,它不僅支援 HTML 到 PDF 的轉換,還支援 OCR、浮水印和其他高級功能。 其專業的支援體係是一大優勢,能夠快速解決開發人員所遇到的問題。

對於計劃在 2025 年和 2026 年採用 .NET 10 和 C# 14 的團隊,IronPDF 提供全面的功能和積極的維護,以確保長期穩定性和與現代 .NET 框架的兼容性。


開始之前

先決條件

  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 PeachPDF
dotnet remove package PeachPDF

# Install IronPDF
dotnet add package IronPdf
# Remove PeachPDF
dotnet remove package PeachPDF

# 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";
$vbLabelText   $csharpLabel

識別 PeachPDF 使用情況

# Audit PeachPDF usage in codebase
grep -r "using PeachPDF" --include="*.cs" .
grep -r "HtmlToPdfConverter\|Convert\|ConvertUrl" --include="*.cs" .
# Audit PeachPDF usage in codebase
grep -r "using PeachPDF" --include="*.cs" .
grep -r "HtmlToPdfConverter\|Convert\|ConvertUrl" --include="*.cs" .
SHELL

完整 API 參考

命名空間變更

// Before: PeachPDF
using PeachPDF;
using System.IO;

// After: IronPDF
using IronPdf;
using IronPdf.Rendering;
// Before: PeachPDF
using PeachPDF;
using System.IO;

// After: IronPDF
using IronPdf;
using IronPdf.Rendering;
$vbLabelText   $csharpLabel

核心 API 映射

PeachPDF IronPDF 筆記
new HtmlToPdfConverter() new ChromePdfRenderer() 建立渲染器
converter.Convert(html) renderer.RenderHtmlAsPdf(html) HTML 轉 PDF
converter.ConvertUrl(url) renderer.RenderUrlAsPdf(url) PDF檔案的URL
converter.Header renderer.RenderingOptions.HtmlHeader 標題內容
converter.Footer renderer.RenderingOptions.HtmlFooter 頁尾內容
File.WriteAllBytes(path, pdf) pdf.SaveAs(path) 儲存檔案
pdf (位元組數組) pdf.BinaryData 取得位元組
PdfReader.LoadFromFile(path) PdfDocument.FromFile(path) 載入PDF
document.MergeWith(other) PdfDocument.Merge(pdfs) 合併PDF

程式碼遷移範例

範例 1:HTML 字串到 PDF 的轉換

之前(PeachPDF):

using PeachPDF;
using System.IO;

class Program
{
    static void Main()
    {
        var converter = new HtmlToPdfConverter();
        var html = "<html><body><h1>Hello World</h1></body></html>";
        var pdf = converter.Convert(html);
        File.WriteAllBytes("output.pdf", pdf);
    }
}
using PeachPDF;
using System.IO;

class Program
{
    static void Main()
    {
        var converter = new HtmlToPdfConverter();
        var html = "<html><body><h1>Hello World</h1></body></html>";
        var pdf = converter.Convert(html);
        File.WriteAllBytes("output.pdf", pdf);
    }
}
$vbLabelText   $csharpLabel

(IronPDF 之後):

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

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var html = "<html><body><h1>Hello World</h1></body></html>";
        var pdf = renderer.RenderHtmlAsPdf(html);
        pdf.SaveAs("output.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var html = "<html><body><h1>Hello World</h1></body></html>";
        var pdf = renderer.RenderHtmlAsPdf(html);
        pdf.SaveAs("output.pdf");
    }
}
$vbLabelText   $csharpLabel

這個例子展示了這兩個庫之間的根本區別。 PeachPDF 使用HtmlToPdfConverter ,其Convert()方法傳回一個byte[] ,需要使用File.WriteAllBytes()進行儲存。 IronPDF 使用ChromePdfRendererRenderHtmlAsPdf()方法,該方法傳回一個內建SaveAs()方法的PdfDocument物件。

IronPDF 方法的主要優點是:在儲存之前,可以對PdfDocument物件進行進一步操作(新增浮水印、合併、安全設定),而 PeachPDF 的位元組陣列是最終輸出。 IronPDF 的方法提供了更簡潔的語法和與現代 .NET 應用程式更好的整合。 請參閱HTML 轉 PDF 文件以取得完整範例。

範例 2:URL 轉 PDF

之前(PeachPDF):

using PeachPDF;
using System.IO;

class Program
{
    static void Main()
    {
        var converter = new HtmlToPdfConverter();
        var url = "https://www.example.com";
        var pdf = converter.ConvertUrl(url);
        File.WriteAllBytes("webpage.pdf", pdf);
    }
}
using PeachPDF;
using System.IO;

class Program
{
    static void Main()
    {
        var converter = new HtmlToPdfConverter();
        var url = "https://www.example.com";
        var pdf = converter.ConvertUrl(url);
        File.WriteAllBytes("webpage.pdf", pdf);
    }
}
$vbLabelText   $csharpLabel

(IronPDF 之後):

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

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var url = "https://www.example.com";
        var pdf = renderer.RenderUrlAsPdf(url);
        pdf.SaveAs("webpage.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var url = "https://www.example.com";
        var pdf = renderer.RenderUrlAsPdf(url);
        pdf.SaveAs("webpage.pdf");
    }
}
$vbLabelText   $csharpLabel

PeachPDF 使用ConvertUrl() ,而 IronPDF 則使用RenderUrlAsPdf() 。 IronPDF 中的方法命名更具描述性——它明確地表明 URL 正在被渲染為 PDF。 這兩個庫處理 URL 到 PDF 的轉換方式類似,但 IronPDF 的完整 Chromium 引擎能夠更好地渲染具有複雜 CSS 和 JavaScript 的現代網頁。 了解更多信息,請閱讀我們的教程

範例 3:新增頁首和頁尾

之前(PeachPDF):

using PeachPDF;
using System.IO;

class Program
{
    static void Main()
    {
        var converter = new HtmlToPdfConverter();
        converter.Header = "<div style='text-align:center'>My Header</div>";
        converter.Footer = "<div style='text-align:center'>Page {page}</div>";
        var html = "<html><body><h1>Document Content</h1></body></html>";
        var pdf = converter.Convert(html);
        File.WriteAllBytes("document.pdf", pdf);
    }
}
using PeachPDF;
using System.IO;

class Program
{
    static void Main()
    {
        var converter = new HtmlToPdfConverter();
        converter.Header = "<div style='text-align:center'>My Header</div>";
        converter.Footer = "<div style='text-align:center'>Page {page}</div>";
        var html = "<html><body><h1>Document Content</h1></body></html>";
        var pdf = converter.Convert(html);
        File.WriteAllBytes("document.pdf", pdf);
    }
}
$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.HtmlHeader = new HtmlHeaderFooter() { HtmlFragment = "<div style='text-align:center'>My Header</div>" };
        renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter() { HtmlFragment = "<div style='text-align:center'>Page {page}</div>" };
        var html = "<html><body><h1>Document Content</h1></body></html>";
        var pdf = renderer.RenderHtmlAsPdf(html);
        pdf.SaveAs("document.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;
using System;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter() { HtmlFragment = "<div style='text-align:center'>My Header</div>" };
        renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter() { HtmlFragment = "<div style='text-align:center'>Page {page}</div>" };
        var html = "<html><body><h1>Document Content</h1></body></html>";
        var pdf = renderer.RenderHtmlAsPdf(html);
        pdf.SaveAs("document.pdf");
    }
}
$vbLabelText   $csharpLabel

這個範例展示了一個關鍵的架構差異。 PeachPDF 使用簡單的字串屬性( converter.Headerconverter.Footer )來表示頁首和頁尾。 IronPDF 使用指派給RenderingOptions.HtmlHeaderRenderingOptions.HtmlFooter HtmlHeaderFooter物件。

IronPDF 的方法更靈活HtmlHeaderFooter物件可以包含MaxHeight等額外屬性來控制頁首/頁尾的大小。請注意,這兩個庫都使用{page}作為頁碼佔位符。 IronPDF 也支援使用{total-pages}來表示總頁數。

請注意 IronPDF 所需的額外命名空間: HtmlHeaderFooter類別需要using IronPdf.Rendering;


關鍵遷移說明

轉換器類別更改

PeachPDF 使用HtmlToPdfConverter ; IronPDF 使用ChromePdfRenderer

// PeachPDF
var converter = new HtmlToPdfConverter();

// IronPDF
var renderer = new ChromePdfRenderer();
// PeachPDF
var converter = new HtmlToPdfConverter();

// IronPDF
var renderer = new ChromePdfRenderer();
$vbLabelText   $csharpLabel

返回類型變更

PeachPDF 返回byte[] ; IronPDF 返回PdfDocument

// PeachPDF: Returns byte array
byte[] pdf = converter.Convert(html);
File.WriteAllBytes("output.pdf", pdf);

// IronPDF: Returns PdfDocument object
PdfDocument pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
// Or get bytes: byte[] bytes = pdf.BinaryData;
// PeachPDF: Returns byte array
byte[] pdf = converter.Convert(html);
File.WriteAllBytes("output.pdf", pdf);

// IronPDF: Returns PdfDocument object
PdfDocument pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
// Or get bytes: byte[] bytes = pdf.BinaryData;
$vbLabelText   $csharpLabel

頁首/頁尾屬性更改

// PeachPDF: Simple string properties
converter.Header = "<div>Header</div>";
converter.Footer = "<div>Footer</div>";

// IronPDF: HtmlHeaderFooter objects
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter() 
{ 
    HtmlFragment = "<div>Header</div>" 
};
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter() 
{ 
    HtmlFragment = "<div>Footer</div>" 
};
// PeachPDF: Simple string properties
converter.Header = "<div>Header</div>";
converter.Footer = "<div>Footer</div>";

// IronPDF: HtmlHeaderFooter objects
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter() 
{ 
    HtmlFragment = "<div>Header</div>" 
};
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter() 
{ 
    HtmlFragment = "<div>Footer</div>" 
};
$vbLabelText   $csharpLabel

方法名稱變更

PeachPDF IronPDF
Convert(html) RenderHtmlAsPdf(html)
ConvertUrl(url) RenderUrlAsPdf(url)
File.WriteAllBytes() SaveAs()

遷移後的新功能

遷移到 IronPDF 後,您將獲得 PeachPDF 無法提供的功能:

PDF合併

var pdf1 = PdfDocument.FromFile("doc1.pdf");
var pdf2 = PdfDocument.FromFile("doc2.pdf");
var merged = PdfDocument.Merge(pdf1, pdf2);
merged.SaveAs("merged.pdf");
var pdf1 = PdfDocument.FromFile("doc1.pdf");
var pdf2 = PdfDocument.FromFile("doc2.pdf");
var merged = PdfDocument.Merge(pdf1, pdf2);
merged.SaveAs("merged.pdf");
$vbLabelText   $csharpLabel

帶有 HTML 的浮水印

var pdf = PdfDocument.FromFile("document.pdf");
pdf.ApplyWatermark("<div style='color: red; font-size: 48pt;'>DRAFT</div>");
pdf.SaveAs("watermarked.pdf");
var pdf = PdfDocument.FromFile("document.pdf");
pdf.ApplyWatermark("<div style='color: red; font-size: 48pt;'>DRAFT</div>");
pdf.SaveAs("watermarked.pdf");
$vbLabelText   $csharpLabel

密碼保護

var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Confidential</h1>");

pdf.SecuritySettings.OwnerPassword = "owner123";
pdf.SecuritySettings.UserPassword = "user123";
pdf.SecuritySettings.AllowUserCopyPasteContent = false;
pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.NoPrint;

pdf.SaveAs("protected.pdf");
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Confidential</h1>");

pdf.SecuritySettings.OwnerPassword = "owner123";
pdf.SecuritySettings.UserPassword = "user123";
pdf.SecuritySettings.AllowUserCopyPasteContent = false;
pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.NoPrint;

pdf.SaveAs("protected.pdf");
$vbLabelText   $csharpLabel

數位簽名

using IronPdf.Signing;

var pdf = PdfDocument.FromFile("document.pdf");
var signature = new PdfSignature("certificate.pfx", "password")
{
    SigningReason = "Document Approval",
    SigningLocation = "New York"
};
pdf.Sign(signature);
pdf.SaveAs("signed.pdf");
using IronPdf.Signing;

var pdf = PdfDocument.FromFile("document.pdf");
var signature = new PdfSignature("certificate.pfx", "password")
{
    SigningReason = "Document Approval",
    SigningLocation = "New York"
};
pdf.Sign(signature);
pdf.SaveAs("signed.pdf");
$vbLabelText   $csharpLabel

非同步操作

var renderer = new ChromePdfRenderer();
var pdf = await renderer.RenderHtmlAsPdfAsync("<h1>Async PDF</h1>");
pdf.SaveAs("async_output.pdf");
var renderer = new ChromePdfRenderer();
var pdf = await renderer.RenderHtmlAsPdfAsync("<h1>Async PDF</h1>");
pdf.SaveAs("async_output.pdf");
$vbLabelText   $csharpLabel

功能對比總結

特徵 PeachPDF IronPDF
HTML 轉 PDF 基本的 全鉻
PDF檔案的URL 有限的 是的
CSS Grid/Flexbox 是的
JavaScript 有限的 完整版 ES2024
合併PDF 是的 是的
拆分PDF 有限的 是的
水印 有限的 完整 HTML
頁首/頁尾 基本的 完整 HTML
數位簽名 是的
PDF/A 是的
表格填寫 有限的 是的
文字擷取 基本的 是的
影像擷取 是的
非同步支援 有限的 是的
跨平台 未知 是的

常見的移民問題

問題 1:不同的 API 模式

問題: PeachPDF 使用位元組數組輸出的轉換器模式; IronPDF 使用渲染器模式,輸出為 PdfDocument。

解決方案:

// PeachPDF pattern
var converter = new HtmlToPdfConverter();
var pdf = converter.Convert(html);
File.WriteAllBytes(path, pdf);

// IronPDF pattern
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs(path);
// PeachPDF pattern
var converter = new HtmlToPdfConverter();
var pdf = converter.Convert(html);
File.WriteAllBytes(path, pdf);

// IronPDF pattern
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs(path);
$vbLabelText   $csharpLabel

問題 2:保存方法差異

問題: PeachPDF 需要File.WriteAllBytes() ; IronPDF 內建了SaveAs()

解決方法:File.WriteAllBytes(&quot;path&quot;, pdf)替換為pdf.SaveAs(&quot;path&quot;)

問題 3:頁首/頁尾對象

問題: PeachPDF 使用字串屬性; IronPDF 使用物件屬性。

解決方案:將 HTML 字串包裝在帶有HtmlFragment屬性的HtmlHeaderFooter物件中。


遷移清單

遷移前

  • 審核程式碼庫中 PeachPDF 的使用情況
  • 記錄自訂配置
  • 注意所有頁首/頁尾的實作方式
  • ironpdf.com取得 IronPDF 許可證金鑰
  • 先使用 IronPDF 試用許可證進行測試

軟體包變更

  • 刪除PeachPDF NuGet 套件 安裝IronPdf NuGet 套件: dotnet add package IronPdf

程式碼更改

  • 更新命名空間導入( using PeachPDF;using IronPdf;
  • 新增using IronPdf.Rendering;以實現頁首/頁尾功能
  • HtmlToPdfConverter替換為ChromePdfRenderer
  • converter.Convert(html)替換為renderer.RenderHtmlAsPdf(html)
  • converter.ConvertUrl(url)替換為renderer.RenderUrlAsPdf(url)
  • File.WriteAllBytes(path, pdf)替換為pdf.SaveAs(path)
  • converter.Header / Footer替換為RenderingOptions.HtmlHeader / HtmlFooter對象
  • 在應用程式啟動時新增許可證初始化

移民後

  • 測試 HTML 渲染質量
  • 驗證 PDF 輸出是否符合預期
  • 測試帶有頁碼的頁首/頁尾渲染效果
  • 根據需要新增功能(安全性、浮水印、合併)

Curtis Chau
技術撰稿人

Curtis Chau 擁有電腦科學學士學位(卡爾頓大學),專長於前端開發,精通 Node.js、TypeScript、JavaScript 和 React。Curtis 對製作直覺且美觀的使用者介面充滿熱情,他喜歡使用現代化的架構,並製作結構良好且視覺上吸引人的手冊。

除了開發之外,Curtis 對物聯網 (IoT) 也有濃厚的興趣,他喜歡探索整合硬體與軟體的創新方式。在空閒時間,他喜歡玩遊戲和建立 Discord bots,將他對技術的熱愛與創意結合。