跳至页脚内容
迁移指南

如何用 C# 从 ZetPDF 迁移到 IronPDF

从ZetPDF迁移到 IronPDF:完整的 C# 开发人员指南。

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

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

IronPDF与 ZetPDF:功能比较

了解架构差异有助于技术决策者评估迁移投资:

特征ZetPDFIronPDF
基于 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
SHELL

安装 IronPDF:

# Install IronPDF
dotnet add package IronPdf
# Install IronPDF
dotnet add package IronPdf
SHELL

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

步骤 3:初始化许可证

在应用程序启动时添加许可证初始化:

IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
$vbLabelText   $csharpLabel

代码迁移示例

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

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

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

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

ZetPDF 使用与<代码>ConvertUrlToPdf()</代码相同的<代码>HtmlToPdfConverter</代码类。IronPDF在<代码>ChromePdfRenderer</代码上提供了<代码>RenderUrlAsPdf()</代码功能,该功能利用完整的 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");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

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

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

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

ZetPDF 方法需要创建字体对象、计算精确的像素位置并手动管理图形上下文。 IronPdf 的方法使用网络开发人员已经熟悉的标准 HTML 和 CSS--字体、颜色和布局都通过熟悉的 CSS 属性来处理。

ZetPDFAPI 到IronPDF映射参考

这种映射通过显示直接的 API 对应关系来加速迁移:

ZetPDFIronPDF备注
<代码>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
<代码>HtmlToPdfConverter</代码<代码>ChromePdfRenderer</代码HTML 转换
<代码>ConvertHtmlToPdf()</代码<代码>RenderHtmlAsPdf()</代码HTML 字符串到 PDF
<代码>ConvertUrlToPdf()</代码<代码>RenderUrlAsPdf()</代码URL 至 PDF
<代码>PDFMerger</代码<代码>PdfDocument.Merge()</代码合并 PDF

常见迁移问题和解决方案

问题 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>
HTML

问题 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>
HTML

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" .
SHELL

需要转换为 HTML 的基于坐标的绘图代码文档。 注意字体和颜色的使用模式。 将布局结构映射为 HTML 对应内容。

代码更新任务

1.删除ZetPDFNuGet 软件包 2.安装 IronPdf NuGet 软件包 3.将名称空间导入从 ZetPDF 更新为 IronPdf 4.将<代码>HtmlToPdfConverter</代码替换为 ChromePdfRenderer 5.将<代码>ConvertHtmlToPdf()</代码调用转换为<代码>RenderHtmlAsPdf()</代码+ SaveAs() 6.将<代码>ConvertUrlToPdf()</代码调用转换为<代码>RenderUrlAsPdf()</代码+ SaveAs() 7.将 PdfMerger.MergeFiles() 替换为<代码>PdfDocument.Merge()</代码。 8.将 DrawString() 调用转换为 HTML 文本元素 9.将 XFont 转换为 CSS font-family 10.用 CSS 颜色替换 XBrushes 11.在启动时添加 IronPdf 许可证初始化功能

迁移后测试

迁移后,验证这些方面:

  • 比较可视化输出,确保外观匹配或改进
  • 通过 CSS 样式验证字体是否达到预期效果
  • 测试自动分页是否正确分页
  • 验证图片的位置和显示是否正确
  • 测试 PDF 合并操作产生正确的输出
  • 确认所有现有功能都能在新实施中使用

迁移到IronPDF的主要优势

从ZetPDF迁移到IronPDF有几个关键优势:

现代 Chromium 渲染引擎:IronPDF 使用 Chromium 进行 HTML 到 PDF 的转换,确保完全支持 CSS3 和 ES2024 JavaScript。 正确呈现现代框架和响应式设计。

基于 HTML 的内容创建:网络开发人员可以利用现有的 HTML 和 CSS 技能。 无需学习基于坐标的绘图 API 或管理字体对象。

自动布局和分页:自动进行文本换行、分页和流程布局。 无需手动计算元素位置。

简化的 API:常用操作的单一方法调用。<代码>PdfDocument.Merge()</代码取代了复杂的文件路径处理模式。

主动开发:随着 .NET 10 和 C# 14 在 2026 年之前的采用率不断提高,IronPDF 的定期更新可确保与当前和未来的 .NET 版本兼容。

全面的功能集:内置水印、数字签名、PDF/A 合规性以及ZetPDF缺乏的高级 PDF 操作功能。

结论

ZetPDF 通过其 PDFSharp 基础提供基本的 PDF 操作功能。 然而,其基于坐标的图形编程方法、有限的 HTML 支持以及现代功能的缺乏为文档生成任务带来了不必要的复杂性。

IronPDF 将 PDF 生成从图形编程练习转变为熟悉的HTML/CSS开发。 迁移路径简单明了:替换 NuGet 包,更新转换器类,利用 HTML 创建内容。

立即开始迁移,免费试用 IronPDF,体验基于 Chromium 的简单文档生成。

有关全面的实施指导,请浏览 IronPDF 文档教程

Curtis Chau
技术作家

Curtis Chau 拥有卡尔顿大学的计算机科学学士学位,专注于前端开发,精通 Node.js、TypeScript、JavaScript 和 React。他热衷于打造直观且美观的用户界面,喜欢使用现代框架并创建结构良好、视觉吸引力强的手册。

除了开发之外,Curtis 对物联网 (IoT) 有浓厚的兴趣,探索将硬件和软件集成的新方法。在空闲时间,他喜欢玩游戏和构建 Discord 机器人,将他对技术的热爱与创造力相结合。