如何用 C# 從 ZetPDF 轉移到 IronPDF
ZetPDF 是適用於 C# 應用程式的商業授權 PDF 函式庫,建構在廣泛使用的開放原始碼 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 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 form
IronPDF 使用 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: Simple HTML
Dim html As String = "
<p><strong>Name:</strong> John Doe</p>
<p><strong>Address:</strong> 123 Main St</p>"
Dim pdf = renderer.RenderHtmlAsPdf(html)
IronPDFvs ZetPDF:功能比較
了解架構上的差異有助於技術決策者評估遷移投資:
| 特點 | ZetPDF | IronPDF |
|---|---|---|
| 以 PDFSharp 為基礎 | 是 | 無 |
| HTML 至 PDF 轉檔 | 限額 | 是 (完整 Chromium) |
| 商業授權 | 是的,永久 | 是 |
| 開放原始碼基金會 | PDFSharp (MIT 授權) | 基於 Chromium |
| CSS 支援 | 無 | 完整的 CSS3 |
| JavaScript。 | 無 | 完整的 ES2024 |
| 自動排版 | 無 | 是 |
| 自動分頁 | 無 | 是 |
| 表格 | 手繪 | HTML <table> |
| 頁首/頁腳 | 手動的 | HTML/CSS |
| 水印。 | 手冊程式碼 | 內建 |
| 合併 PDF 文件 | 限額 | 是 |
| 分割 PDFs | 限額 | 是 |
| 數位簽名 | 無 | 是 |
| 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:更新命名空間
用IronPDF命名空間取代ZetPDF命名空間:
// 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;
Imports IronPdf
步驟 3:初始化授權
在應用程式啟動時加入授權初始化:
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
程式碼遷移範例
將 HTML 轉換為 PDF
HTML-to-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");
}
}
Imports ZetPDF
Imports System
Module Program
Sub Main()
Dim converter As New HtmlToPdfConverter()
Dim htmlContent As String = "<html><body><h1>Hello World</h1></body></html>"
converter.ConvertHtmlToPdf(htmlContent, "output.pdf")
Console.WriteLine("PDF created successfully")
End Sub
End Module
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");
}
}
Imports IronPdf
Imports System
Class Program
Shared Sub Main()
Dim renderer = New ChromePdfRenderer()
Dim htmlContent = "<html><body><h1>Hello World</h1></body></html>"
Dim pdf = renderer.RenderHtmlAsPdf(htmlContent)
pdf.SaveAs("output.pdf")
Console.WriteLine("PDF created successfully")
End Sub
End Class
ZetPDF 使用 HtmlToPdfConverter 和 ConvertHtmlToPdf(),直接寫入檔案路徑。IronPDF提供 ChromePdfRenderer 和 RenderHtmlAsPdf(),傳回一個 PdfDocument 對象,讓您在輸出上擁有更大的彈性—您可以儲存到檔案、取得二進位資料或在儲存之前執行其他操作。
如需進階的 HTML 至IronPDF情境,請參閱 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");
}
}
Imports ZetPDF
Imports System
Module Program
Sub Main()
Dim converter As New HtmlToPdfConverter()
Dim url As String = "https://www.example.com"
converter.ConvertUrlToPdf(url, "webpage.pdf")
Console.WriteLine("PDF from URL created successfully")
End Sub
End Module
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");
}
}
Imports IronPdf
Imports System
Class Program
Shared Sub Main()
Dim renderer = New ChromePdfRenderer()
Dim url = "https://www.example.com"
Dim pdf = renderer.RenderUrlAsPdf(url)
pdf.SaveAs("webpage.pdf")
Console.WriteLine("PDF from URL created successfully")
End Sub
End Class
ZetPDF 使用相同的 HtmlToPdfConverter 類別和 ConvertUrlToPdf() 類別。IronPDF在 RenderUrlAsPdf() 和 ChromePdfRenderer 上提供 RenderUrlAsPdf(),它利用完整的 Chromium 渲染引擎來精確捕獲網頁,包括 JavaScript 執行和現代 CSS。
探索URL至PDF文件的認證和自訂標頭選項。
合併多個 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");
}
}
Imports ZetPDF
Imports System
Imports System.Collections.Generic
Module Program
Sub Main()
Dim merger As New PdfMerger()
Dim files As New List(Of String) From {"document1.pdf", "document2.pdf"}
merger.MergeFiles(files, "merged.pdf")
Console.WriteLine("PDFs merged successfully")
End Sub
End Module
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");
}
}
Imports IronPdf
Imports System
Imports System.Collections.Generic
Module Program
Sub Main()
Dim pdfs As New List(Of PdfDocument) From {
PdfDocument.FromFile("document1.pdf"),
PdfDocument.FromFile("document2.pdf")
}
Dim merged = PdfDocument.Merge(pdfs)
merged.SaveAs("merged.pdf")
Console.WriteLine("PDFs merged successfully")
End Sub
End Module
ZetPDF 使用專用的 PdfMerger 類,該類對帶有 MergeFiles() 的檔案路徑進行操作。IronPDF使用 PdfDocument.FromFile() 將文件載入為 PdfDocument 對象,然後使用靜態 PdfDocument.Merge() 方法將它們合併。 這種物件導向的方法可在儲存之前對合併後的文件進行其他操作。
探索 IronPDF合併文件,以獲得其他合併選項。
基於座標的繪圖 vs 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");
Imports ZetPdf
Imports ZetPdf.Drawing
Dim document As New PdfDocument()
Dim page = document.AddPage()
page.Width = XUnit.FromMillimeter(210)
page.Height = XUnit.FromMillimeter(297)
Dim graphics = XGraphics.FromPdfPage(page)
Dim titleFont As New XFont("Arial", 24, XFontStyle.Bold)
Dim bodyFont As 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");
Imports IronPdf
Dim html As String = $"
<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>"
Dim renderer As New ChromePdfRenderer()
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("report.pdf")
ZetPDF 方法需要建立字型物件、計算精確的像素位置,以及手動管理圖形上下文。IronPDF的方法使用網頁開發人員已經熟悉的標準 HTML 和 CSS - 透過熟悉的 CSS 屬性來處理字型、顏色和排版。
ZetPDFAPI 到IronPDF的映射參考。
此對應可透過顯示直接的 API 對應關係來加速遷移:
| ZetPDF | IronPDF |
|---|---|
new PdfDocument() |
new ChromePdfRenderer() |
document.AddPage() |
自動化 |
XGraphics.FromPdfPage(page) |
不適用 |
graphics.DrawString() |
HTML 文字元素 |
graphics.DrawImage() |
<img> 標籤 |
graphics.DrawLine() |
CSS 邊框 |
graphics.DrawRectangle() |
CSS border + div |
new XFont() |
CSS font-family |
XBrushes.Black |
CSS color |
document.Save() |
pdf.SaveAs() |
PdfReader.Open() |
PdfDocument.FromFile() |
HtmlToPdfConverter |
ChromePdfRenderer |
ConvertHtmlToPdf() |
RenderHtmlAsPdf() |
ConvertUrlToPdf() |
RenderUrlAsPdf() |
PdfMerger |
PdfDocument.Merge() |
常見的遷移問題與解決方案
問題 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>
第 3 期:顏色處理
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: 需要手繪矩形、線條和文字定位。
解決方案:使用標準的 HTML 表格與 CSS 造型:
<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 對應項目。
程式碼更新任務
1.移除ZetPDFNuGet 套件 2.安裝IronPDFNuGet 套件
- 將命名空間導入從
ZetPDF更新為IronPdf - 將
HtmlToPdfConverter替換為ChromePdfRenderer - 將
ConvertHtmlToPdf()呼叫轉換為RenderHtmlAsPdf()+SaveAs() - 將
ConvertUrlToPdf()呼叫轉換為RenderUrlAsPdf()+SaveAs() - 將
PdfMerger.MergeFiles()替換為PdfDocument.Merge() - 將
DrawString()呼叫轉換為 HTML 文字元素 - 將
XFont轉換為 CSSfont-family - 將
XBrushes替換為 CSS 顏色 11.在啟動時增加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 操作功能。

