ZetPDF 与 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对于需要适应不同内容长度或需要响应式设计模式的文档布局,这种方法可能会变得复杂。
了解IronPDF
IronPDF 采用了一种根本不同的方法,它使用基于 Chromium 的技术来提供 HTML 到 PDF 的转换,并完全支持 Web 标准。 IronPDF不是基于坐标的图形编程,而是让开发人员能够使用熟悉的 HTML 和 CSS 来创建文档。
主要特点包括
- Chromium渲染引擎:采用现代浏览器技术,实现精确的HTML/CSS渲染 -基于HTML/CSS的设计:运用网页开发技能进行文档布局 -完全支持 JavaScript:使用 ES2024JavaScript渲染动态网页内容 -自动布局:内容自然流畅,无需手动计算坐标 -高级 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 |
| 水印 | 手册代码 | 内置 |
| 合并 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");
}
}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 ModuleConvertHtmlToPdf 方法接收 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 ClassChromePdfRenderer 返回一个 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");
}
}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 ModuleIronPdf 的实现
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 ClassRenderUrlAsPdf 方法利用 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 ModuleMergeFiles 方法接受文件路径列表和输出路径,将合并结果直接写入磁盘。
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 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 颜色 |
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 坐标。
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")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");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外部工具的功能提供内置支持:
优势和考虑因素
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 文档和涵盖特定用例和高级功能的 教程。