如何在 C# 中將 ZetPDF 遷移到 IronPDF
ZetPDF 是一個商業授權的 PDF 庫,適用於 C# 應用程序,它基於廣泛使用的開源 PDFSharp 庫構建。 ZetPDF 雖然提供商業支援和基本的 PDF 處理功能,但它繼承了其 PDFSharp 基礎架構的重大限制。 最值得注意的是,該程式庫依賴基於座標的圖形編程,與現代替代方案相比,其 HTML 到 PDF 的轉換功能有限。
本指南提供了從 ZetPDF 到 IronPDF 的完整遷移路徑,包括逐步說明、程式碼比較和實用範例,供正在評估此過渡的專業 .NET 開發人員參考。
為什麼要從 ZetPDF 遷移?
ZetPDF 作為 PDFSharp 的一個分支,繼承了相同的架構限制,這限制了它在現代文件生成工作流程中的有效性。 開發團隊考慮遷移的主要原因包括:
基於座標的 API: ZetPDF 強制開發者使用精確座標定位每個元素。 每個元件的複雜手動定位會隨著需求的變化而帶來維護方面的挑戰。
CSS 支援有限:沒有樣式系統,這意味著每個元素都需要手動管理字體和顏色。
不支援 JavaScript 渲染:在產生 PDF 期間無法渲染動態網頁內容或執行 JavaScript。
獨特功能有限:與直接免費使用 PDFSharp 相比,ZetPDF 幾乎沒有提供任何令人信服的理由來證明其商業許可的必要性。
手動分頁:必須手動計算和管理頁面溢出,而不是依賴自動分頁。
需要進行文字測量:手動計算文字換行會增加額外的開發成本。
根本問題
ZetPDF 和 PDFSharp 強制要求您使用精確的座標來定位每個元素:
// ZetPDF: 手動的 positioning nightmare
graphics.DrawString("Name:", font, brush, new XPoint(50, 100));
graphics.DrawString("John Doe", font, brush, new XPoint(100, 100));
graphics.DrawString("Address:", font, brush, new XPoint(50, 120));
graphics.DrawString("123 Main St", font, brush, new XPoint(100, 120));
// ... hundreds of lines for a simple form// ZetPDF: 手動的 positioning nightmare
graphics.DrawString("Name:", font, brush, new XPoint(50, 100));
graphics.DrawString("John Doe", font, brush, new XPoint(100, 100));
graphics.DrawString("Address:", font, brush, new XPoint(50, 120));
graphics.DrawString("123 Main St", font, brush, new XPoint(100, 120));
// ... hundreds of lines for a simple formIronPDF 使用 HTML/CSS——佈局引擎處理所有事情:
// IronPDF: Simple HTML
var html = @"
<p><strong>Name:</strong> John Doe</p>
<p><strong>Address:</strong> 123 Main St</p>";
var pdf = renderer.RenderHtmlAsPdf(html);// IronPDF: Simple HTML
var html = @"
<p><strong>Name:</strong> John Doe</p>
<p><strong>Address:</strong> 123 Main St</p>";
var pdf = renderer.RenderHtmlAsPdf(html);IronPDF 與 ZetPDF:功能對比
了解架構差異有助於技術決策者評估遷移投資:
| 特徵 | ZetPDF | IronPDF |
|---|---|---|
| 基於 PDFSharp | 是的 | 不 |
| HTML 轉 PDF | 有限的 | 是的(全鉻) |
| 商業許可 | 是的,永續 | 是的 |
| 開源基金會 | PDFSharp(MIT許可證) | 鉻基 |
| CSS 支援 | 不 | 完整的 CSS3 |
| JavaScript | 不 | 完整版 ES2024 |
| 自動佈局 | 不 | 是的 |
| 自動分頁符 | 不 | 是的 |
| 表格 | 手繪 | HTML<table> |
| 頁首/頁尾 | 手動的 | HTML/CSS |
| 水印 | 手動代碼 | 內建 |
| 合併PDF | 有限的 | 是的 |
| 拆分PDF | 有限的 | 是的 |
| 數位簽名 | 不 | 是的 |
| PDF/A | 不 | 是的 |
| 簡單易用 | 緩和 | 高的 |
快速入門:ZetPDF 到 IronPDF 的遷移
透過這些基礎步驟,遷移工作可以立即開始。
步驟 1:替換 NuGet 套件
移除 ZetPDF:
# Remove ZetPDF
dotnet remove package ZetPDF# Remove ZetPDF
dotnet remove package ZetPDF安裝 IronPDF:
# Install IronPDF
dotnet add package IronPdf# Install IronPDF
dotnet add package IronPdf步驟 2:更新命名空間
將 ZetPDF 命名空間替換為 IronPdf 命名空間:
// Before (ZetPDF)
using ZetPdf;
using ZetPdf.Drawing;
using ZetPdf.Fonts;
// After (IronPDF)
using IronPdf;// Before (ZetPDF)
using ZetPdf;
using ZetPdf.Drawing;
using ZetPdf.Fonts;
// After (IronPDF)
using IronPdf;步驟 3:初始化許可證
在應用程式啟動時新增許可證初始化:
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";程式碼遷移範例
將 HTML 轉換為 PDF
HTML 轉 PDF 操作示範了這些 .NET PDF 庫之間的 API 差異。
ZetPDF 方法:
// NuGet: Install-Package ZetPDF
using ZetPDF;
using System;
class Program
{
static void Main()
{
var converter = new HtmlToPdfConverter();
var htmlContent = "<html><body><h1>Hello World</h1></body></html>";
converter.ConvertHtmlToPdf(htmlContent, "output.pdf");
Console.WriteLine("PDF created successfully");
}
}// NuGet: Install-Package ZetPDF
using ZetPDF;
using System;
class Program
{
static void Main()
{
var converter = new HtmlToPdfConverter();
var htmlContent = "<html><body><h1>Hello World</h1></body></html>";
converter.ConvertHtmlToPdf(htmlContent, "output.pdf");
Console.WriteLine("PDF created successfully");
}
}IronPDF 方法:
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var htmlContent = "<html><body><h1>Hello World</h1></body></html>";
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.SaveAs("output.pdf");
Console.WriteLine("PDF created successfully");
}
}// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var htmlContent = "<html><body><h1>Hello World</h1></body></html>";
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.SaveAs("output.pdf");
Console.WriteLine("PDF created successfully");
}
}ZetPDF 使用HtmlToPdfConverter和ConvertHtmlToPdf()函數直接寫入檔案路徑。 IronPDF 為ChromePdfRenderer提供了RenderHtmlAsPdf()函數,該函數返回PdfDocument對象,從而賦予您更大的輸出靈活性——您可以保存到文件、獲取二進制資料或在保存之前執行其他操作。
如需更進階的 HTML 轉 PDF 場景,請參閱HTML 轉 PDF 轉換指南。
將 URL 轉換為 PDF
URL 轉 PDF 的轉換清楚顯示了模式差異。
ZetPDF 方法:
// NuGet: Install-Package ZetPDF
using ZetPDF;
using System;
class Program
{
static void Main()
{
var converter = new HtmlToPdfConverter();
var url = "https://www.example.com";
converter.ConvertUrlToPdf(url, "webpage.pdf");
Console.WriteLine("PDF from URL created successfully");
}
}// NuGet: Install-Package ZetPDF
using ZetPDF;
using System;
class Program
{
static void Main()
{
var converter = new HtmlToPdfConverter();
var url = "https://www.example.com";
converter.ConvertUrlToPdf(url, "webpage.pdf");
Console.WriteLine("PDF from URL created successfully");
}
}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");
Console.WriteLine("PDF from URL created successfully");
}
}// 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");
Console.WriteLine("PDF from URL created successfully");
}
}ZetPDF 使用相同的HtmlToPdfConverter類別和ConvertUrlToPdf()函數。 IronPDF 在ChromePdfRenderer上提供RenderUrlAsPdf() ,它利用完整的 Chromium 渲染引擎來精確捕獲網頁,包括 JavaScript 執行和現代 CSS。
查看指向 PDF 文件的 URL ,以了解身份驗證和自訂標頭選項。
合併多個PDF文件
PDF合併揭示了不同API在文件處理方式上的顯著差異。
ZetPDF 方法:
// NuGet: Install-Package ZetPDF
using ZetPDF;
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
var merger = new PdfMerger();
var files = new List<string> { "document1.pdf", "document2.pdf" };
merger.MergeFiles(files, "merged.pdf");
Console.WriteLine("PDFs merged successfully");
}
}// NuGet: Install-Package ZetPDF
using ZetPDF;
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
var merger = new PdfMerger();
var files = new List<string> { "document1.pdf", "document2.pdf" };
merger.MergeFiles(files, "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 pdfs = new List<PdfDocument>
{
PdfDocument.FromFile("document1.pdf"),
PdfDocument.FromFile("document2.pdf")
};
var merged = PdfDocument.Merge(pdfs);
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 pdfs = new List<PdfDocument>
{
PdfDocument.FromFile("document1.pdf"),
PdfDocument.FromFile("document2.pdf")
};
var merged = PdfDocument.Merge(pdfs);
merged.SaveAs("merged.pdf");
Console.WriteLine("PDFs merged successfully");
}
}ZetPDF 使用專用的PdfMerger類,該類使用MergeFiles()對檔案路徑進行操作。 IronPDF 使用PdfDocument.FromFile()將文件載入為PdfDocument對象,然後使用靜態PdfDocument.Merge()方法將它們合併。 這種物件導向的方法允許在儲存之前對合併後的文件進行其他操作。
請查閱PDF 合併文件以了解更多合併選項。
基於座標的繪圖與 HTML
對於已經使用基於座標的圖形的 ZetPDF 程式碼的開發人員來說,遷移路徑涉及將繪圖命令轉換為 HTML/CSS。
ZetPDF座標方法:
using ZetPdf;
using ZetPdf.Drawing;
var document = new PdfDocument();
var page = document.AddPage();
page.Width = XUnit.FromMillimeter(210);
page.Height = XUnit.FromMillimeter(297);
var graphics = XGraphics.FromPdfPage(page);
var titleFont = new XFont("Arial", 24, XFontStyle.Bold);
var bodyFont = new XFont("Arial", 12);
graphics.DrawString("Company Report", titleFont, XBrushes.Navy,
new XPoint(50, 50));
graphics.DrawString("This is the introduction paragraph.", bodyFont, XBrushes.Black,
new XPoint(50, 80));
graphics.DrawString("Generated: " + DateTime.Now.ToString(), bodyFont, XBrushes.Gray,
new XPoint(50, 100));
document.Save("report.pdf");using ZetPdf;
using ZetPdf.Drawing;
var document = new PdfDocument();
var page = document.AddPage();
page.Width = XUnit.FromMillimeter(210);
page.Height = XUnit.FromMillimeter(297);
var graphics = XGraphics.FromPdfPage(page);
var titleFont = new XFont("Arial", 24, XFontStyle.Bold);
var bodyFont = new XFont("Arial", 12);
graphics.DrawString("Company Report", titleFont, XBrushes.Navy,
new XPoint(50, 50));
graphics.DrawString("This is the introduction paragraph.", bodyFont, XBrushes.Black,
new XPoint(50, 80));
graphics.DrawString("Generated: " + DateTime.Now.ToString(), bodyFont, XBrushes.Gray,
new XPoint(50, 100));
document.Save("report.pdf");IronPDF HTML 方法:
using IronPdf;
var html = $@"
<html>
<head>
<style>
body {{ font-family: Arial, sans-serif; padding: 50px; }}
h1 {{ color: navy; }}
.date {{ color: gray; }}
</style>
</head>
<body>
<h1>Company Report</h1>
<p>This is the introduction paragraph.</p>
<p class='date'>Generated: {DateTime.Now}</p>
</body>
</html>";
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("report.pdf");using IronPdf;
var html = $@"
<html>
<head>
<style>
body {{ font-family: Arial, sans-serif; padding: 50px; }}
h1 {{ color: navy; }}
.date {{ color: gray; }}
</style>
</head>
<body>
<h1>Company Report</h1>
<p>This is the introduction paragraph.</p>
<p class='date'>Generated: {DateTime.Now}</p>
</body>
</html>";
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("report.pdf");ZetPDF 方法需要建立字體物件、計算精確的像素位置並手動管理圖形上下文。 IronPDF 的方法使用 Web 開發人員已經熟悉的標準 HTML 和 CSS——字體、顏色和佈局都透過熟悉的 CSS 屬性來處理。
ZetPDF API 到 IronPDF 映射參考
此映射透過顯示直接的 API 等效項來加速遷移:
| ZetPDF | IronPDF | 筆記 |
|---|---|---|
new PdfDocument() | new ChromePdfRenderer() | 建立渲染器 |
document.AddPage() | 自動的 | 由 HTML 建立的頁面 |
XGraphics.FromPdfPage(page) | 不適用 | 改用 HTML/CSS |
graphics.DrawString() | HTML 文字元素 | <p>,<h1> , ETC。 |
graphics.DrawImage() | <img>標籤 | HTML影像 |
graphics.DrawLine() | CSS邊框 | 或者<hr> |
graphics.DrawRectangle() | CSS border + div | HTML 框 |
new XFont() | CSS font-family | 支援的網頁字體 |
XBrushes.Black | CSS color | 全彩支持 |
document.Save() | pdf.SaveAs() | 儲存到文件 |
PdfReader.Open() | PdfDocument.FromFile() | 載入現有PDF |
HtmlToPdfConverter | ChromePdfRenderer | HTML轉換 |
ConvertHtmlToPdf() | RenderHtmlAsPdf() | 將 HTML 字串轉換為 PDF |
ConvertUrlToPdf() | RenderUrlAsPdf() | PDF檔案的URL |
PdfMerger | PdfDocument.Merge() | 合併PDF文件 |
常見遷移問題及解決方案
問題 1:基於座標的佈局
ZetPDF:所有操作都需要精確的 X、Y 座標,並且需要手動定位。
解決方案:使用HTML/CSS串流佈局。 如果需要絕對定位,請使用 CSS:
.positioned-element {
position: absolute;
top: 100px;
left: 50px;
}問題 2:字體物件管理
ZetPDF:為每種字體變體建立XFont物件。
解決方案:使用 CSS font-family-字體會自動處理:
<style>
body { font-family: Arial, sans-serif; }
h1 { font-family: 'Times New Roman', serif; font-size: 24px; font-weight: bold; }
</style><style>
body { font-family: Arial, sans-serif; }
h1 { font-family: 'Times New Roman', serif; font-size: 24px; font-weight: bold; }
</style>第三期:色彩處理
ZetPDF:使用XBrushes和著色物件。
解決方案:使用標準的CSS顏色:
.header { color: navy; background-color: #f5f5f5; }
.warning { color: rgb(255, 0, 0); }問題 4:手動分頁符
ZetPDF:追蹤 Y 軸位置,並在內容溢出時手動建立新頁面。
解決方案: IronPDF 可以自動處理分頁符號。 如需進行明確控制,請使用 CSS:
.section { page-break-after: always; }
.keep-together { page-break-inside: avoid; }問題 5:建立表格
ZetPDF:需要手動繪製矩形、線條和文字定位。
解決方案:使用具有 CSS 樣式的標準 HTML 表格:
<table style="border-collapse: collapse; width: 100%;">
<tr>
<th style="border: 1px solid black; padding: 8px;">Header</th>
</tr>
<tr>
<td style="border: 1px solid black; padding: 8px;">Data</td>
</tr>
</table><table style="border-collapse: collapse; width: 100%;">
<tr>
<th style="border: 1px solid black; padding: 8px;">Header</th>
</tr>
<tr>
<td style="border: 1px solid black; padding: 8px;">Data</td>
</tr>
</table>ZetPDF遷移檢查清單
遷移前任務
審核您的程式碼庫,找出所有 ZetPDF 的使用情況:
grep -r "using ZetPDF" --include="*.cs" .
grep -r "HtmlToPdfConverter\|PdfMerger\|XGraphics" --include="*.cs" .grep -r "using ZetPDF" --include="*.cs" .
grep -r "HtmlToPdfConverter\|PdfMerger\|XGraphics" --include="*.cs" .需要轉換為HTML的基於座標的繪圖程式碼文件。 注意字體和顏色的使用規律。 將佈局結構對應到對應的HTML程式碼。
程式碼更新任務
- 刪除 ZetPDF NuGet 套件
- 安裝 IronPdf NuGet 套件
- 將命名空間導入從
ZetPDF更新為IronPdf - 將
HtmlToPdfConverter替換為ChromePdfRenderer - 將
ConvertHtmlToPdf()呼叫轉換為RenderHtmlAsPdf()+SaveAs() - 將
ConvertUrlToPdf()呼叫轉換為RenderUrlAsPdf()+SaveAs()調用 - 將
PdfMerger.MergeFiles()替換為PdfDocument.Merge() - 將
DrawString()呼叫轉換為 HTML 文字元素 - 將
XFont轉換為 CSSfont-family - 用 CSS 顏色取代
XBrushes - 啟動時加入 IronPDF 許可證初始化
遷移後測試
遷移完成後,請確認以下幾個面向:
- 對比視覺輸出,確保外觀符合要求或有所改善。
- 驗證字體是否能透過 CSS 樣式如預期渲染
- 測試頁面分隔符號在自動分頁時能夠正確顯示
- 檢查影像位置和顯示是否正確
- 測試 PDF 合併操作是否產生正確輸出
- 確認所有現有功能在新實現中都能正常運作
遷移到 IronPDF 的主要優勢
從 ZetPDF 遷移到 IronPDF 可帶來以下幾個關鍵優勢:
現代 Chromium 渲染引擎: IronPDF 使用 Chromium 進行 HTML 到 PDF 的轉換,確保完全支援 CSS3 和 ES2024 JavaScript。 現代框架和響應式設計能夠正確渲染。
基於 HTML 的內容創建: Web 開發人員可以利用現有的 HTML 和 CSS 技能。 無需學習基於座標的繪圖 API 或管理字體物件。
自動版面配置和分頁:文字換行、分頁符號和串流版面配置自動完成。 無需手動計算元素位置。
簡化 API:常用操作只需呼叫一個方法即可完成。 PdfDocument.Merge()取代了複雜的檔案路徑處理模式。
積極開發:隨著 .NET 10 和 C# 14 的普及,IronPDF 將持續更新,確保與目前和未來的 .NET 版本相容。
功能齊全:內建浮水印、數位簽章、PDF/A 合規性以及 ZetPDF 所缺乏的進階 PDF 操作功能。






