MIGRATION GUIDES How to Migrate from ZetPDF to IronPDF in C# Curtis Chau 發表日期:2026年2月1日 下載 IronPDF NuGet 下載 DLL 下載 Windows 安裝程式 開始免費試用 法學碩士副本 法學碩士副本 將頁面複製為 Markdown 格式,用於 LLMs 在 ChatGPT 中打開 請向 ChatGPT 諮詢此頁面 在雙子座打開 請向 Gemini 詢問此頁面 在 Grok 中打開 向 Grok 詢問此頁面 打開困惑 向 Perplexity 詢問有關此頁面的信息 分享 在 Facebook 上分享 分享到 X(Twitter) 在 LinkedIn 上分享 複製連結 電子郵件文章 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:功能對比 了解架構差異有助於技術決策者評估遷移投資: 特徵 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 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 使用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"); } } $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 等效項來加速遷移: 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> 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程式碼。 程式碼更新任務 刪除 ZetPDF NuGet 套件 安裝 IronPdf NuGet 套件 將命名空間導入從ZetPDF更新為IronPdf 將HtmlToPdfConverter替換為ChromePdfRenderer 將ConvertHtmlToPdf()呼叫轉換為RenderHtmlAsPdf() + SaveAs() 將ConvertUrlToPdf()呼叫轉換為RenderUrlAsPdf() + SaveAs()調用 將PdfMerger.MergeFiles()替換為PdfDocument.Merge() 將DrawString()呼叫轉換為 HTML 文字元素 將XFont轉換為 CSS font-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 操作功能。 Curtis Chau 立即與工程團隊聊天 技術撰稿人 Curtis Chau 擁有電腦科學學士學位(卡爾頓大學),專長於前端開發,精通 Node.js、TypeScript、JavaScript 和 React。Curtis 對製作直覺且美觀的使用者介面充滿熱情,他喜歡使用現代化的架構,並製作結構良好且視覺上吸引人的手冊。除了開發之外,Curtis 對物聯網 (IoT) 也有濃厚的興趣,他喜歡探索整合硬體與軟體的創新方式。在空閒時間,他喜歡玩遊戲和建立 Discord bots,將他對技術的熱愛與創意結合。 相關文章 發表日期 2026年2月1日 How to Migrate from Scryber.Core to IronPDF in C# Master the migration from Scryber.Core to IronPDF with this complete C# guide. Switch from custom XML/HTML parsing to a modern Chromium renderer. Includes code examples for HTML conversion, URL rendering, and replacing proprietary bindings. 閱讀更多 發表日期 2026年2月1日 How to Migrate from XFINIUM.PDF to IronPDF in C# Master the migration from XFINIUM.PDF to IronPDF with this complete C# guide. Switch from manual coordinate-based positioning to declarative HTML/CSS rendering. Includes code examples for replacing graphics primitives and automatic layout. 閱讀更多 發表日期 2026年2月1日 How to Migrate from PdfPig to IronPDF in C# Master the migration from PdfPig to IronPDF with this complete C# guide. Switch from a reading-only library to a comprehensive PDF solution. Includes code examples for text extraction, HTML conversion, and metadata access. 閱讀更多 How to Migrate from XFINIUM.PDF to ...
發表日期 2026年2月1日 How to Migrate from Scryber.Core to IronPDF in C# Master the migration from Scryber.Core to IronPDF with this complete C# guide. Switch from custom XML/HTML parsing to a modern Chromium renderer. Includes code examples for HTML conversion, URL rendering, and replacing proprietary bindings. 閱讀更多
發表日期 2026年2月1日 How to Migrate from XFINIUM.PDF to IronPDF in C# Master the migration from XFINIUM.PDF to IronPDF with this complete C# guide. Switch from manual coordinate-based positioning to declarative HTML/CSS rendering. Includes code examples for replacing graphics primitives and automatic layout. 閱讀更多
發表日期 2026年2月1日 How to Migrate from PdfPig to IronPDF in C# Master the migration from PdfPig to IronPDF with this complete C# guide. Switch from a reading-only library to a comprehensive PDF solution. Includes code examples for text extraction, HTML conversion, and metadata access. 閱讀更多