比較

ZetPDF vs IronPDF:技術比較指南

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

瞭解 ZetPDF

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

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

  • 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
$vbLabelText   $csharpLabel

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

了解 IronPDF

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

主要特點包括

  • Chromium渲染引擎:採用現代瀏覽器技術,實現精確的HTML/CSS渲染 -基於HTML/CSS的設計:運用網頁開發技能進行文件佈局 -完全支援 JavaScript:使用 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");
    }
}
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
$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");
    }
}
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
$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");
    }
}
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
$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");
    }
}
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
$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");
    }
}
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
$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");
    }
}
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
$vbLabelText   $csharpLabel

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

API 對應參考。

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

ZetPDFIronPDF
新的 HtmlToPdfConverter()新的 ChromePdfRenderer()
converter.ConvertHtmlToPdf()renderer.RenderHtmlAsPdf()
converter.ConvertUrlToPdf()renderer.RenderUrlAsPdf()
new PdfMerger()PdfDocument.Merge()
merger.MergeFiles()PdfDocument.Merge(list)
new PdfDocument()新的 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.BlackCSS 顏色
document.Save()pdf.SaveAs()
PdfReader.Open()PdfDocument.FromFile()

基於座標的設計 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");
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")
$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");
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")
$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");
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")
$vbLabelText   $csharpLabel

進階 PDF 功能

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

-數位簽章套用加密簽章來驗證文件的真實性 -水印內建基於 HTML 的水印支持

優勢和考慮因素

ZetPDF的優勢

-商業支援:透過商業許可提供優先支持,確保開發人員獲得及時的幫助。

  • PDFSharp 整合:利用 PDFSharp 的核心功能,這些功能已獲得許多 .NET 開發人員的認可。 -靈活的授權模式:允許根據開發者、專案或 OEM 的需求靈活自訂授權模式。 -跨平台:支援多種平台,部署靈活

ZetPDF注意事項

-繼承的限制:由於ZetPDF是基於 PDFSharp,因此它繼承了底層庫的限制。 -差異化程度有限:與直接使用 PDFSharp 相比,ZetPDF 的商業許可缺乏令人信服的理由。 -基於座標的複雜度:手動定位需求會增加動態文件的程式碼複雜度

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 為基礎,為熟悉基於坐標的圖形編程的開發人員提供可靠的解決方案。 其商業 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 文件和涵蓋特定用例和進階功能的 教學