如何用 C# 从 ZetPDF 迁移到 IronPDF
ZetPDF 是一个用于 C# 应用程序的商业授权 PDF 库,建立在广泛使用的开源 PDFSharp 库的基础之上。 虽然ZetPDF提供了商业支持和基本的 PDF 操作功能,但它继承了 PDFSharp 基础的重大局限性。 最值得注意的是,该库依赖于基于坐标的图形编程,与现代替代工具相比,其 HTML 到 PDF 的转换能力有限。
本指南提供了从ZetPDF到IronPDF的完整迁移路径,为评估这一过渡的 .NET 专业开发人员提供了分步说明、代码比较和实用示例。
为什么要从ZetPDF迁移
ZetPDF 作为 PDFSharp 的一个分叉,继承了同样的架构限制,这限制了其在现代文档生成工作流中的有效性。 开发团队考虑迁移的主要原因包括
基于坐标的 API:ZetPDF强制开发者使用精确坐标定位每个元素。 随着需求的变化,每个元素的复杂手动定位给维护带来了挑战。
CSS 支持有限:没有样式系统,意味着每个元素都需要手动管理字体和颜色。
不支持 JavaScript 渲染:在生成 PDF 期间无法渲染动态网页内容或执行 JavaScript。
独特功能有限:与直接免费使用 PDFSharp 相比,ZetPDF 几乎没有提供任何令人信服的理由来证明其商业许可的必要性。
手动分页:必须手动计算和管理页面溢出,而不是依赖自动分页。
需要进行文本测量:手动计算文本换行会增加额外的开发成本。
基本问题
ZetPDF 和 PDFSharp 迫使您以精确的坐标定位每个元素:
// ZetPDF: 手册 positioning nightmare
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 nightmare
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 nightmare
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 使用 HTML/CSS--布局引擎处理一切:
// IronPDF: Simple HTML
var html = @"
<p><strong>Name:</strong> John Doe</p>
<p><strong>Address:</strong> 123 Main St</p>";
var pdf = renderer.RenderHtmlAsPdf(html);
// IronPDF: Simple HTML
var html = @"
<p><strong>Name:</strong> John Doe</p>
<p><strong>Address:</strong> 123 Main St</p>";
var pdf = renderer.RenderHtmlAsPdf(html);
' IronPDF: Simple HTML
Dim html As String = "
<p><strong>Name:</strong> John Doe</p>
<p><strong>Address:</strong> 123 Main St</p>"
Dim pdf = renderer.RenderHtmlAsPdf(html)
IronPDF与 ZetPDF:功能比较
了解架构差异有助于技术决策者评估迁移投资:
| 特征 | ZetPDF | IronPDF |
|---|---|---|
| 基于 PDFSharp | 是 | 否 |
| HTML-PDF 转换 | 有限的 | 是(全 Chromium) |
| 商业许可 | 是,永久 | 是 |
| 开源基金会 | PDFSharp(MIT 许可) | 基于 Chromium |
| CSS支持 | 否 | 完整的 CSS3 |
| JavaScript语言 | 否 | 完整的 ES2024 |
| 自动排版 | 否 | 是 |
| 自动分页 | 否 | 是 |
| 表格 | 手工绘图 | HTML <table> |
| 页眉/页脚 | 手册 | HTML/CSS |
| 水印。 | 手册代码 | 内置 |
| 合并 PDF 文件 | 有限的 | 是 |
| 拆分 PDF 文件 | 有限的 | 是 |
| 数字签名 | 否 | 是 |
| PDF/A。 | 否 | 是 |
| 简单易用 | 缓和 | 高的 |
快速入门:ZetPDF 向IronPDF迁移。
迁移工作可以通过以下基本步骤立即开始。
步骤 1:替换 NuGet 软件包
移除 ZetPDF:
# Remove ZetPDF
dotnet remove package ZetPDF
# Remove ZetPDF
dotnet remove package ZetPDF
安装 IronPDF:
# Install IronPDF
dotnet add package IronPdf
# Install IronPDF
dotnet add package IronPdf
步骤 2:更新命名空间
用IronPDF命名空间替换ZetPDF命名空间:
// Before (ZetPDF)
using ZetPdf;
using ZetPdf.Drawing;
using ZetPdf.Fonts;
// After (IronPDF)
using IronPdf;
// Before (ZetPDF)
using ZetPdf;
using ZetPdf.Drawing;
using ZetPdf.Fonts;
// After (IronPDF)
using IronPdf;
Imports IronPdf
步骤 3:初始化许可证
在应用程序启动时添加许可证初始化:
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
代码迁移示例
将HTML转换为PDF
HTML 转 PDF 操作演示了这些 .NET PDF 库之间的 API 差异。
ZetPDF方法:
// 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
IronPDF 方法:
// 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
ZetPDF 使用 HtmlToPdfConverter 和 ConvertHtmlToPdf(),直接写入文件路径。IronPDF提供 ChromePdfRenderer 和 RenderHtmlAsPdf(),返回一个 PdfDocument 对象,让您在输出方面拥有更大的灵活性——您可以保存到文件、获取二进制数据或在保存之前执行其他操作。
有关 HTML 转 PDF 的高级应用场景,请参阅 HTML 转 PDF 指南。
将 URL 转换为 PDF
URL 到 PDF 的转换清楚地显示了模式差异。
ZetPDF方法:
// 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
IronPDF 方法:
// 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
ZetPDF 使用与 HtmlToPdfConverter 相同的 ConvertUrlToPdf() 类。IronPDF提供 RenderUrlAsPdf() on ChromePdfRenderer,它利用完整的 Chromium 渲染引擎来精确捕获网页,包括 JavaScript 执行和现代 CSS。
请浏览 URL to PDF 文档,了解身份验证和自定义页眉选项。
合并多个 PDF 文件
PDF 合并显示了文档处理方式上的重大 API 差异。
ZetPDF方法:
// 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
IronPDF 方法:
// 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
ZetPDF 使用专用的 PdfMerger 类,该类对带有 MergeFiles() 的文件路径进行操作。IronPDF使用 PdfDocument.FromFile() 将文档加载为 PdfDocument 对象,然后使用静态 PdfDocument.Merge() 方法将它们合并。 这种面向对象的方法可以在保存之前对合并后的文档进行其他操作。
探索 IronPDF合并文档,了解更多合并选项。
基于坐标的绘图与 HTML 的对比
对于使用基于坐标图形的现有ZetPDF代码的开发人员,迁移路径包括将绘图命令转换为 HTML/CSS。
基于坐标的ZetPDF方法:
using ZetPdf;
using ZetPdf.Drawing;
var document = new PdfDocument();
var page = document.AddPage();
page.Width = XUnit.FromMillimeter(210);
page.Height = XUnit.FromMillimeter(297);
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();
page.Width = XUnit.FromMillimeter(210);
page.Height = XUnit.FromMillimeter(297);
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()
page.Width = XUnit.FromMillimeter(210)
page.Height = XUnit.FromMillimeter(297)
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")
IronPDF HTML 方法:
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")
ZetPDF 方法需要创建字体对象、计算精确的像素位置并手动管理图形上下文。IronPDF的方法使用网络开发人员已经熟悉的标准 HTML 和 CSS--字体、颜色和布局都通过熟悉的 CSS 属性来处理。
ZetPDFAPI 到IronPDF映射参考
这种映射通过显示直接的 API 对应关系来加速迁移:
| ZetPDF | IronPDF |
|---|---|
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() |
HtmlToPdfConverter |
ChromePdfRenderer |
ConvertHtmlToPdf() |
RenderHtmlAsPdf() |
ConvertUrlToPdf() |
RenderUrlAsPdf() |
PdfMerger |
PdfDocument.Merge() |
常见迁移问题和解决方案
问题 1:基于坐标的布局
ZetPDF:所有内容都需要精确的 X、Y 坐标和手动定位。
解决方案: 使用HTML/CSS流程布局。 需要绝对定位时,请使用 CSS:
.positioned-element {
position: absolute;
top: 100px;
left: 50px;
}
问题 2:字体对象管理
ZetPDF:为每种字体变体创建 XFont 对象。
解决方案:使用 CSS 字体-family-字体自动处理:
<style>
body { font-family: Arial, sans-serif; }
h1 { font-family: 'Times New Roman', serif; font-size: 24px; font-weight: bold; }
</style>
<style>
body { font-family: Arial, sans-serif; }
h1 { font-family: 'Times New Roman', serif; font-size: 24px; font-weight: bold; }
</style>
问题 3:颜色处理
ZetPDF:使用 XBrushes 和着色对象。
解决方案:使用标准 CSS 颜色:
.header { color: navy; background-color: #f5f5f5; }
.warning { color: rgb(255, 0, 0); }
问题 4:手动分页
ZetPDF: 跟踪 Y 位置并在内容溢出时手动创建新页面。
解决方案:IronPDF可处理自动分页。 如需明确控制,请使用 CSS:
.section { page-break-after: always; }
.keep-together { page-break-inside: avoid; }
问题 5:表格创建
ZetPDF: 需要手动绘制矩形、线条和文本定位。
解决方案:使用标准的 HTML 表格和 CSS 样式:
<table style="border-collapse: collapse; width: 100%;">
<tr>
<th style="border: 1px solid black; padding: 8px;">Header</th>
</tr>
<tr>
<td style="border: 1px solid black; padding: 8px;">Data</td>
</tr>
</table>
<table style="border-collapse: collapse; width: 100%;">
<tr>
<th style="border: 1px solid black; padding: 8px;">Header</th>
</tr>
<tr>
<td style="border: 1px solid black; padding: 8px;">Data</td>
</tr>
</table>
ZetPDF迁移清单
迁移前任务
审核您的代码库,确定所有ZetPDF使用情况:
grep -r "using ZetPDF" --include="*.cs" .
grep -r "HtmlToPdfConverter\|PdfMerger\|XGraphics" --include="*.cs" .
grep -r "using ZetPDF" --include="*.cs" .
grep -r "HtmlToPdfConverter\|PdfMerger\|XGraphics" --include="*.cs" .
需要转换为 HTML 的基于坐标的绘图代码文档。 注意字体和颜色的使用模式。 将布局结构映射为 HTML 对应内容。
代码更新任务
1.删除ZetPDFNuGet 软件包 2.安装IronPDFNuGet 软件包
- 将命名空间导入从
ZetPDF更新为IronPdf - 将
HtmlToPdfConverter替换为ChromePdfRenderer - 将
ConvertHtmlToPdf()调用转换为RenderHtmlAsPdf()+SaveAs() - 将
ConvertUrlToPdf()调用转换为RenderUrlAsPdf()+SaveAs() - 将
PdfMerger.MergeFiles()替换为PdfDocument.Merge() - 将
DrawString()调用转换为 HTML 文本元素 - 将
XFont转换为 CSSfont-family - 将
XBrushes替换为 CSS 颜色 11.在启动时添加IronPDF许可证初始化功能
迁移后测试
迁移后,验证这些方面:
- 比较可视化输出,确保外观匹配或改进
- 通过 CSS 样式验证字体是否达到预期效果
- 测试自动分页是否正确分页
- 验证图片的位置和显示是否正确
- 测试 PDF 合并操作产生正确的输出
- 确认所有现有功能都能在新实施中使用
迁移到IronPDF的主要优势
从ZetPDF迁移到IronPDF有几个关键优势:
现代 Chromium 渲染引擎:IronPDF使用 Chromium 进行 HTML 到 PDF 的转换,确保完全支持 CSS3 和 ES2024 JavaScript。 正确呈现现代框架和响应式设计。
基于 HTML 的内容创建: Web 开发人员可以利用现有的 HTML 和 CSS 技能。 无需学习基于坐标的绘图 API 或管理字体对象。
自动布局和分页:文本换行、分页符和流式布局自动完成。 无需手动计算元素位置。
简化 API:常用操作只需调用一个方法即可完成。 PdfDocument.Merge() 替换了复杂的文件路径处理模式。
积极开发:随着 .NET 10 和 C# 14 的普及,IronPDF 将持续更新,确保与当前和未来的 .NET 版本兼容。
功能齐全:内置水印、数字签名、PDF/A 合规性以及ZetPDF所缺乏的高级 PDF 操作功能。

