比较

ZetPDF 与 IronPdf:技术比较指南

ZetPDF与 IronPDF:.NET PDF 生成的技术比较

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

对于需要适应不同内容长度或需要响应式设计模式的文档布局,这种方法可能会变得复杂。

了解IronPDF

IronPDF 采用了一种根本不同的方法,它使用基于 Chromium 的技术来提供 HTML 到 PDF 的转换,并完全支持 Web 标准。 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 提供了一个用于 HTML 到 PDF 转换的 HtmlToPdfConverter 类:

// 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 转 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备注
<代码>new HtmlToPdfConverter()</ 代码<代码>new ChromePdfRenderer()</ 代码主呈现器类
<代码>converter.ConvertHtmlToPdf()</代码<代码>renderer.RenderHtmlAsPdf()</代码HTML 字符串转换
<代码>converter.ConvertUrlToPdf()</代码<代码>renderer.RenderUrlAsPdf()</代码URL 转换
<代码>new PdfMerger()</ 代码<代码>PdfDocument.Merge()</代码PDF 合并
<代码>merger.MergeFiles()</代码<代码>PdfDocument.Merge(list)</代码合并多个 PDF
<代码>new PdfDocument()</ 代码<代码>new 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

基于坐标的设计与基于 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 网格、Flexbox 和JavaScript驱动的内容。

HTML/CSS开发人员技能

具有较强网络开发技能的团队会发现基于坐标的 PDF 生成的学习曲线非常陡峭。HTML 和 CSS 是广为人知的技术,使得IronPDF的方法更容易被没有专业 PDF 或图形编程知识的开发人员所接受。

降低代码复杂性

基于坐标的应用程序接口会产生冗长的代码,随着文档布局的不断变化而难以维护。 一份简单的报告在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 转 PDF 解决方案:全面的 HTML 到 PDF 功能,对于网页自动转换至关重要
  • 增强的呈现:基于 Chromium 的呈现可提供卓越的网页内容处理能力,直接影响输出质量
  • 高级功能:包括 PDF 表单管理、动态水印和数字签名在内的独特功能超出了标准 PDF 操作的范围
  • 积极开发:定期更新确保与现代 .NET 版本兼容

.NET兼容性和未来准备情况

这两个库都支持跨平台 .NET 开发。IronPDFfor .NET 保持着定期更新的积极开发态势,确保与 .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 网格、Flexbox、ES2024 JavaScript)大大降低了代码的复杂性,同时生成的输出与现代浏览器渲染相匹配。

对于构建生成基于网络的报告、仪表盘或动态文档的应用程序的团队来说,IronPDF 的方法与现代开发实践自然地保持一致。 对于已有 PDFSharp 专业知识或对底层 PDF 控制有特殊要求的团队,ZetPDF 的商业产品可在熟悉的 PDFSharp 基础上提供支持和 License 选项。

选择最终取决于您团队的要求:如果您的 PDF 源自网络内容,或者您更喜欢用HTML/CSS进行文档设计,那么IronPDF将为您带来显著的生产力优势。 如果您要在现有 PDFSharp 技能的基础上进行开发,或者需要ZetPDF提供的特定许可模式,那么该路径可能会满足您的需求。

有关更多实施指导,请浏览 IronPDF 文档和涵盖特定用例和高级功能的 教程