比較

ZetPDF vs IronPDF:技術比較指南

ZetPDFvs IronPDF:.NET PDF 生成的技術比較

當 .NET 開發人員評估用於文件產生與處理的 PDF 函式庫時,ZetPDF 會以建立在 PDFSharp 基礎上的商業授權選項出現。 然而,其繼承的架構和限制為建立現代應用程式的團隊提出了重要的考量。 本技術比較將ZetPDF與IronPDF一併檢視,以協助架構師和開發人員瞭解兩者在渲染技術、API 設計和功能完整性上的根本差異。

瞭解 ZetPDF

ZetPDF 是一個商業授權的 PDF 函式庫,專為在 C# 應用程式中處理 PDF 檔案而設計。ZetPDF建立在廣泛使用的開放原始碼 PDFSharp 函式庫的基礎上,為建立、修改和管理 PDF 文件提供強大的解決方案,並提供商業支援和授權選項。

身為基於 PDFSharp 的函式庫,ZetPDF 繼承了其基礎的功能與限制:

  • PDFSharp Foundation:利用 PDFSharp 的核心功能與商業授權
  • 基於座標的 API:需要以精確的座標手動定位元素
  • 商業支援:透過商業授權提供優先支援
  • 彈性授權:提供開發人員、專案或 OEM 授權模式
  • 繼承限制:繼承 PDFSharp 的限制,包括有限的 HTML-to-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
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

對於需要適應不同內容長度或需要回應式設計模式的文件佈局,這種方法可能會變得複雜。

了解 IronPDF

IronPDF 採用了根本不同的方法,使用基於 Chromium 的技術提供 HTML 到 PDF 的轉換,並支援完整的網頁標準。 IronPDF不是基於坐標的圖形編程,而是讓開發人員使用熟悉的 HTML 和 CSS 來建立文件。

主要特點包括

  • Chromium 渲染引擎:使用現代瀏覽器技術進行精確的HTML/CSS呈現
  • 基於HTML/CSS的設計:利用網頁開發技能進行文件排版
  • FullJavaScriptSupport:使用 ES2024JavaScript渲染動態網頁內容
  • 自動排版:內容自然流暢,無需手動計算坐標
  • 進階 PDF 功能:內建支援水印、頁首/頁腳、合併等功能

功能比較

下表根據ZetPDF和IronPDF的架構方法,重點列出兩者的主要差異:

特點ZetPDFIronPDF
以 PDFSharp 為基礎
HTML 至 PDF 轉檔限額是 (完整 Chromium 渲染)
商業授權是的,永久
開放原始碼基金會PDFSharp (MIT 授權)基於 Chromium
與 PDFSharp 的差異限額完整的 HTML 至 PDF,獨特的功能
簡單易用緩和高的
支援 PDF 註解
文字萃取標準進階
水印支援

詳細功能比較

特點ZetPDFIronPDF
內容創作
HTML 至 PDF限額
URL 至 PDF限額
CSS 支援完整的 CSS3
JavaScript完整的 ES2024
版面設計
自動排版
自動分頁
表格手繪HTML <table>
圖片手動放置<img> 標籤
PDF作業
頁首/頁尾手動的HTML/CSS
水印手冊程式碼內建
合併 PDF
分割 PDF限額
數位簽名
PDF/A
開發
跨平台

API 架構差異

ZetPDF 和IronPDF之間的 API 模式揭示了圍繞 PDF 生成的不同設計理念。

ZetPDFHtmlToPdfConverter 模式

ZetPDF 提供了一個 HtmlToPdfConverter 類,用於 HTML 到 PDF 的轉換:

// 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");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

ConvertHtmlToPdf 方法接收 HTML 內容和輸出檔案路徑,將結果直接寫入磁碟。

IronPDFChromePdfRenderer 模式

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");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

ChromePdfRenderer會返回一個 PdfDocument 物件,在儲存之前提供額外的操作功能。 如需全面的 HTML 轉換指南,請參閱 HTML to PDF 教學

URL 至 PDF 轉換

將實際網頁轉換成 PDF 文件,可展示每個函式庫的網頁呈現方式的功能。

ZetPDF實作

ZetPDF 透過其 HtmlToPdfConverter 類提供 URL 轉換功能:

// 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");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

IronPDF實作。

IronPdf 使用 Chromium 提供專用的 URL 渲染功能:

// 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");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

RenderUrlAsPdf 方法利用 Chromium 的渲染引擎,以完整的JavaScript執行和現代 CSS 支援來處理網頁,產生與使用者在現代瀏覽器中看到的內容相符的輸出。

PDF 合併作業

結合多個 PDF 文件是文件組裝工作流程的常見需求。

ZetPDF合併模式

ZetPDF 提供了一個 PdfMerger 類,用於合併文件:

// 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");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

MergeFiles 方法接受檔案路徑清單和輸出路徑,將合併結果直接寫入磁碟。

IronPDF的靜態合併模式

IronPDF 在 PdfDocument 類上提供了一個靜態 Merge 方法:

// 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");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

PdfDocument.Merge 方法會傳回一個 PdfDocument 物件,可在儲存之前進行其他操作,例如水印、安全設定或修改元資料。

API 對應參考。

正在評估從ZetPDF轉換到IronPDF的團隊會發現此對應表有助於理解等同的概念:

