SelectPdf與IronPDF:技術比較指南
當.NET開發者評估用於文件生成和操作的PDF程式庫時,ZetPDF作為基於PDFSharp基礎的商業授權選項之一出現。 然而,其繼承的架構和限制為構建現代應用程式的團隊帶來了重要的考慮因素。 這項技術比較檢視了ZetPDF與IronPDF,以幫助架構師和開發者理解渲染技術、API設計和功能完整性方面的基本差異。
了解ZetPDF
ZetPDF是一個設計用於在C#應用程式中處理PDF檔案的商業授權PDF程式庫。 建基於廣泛使用的開源PDFSharp程式庫基礎上,它提供了一個穩固的解決方案,可以建立、修改和管理PDF文件,並提供商業支援和授權選項。
作為一個基於PDFSharp的程式庫,它繼承了其基礎的功能和限制:
- PDFSharp基礎: 利用PDFSharp的核心能力與商業授權
- 基於坐標的API: 需要用精確坐標手動定位元素
- 商業支援: 通過商業授權提供優先支援
- 靈活的授權: 提供開發者、專案或OEM授權模式
- 繼承的限制: 繼承PDFSharp的限制,包括有限的HTML至PDF能力
PDFSharp的傳承
ZetPDF基於坐標的程式設計模型迫使開發人員手動定位每個元素:
// ZetPDF: 手動 positioning with coordinates
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 with coordinates
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 with coordinates
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
IronPDF採取了一種根本不同的方法,使用基於Chromium的技術來提供完整的網頁標準支持的HTML到PDF轉換。 而不是基於坐標的圖形程式設計,IronPDF允許開發人員使用熟悉的HTML和CSS進行文件建立。
主要特點包括:
- Chromium渲染引擎: 使用現代瀏覽器技術進行準確的HTML/CSS渲染
- 基於HTML/CSS的設計: 利用網頁開發技能進行文件佈局
- 完整的JavaScript支持: 以ES2024 JavaScript渲染動態網頁內容
- 自動佈局: 內容自然流動,無需手動坐標計算
- 高級PDF功能: 內建支持水印、頁眉/頁腳、合併等
功能比較
下表基於其架構方法突出了ZetPDF和IronPDF之間的重要差異:
| 功能 | ZetPDF | IronPDF |
|---|---|---|
| 基於PDFSharp | 是 | 否 |
| HTML至PDF轉換 | 有限的 | 是 (完整的Chromium渲染) |
| 商業授權 | 是,永久性 | 是 |
| 開源基礎 | PDFSharp (MIT授權) | 基於Chromium |
| 與PDFSharp的區別 | 有限的 | 完整的HTML至PDF,獨特的能力 |
| 簡單和易用性 | 中等 | 高 |
| 支持PDF註釋 | 是 | 是 |
| 文字提取 | 標準 | 高級 |
| 支持水印 | 是 | 是 |
詳細的功能比較
| 功能 | ZetPDF | IronPDF |
|---|---|---|
| 內容建立 | ||
| HTML到PDF | 有限的 | 是 |
| URL到PDF | 有限的 | 是 |
| CSS支持 | 否 | 完整的CSS3 |
| JavaScript | 否 | 完整的ES2024 |
| 版面 | ||
| 自動佈局 | 否 | 是 |
| 自動分頁 | 否 | 是 |
| 表格 | 手動繪製 | HTML <table> |
| 圖片 | 手動放置 | <img> 標籤 |
| PDF操作 | ||
| 頁眉/頁腳 | 手動 | HTML/CSS |
| 水印 | 手動程式碼 | 內建的 |
| 合併PDFs | 是 | 是 |
| 分割PDFs | 有限的 | 是 |
| 數位簽名 | 否 | 是 |
| PDF/A | 否 | 是 |
| 開發 | ||
| 跨平台 | 是 | 是 |
API架構差異
ZetPDF和IronPDF之間的API模式揭示了關於PDF生成的不同設計理念。
ZetPDF HtmlToPdfConverter模式
該程式庫提供了一個HtmlToPdfConverter類進行HTML到PDF轉換:
// ZetPDF — download from zetpdf.com
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");
}
}// ZetPDF — download from zetpdf.com
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
Class Program
Shared 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 ClassConvertHtmlToPdf方法採入HTML內容和一個輸出檔路徑,並直接將結果寫入磁碟。
IronPDF ChromePdfRenderer模式
IronPDF使用ChromePdfRenderer類與基於Chromium的渲染:
// 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 ClassChromePdfRenderer返回一個PdfDocument物件,在保存之前提供額外的操作能力。 有關完整的HTML轉換指導,請參閱HTML到PDF教程。
URL至PDF轉換
將即時網頁轉換為PDF文件展示了每個程式庫的網頁渲染方法能力。
ZetPDF實現
程式庫也通過其HtmlToPdfConverter類處理URL轉換:
// ZetPDF — download from zetpdf.com
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");
}
}// ZetPDF — download from zetpdf.com
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
Class Program
Shared 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 ClassIronPDF實現
IronPDF提供專用的URL渲染與Chromium:
// 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 ClassRenderUrlAsPdf方法利用Chromium的渲染引擎處理網頁,全面執行JavaScript,並支持現代CSS,生成的輸出與現代瀏覽器中使用者看到的效果相符。
PDF合併操作
組合多個PDF文件是組裝工作流的通用需求。
ZetPDF合併模式
程式庫提供了一個PdfMerger類來組合文件:
// ZetPDF — download from zetpdf.com
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");
}
}// ZetPDF — download from zetpdf.com
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 ModuleMergeFiles方法接受一個檔路徑列表和一個輸出路徑,並將合併結果直接寫入磁碟。
IronPDF靜態合併模式
IronPDF提供一個靜態PdfDocument類上:
// 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 ModulePdfDocument.Merge方法返回一個PdfDocument物件,允許在保存之前進行水印、安全設置或元資料修改等額外操作。
API對應參考
評估從ZetPDF轉向IronPDF的團隊將發現此對應圖有助於理解概念等價物:
| ZetPDF | IronPDF |
|---|---|
new HtmlToPdfConverter() | new ChromePdfRenderer() |
converter.ConvertHtmlToPdf() | renderer.RenderHtmlAsPdf() |
converter.ConvertUrlToPdf() | renderer.RenderUrlAsPdf() |
new PdfMerger() | PdfDocument.Merge() |
merger.MergeFiles() | PdfDocument.Merge(list) |
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() |
坐標基於與HTML基於設計
ZetPDF和IronPDF根本的架構差異在於它們在文件佈局上的方法。
ZetPDF圖形程式設計
ZetPDF的PDFSharp基礎要求基於坐標的定位:
using ZetPdf;
using ZetPdf.Drawing;
var document = new PdfDocument();
var page = document.AddPage();
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();
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()
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")這種方法需要建立字體物件、畫刷物件,以及指定每個元素的精確X,Y坐標。
IronPDF HTML/CSS設計
IronPDF使用熟悉的網頁技術:
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")HTML自動處理佈局—CSS提供樣式,無需管理字體物件,內容自然地跨頁流動。
當團隊考慮從ZetPDF轉向IronPDF
在幾種情況下,開發團隊常常評估IronPDF作為ZetPDF的替代品:
現代網頁內容需求
構建從基於Web的模板、儀表板或報告生成PDF應用程式的團隊發現基於坐標的方法限制了他們。 IronPDF的Chromium引擎渲染現代CSS Grid、Flexbox以及JavaScript驅動的內容,這是基於坐標的程式庫無法完全支持的。
HTML/CSS開發技能
擁有強大網頁開發技能的團隊發現基於坐標的PDF生成的學習曲線陡峭。HTML和CSS是廣泛理解的技術,這使得IronPDF的方法對於開發者來說更容易,無需專業的PDF或圖形程式設計專業知識。
降低程式碼複雜性
基於坐標的API產生的冗長程式碼難以維護,當文件佈局發展時尤其如此。 一個簡單的報告可能在ZetPDF中需要數十個DrawString和坐標計算,而在IronPDF中只需幾行HTML/CSS。
自動分頁和佈局
程式庫需要手動跟蹤Y位置和當內容超過頁面邊界時的明確頁面建立。 IronPDF根據CSS規則和內容流動自動處理頁面分隔:
// IronPDF - automatic page breaks
var html = @"
<div>Page 1 content</div>
<div style='page-break-after: always;'></div>
<div>Page 2 content</div>";
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("multipage.pdf");// IronPDF - automatic page breaks
var html = @"
<div>Page 1 content</div>
<div style='page-break-after: always;'></div>
<div>Page 2 content</div>";
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("multipage.pdf");Imports IronPdf
Dim html As String = "
<div>Page 1 content</div>
<div style='page-break-after: always;'></div>
<div>Page 2 content</div>"
Dim renderer As New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("multipage.pdf")高級PDF功能
IronPDF提供內建支持功能,這些功能需要使用基於坐標的方法進行手動實現或外部工具:
優勢與考慮事項
ZetPDF優勢
- 商業支援: 通過商業授權提供優先支援,確保開發人員獲得及時協助
- PDFSharp整合: 利用PDFSharp的核心能力,得到許多.NET開發人員的認可
ZetPDF考量因素
- 繼承的限制: 因其基於PDFSharp,該程式庫繼承了底層框架的限制
- 有限的區別: 相較於直接使用PDFSharp,商業授權提供的額外價值有限
- 基於坐標的複雜性: 手動定位需求增加了動態文件程式碼的複雜性
IronPDF優勢
- 完整的HTML至PDF解決方案: 全面HTML至PDF功能對於自動化網頁轉換至關重要
- 增強的渲染能力: Chromium基於渲染直接影響輸出質量,提供更好的網頁內容處理
- 高級功能: 包括PDF表單管理、動態水印及數位簽名等獨特功能超越了標準PDF操作
- 積極開發: 定期更新以確保與現代.NET版本的相容性
.NET相容性和未來準備
這兩個程式庫都支持跨平台.NET開發。 IronPDF保持積極開發,並且定期更新以確保與.NET 8、.NET 9以及預計於2026年發布的.NET 10的相容性。該程式庫的HTML/CSS方法與現代網頁開發實踐一致,利用.NET開發者已經擁有的網頁技術技能。
結論
ZetPDF和IronPDF代表了.NET中PDF生成的不同方法。 ZetPDF,以PDFSharp為基礎的程式庫,為熟悉坐標圖形程式設計的開發者提供了可靠的解決方案。 其商業授權為投資PDFSharp生態系統的團隊提供了支持和可靠性。
IronPDF的基於Chromium的方法將PDF生成視為網頁渲染,使開發人員可以使用HTML、CSS和JavaScript,而不需要學習基於坐標的圖形API。自動佈局、分頁和現代網頁標準支持(CSS Grid、Flexbox、ES2024 JavaScript)顯著減少程式碼複雜性,同時產生出與現代瀏覽器渲染相匹配的輸出。
對於構建應用程式生成基於網頁的報告、儀表板或動態文件的團隊而言,IronPDF的方法自然符合現代開發實踐。 對於已有PDFSharp專業知識或特定需要對低級別PDF進行控制的團隊而言,ZetPDF商業產品提供基於熟悉的PDFSharp基礎的支持和授權選項。
最終的選擇取決於您團隊的需求:如果您的PDF源自網頁內容或您更喜歡使用HTML/CSS進行文件設計,IronPDF提供了顯著的生產力優勢。 如果您是在現有的PDFSharp技能基礎上開發或需要ZetPDF提供的特定授權模式,那麼這條路徑可能適合您的需求。
更多實施指引可查閱IronPDF文件和教程,涉及具體用例和高級功能。
(PDFSharp 和 ZetPDF 是其各自所有者的註冊商標。 本網站與ZetPDF或empira Software GmbH無關或未由其贊助或認可。 所有產品名稱、商標和品牌均為其各自所有者的財產。 比較僅供資訊參考,反映撰寫時公開可用的資訊。)
