跳至頁尾內容
移民指南

如何在 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 form
$vbLabelText   $csharpLabel

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

IronPDF 與 ZetPDF:功能對比

了解架構差異有助於技術決策者評估遷移投資:

特徵ZetPDFIronPDF
基於 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
SHELL

安裝 IronPDF:

# Install IronPDF
dotnet add package IronPdf
# Install IronPDF
dotnet add package IronPdf
SHELL

步驟 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;
$vbLabelText   $csharpLabel

步驟 3:初始化許可證

在應用程式啟動時新增許可證初始化:

IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
$vbLabelText   $csharpLabel

程式碼遷移範例

將 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");
    }
}
$vbLabelText   $csharpLabel

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

ZetPDF 使用HtmlToPdfConverterConvertHtmlToPdf()函數直接寫入檔案路徑。 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");
    }
}
$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");
        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");
    }
}
$vbLabelText   $csharpLabel

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

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

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

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

ZetPDF 方法需要建立字體物件、計算精確的像素位置並手動管理圖形上下文。 IronPDF 的方法使用 Web 開發人員已經熟悉的標準 HTML 和 CSS——字體、顏色和佈局都透過熟悉的 CSS 屬性來處理。

ZetPDF API 到 IronPDF 映射參考

此映射透過顯示直接的 API 等效項來加速遷移:

ZetPDFIronPDF筆記
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 + divHTML 框
new XFont()CSS font-family支援的網頁字體
XBrushes.BlackCSS color全彩支持
document.Save()pdf.SaveAs()儲存到文件
PdfReader.Open()PdfDocument.FromFile()載入現有PDF
HtmlToPdfConverterChromePdfRendererHTML轉換
ConvertHtmlToPdf()RenderHtmlAsPdf()將 HTML 字串轉換為 PDF
ConvertUrlToPdf()RenderUrlAsPdf()PDF檔案的URL
PdfMergerPdfDocument.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>
HTML

第三期:色彩處理

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>
HTML

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" .
SHELL

需要轉換為HTML的基於座標的繪圖程式碼文件。 注意字體和顏色的使用規律。 將佈局結構對應到對應的HTML程式碼。

程式碼更新任務

  1. 刪除 ZetPDF NuGet 套件
  2. 安裝 IronPdf NuGet 套件
  3. 將命名空間導入從ZetPDF更新為IronPdf
  4. HtmlToPdfConverter替換為ChromePdfRenderer
  5. ConvertHtmlToPdf()呼叫轉換為RenderHtmlAsPdf() + SaveAs()
  6. ConvertUrlToPdf()呼叫轉換為RenderUrlAsPdf() + SaveAs()調用
  7. PdfMerger.MergeFiles()替換為PdfDocument.Merge()
  8. DrawString()呼叫轉換為 HTML 文字元素
  9. XFont轉換為 CSS font-family
  10. 用 CSS 顏色取代XBrushes
  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 操作功能。

柯蒂斯·週
技術撰稿人

Curtis Chau擁有卡爾頓大學電腦科學學士學位,專長於前端開發,精通Node.js、TypeScript、JavaScript和React。他熱衷於打造直覺美觀的使用者介面,喜歡使用現代框架,並擅長撰寫結構清晰、視覺效果出色的使用者手冊。

除了開發工作之外,柯蒂斯對物聯網 (IoT) 也抱有濃厚的興趣,致力於探索硬體和軟體整合的創新方法。閒暇時,他喜歡玩遊戲和製作 Discord 機器人,將他對科技的熱愛與創造力結合。