ZetPDFIronPDF筆記
新的 HtmlToPdfConverter()新的 ChromePdfRenderer()主要呈現器類
converter.ConvertHtmlToPdf()<編碼>renderer.RenderHtmlAsPdf()</編碼HTML 字串轉換
converter.ConvertUrlToPdf()renderer.RenderUrlAsPdf()URL 轉換
<代碼>new PdfMerger()</ 代碼<代碼>PdfDocument.Merge()</代碼PDF 合併
<代碼>merger.MergeFiles()</代碼<代碼>PdfDocument.Merge(list)</代碼結合多個 PDF
new PdfDocument()新的 ChromePdfRenderer()建立呈現器
<編碼>document.AddPage()</編碼自動化從 HTML 建立的頁面
XGraphics.FromPdfPage(page)不適用改用 HTML/CSS
<代碼>graphics.DrawString()</代碼HTML 文字元素<p><h1>等。
<代碼>graphics.DrawImage()</代碼<img> 標籤HTML 影像
<代碼>graphics.DrawLine()</代碼CSS 邊框<hr>
<代碼>graphics.DrawRectangle()</代碼CSS border + divHTML 方塊
new XFont()CSS font-family支援的網頁字型
<編碼>XBrushes.Black</編碼CSS 顏色全彩支援
<編碼>document.Save()</編碼<代碼>pdf.SaveAs()</代碼儲存至檔案
<代碼>PdfReader.Open()</代碼<代碼>PdfDocument.FromFile()</代碼載入現有 PDF

基於座標的設計 vs 基於 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");
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

此方法需要建立字型物件、筆刷物件,並為每個元素指定精確的 X、Y 座標。

IronPdfHTML/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");
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

HTML 可自動處理版面設計-CSS 可提供樣式設計,無需字型物件管理,內容可在頁面間自然流動。

當團隊考慮從ZetPDF轉移到IronPDF時。

有幾種情況通常會促使開發團隊評估IronPDF作為ZetPDF的替代方案:

現代網路內容需求

從網頁型模板、儀表板或報表產生 PDF 的應用程式建置團隊,會發現基於坐標的方法有其限制。 IronPdf 的 Chromium 引擎可以渲染現代 CSS Grid、Flexbox 和JavaScript驅動的內容,這些都是基於坐標的函式庫無法完全支援的。

HTML/CSS開發人員技能

擁有強大網路開發技術的團隊會發現基於坐標的 PDF 生成的學習曲線非常陡峭。HTML 和 CSS 是廣為人知的技術,使得IronPDF的方法更容易被沒有專業 PDF 或圖形編程知識的開發人員所接受。

降低程式碼複雜度

基於坐標的 API 會產生冗長的程式碼,隨著文件佈局的演進而變得難以維護。 在ZetPDF中,一份簡單的報告可能需要數十個 DrawString 和坐標計算,而在IronPDF中則只需要幾行 HTML/CSS。

自動分頁和排版

ZetPDF 需要手動追蹤 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");
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

進階 PDF 功能

IronPDF 為需要手動執行或使用ZetPDF外部工具的功能提供內建支援:

優勢和考慮因素

ZetPDF的優勢

  • 商業支援:透過商業授權提供優先支援,確保開發人員及時獲得協助
  • PDFSharp 整合:利用 PDFSharp 的核心功能,獲得許多 .NET 開發人員的認可
  • 彈性授權:允許根據開發人員、專案或 OEM 需求量身打造的彈性授權模式
  • 跨平台:支援多種平台,提供部署彈性

ZetPDF注意事項

  • 繼承限制:由於ZetPDF是基於 PDFSharp,因此它會繼承基礎函式庫的限制。
  • 有限的差異性:與直接使用 PDFSharp 相比,ZetPDF 在商業授權方面提供的令人信服的理由有限
  • 基於座標的複雜性:手動定位要求增加動態文件的程式碼複雜性

IronPDF的優勢

  • 完整的 HTML-to-PDF 解決方案:自動化網頁轉換所需的全面 HTML-to-PDF 功能
  • 增強渲染:基於 Chromium 的呈現提供優異的網頁內容處理,直接影響輸出品質
  • 進階功能:包括 PDF 表單管理、動態水印和數位簽章在內的獨特功能超越了標準的 PDF 操作。
  • 主動開發:定期更新確保與現代 .NET 版本相容

.NET相容性與未來準備

這兩個函式庫都支援跨平台的 .NET 開發。IronPDF保持定期更新的積極開發,確保與 .NET 8、.NET 9 以及未來版本(包括預計在 2026 年推出的 .NET 10)的相容性。圖書館的HTML/CSS方法與現代網路開發實務一致,充分利用了 .NET 開發人員因熟悉網路技術而已經具備的技能。

結論

ZetPDF 和IronPDF代表了在 .NET 中生成 PDF 的不同方法。ZetPDF以 PDFSharp 為基礎,為熟悉基於坐標的圖形編程的開發人員提供可靠的解決方案。 其商業 License 為投資於 PDFSharp 生態系統的團隊提供支援和可靠性。

IronPdf 基於 Chromium 的方法將 PDF 生成視為網頁渲染,使開發人員能夠使用 HTML、CSS 和 JavaScript,而無需學習基於坐標的圖形 API。自動排版、分頁和現代網頁標準支援 (CSS Grid、Flexbox、ES2024 JavaScript) 大幅降低程式碼複雜度,同時產生符合現代瀏覽器渲染的輸出。

對於建立應用程式的團隊而言,若要產生網頁型報表、儀表板或動態文件,IronPDF 的方法與現代開發實務自然相符。 對於已有 PDFSharp 專業知識或有特定低階 PDF 控制需求的團隊,ZetPDF 的商業產品可在熟悉的 PDFSharp 基礎上提供支援與 License 選項。

選擇最終取決於您團隊的需求:如果您的 PDF 源自網頁內容,或者您偏好使用HTML/CSS來設計文件,IronPDF 將提供顯著的生產力優勢。 如果您是以現有的 PDFSharp 技術為基礎,或是需要ZetPDF所提供的特定授權模式,這條路徑可能會符合您的需求。

如需其他實施指導,請參閱 IronPDF 文件和涵蓋特定用例和進階功能的 教學