迁移指南 如何用 C# 从 ZetPDF 迁移到 IronPDF Curtis Chau 已发布:2026年2月1日 下载 IronPDF NuGet 下载 DLL 下载 Windows 安装程序 免费试用 法学硕士副本 法学硕士副本 将页面复制为 Markdown 格式,用于 LLMs 在 ChatGPT 中打开 向 ChatGPT 咨询此页面 在双子座打开 向 Gemini 询问此页面 在 Grok 中打开 向 Grok 询问此页面 打开困惑 向 Perplexity 询问有关此页面的信息 分享 在 Facebook 上分享 分享到 X(Twitter) 在 LinkedIn 上分享 复制链接 电子邮件文章 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 $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); $vbLabelText $csharpLabel 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 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; $vbLabelText $csharpLabel 步骤 3:初始化许可证 在应用程序启动时添加许可证初始化: 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"); } } $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"); } } $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"); } } $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"); } } $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"); } } $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"); } } $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"); $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"); $vbLabelText $csharpLabel ZetPDF 方法需要创建字体对象、计算精确的像素位置并手动管理图形上下文。 IronPdf 的方法使用网络开发人员已经熟悉的标准 HTML 和 CSS--字体、颜色和布局都通过熟悉的 CSS 属性来处理。 ZetPDFAPI 到IronPDF映射参考 这种映射通过显示直接的 API 对应关系来加速迁移: ZetPDF IronPDF 备注 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 + div HTML 框 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转换为 CSSfont-family 10.用 CSS 颜色替换XBrushes` 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 操作功能。 Curtis Chau 立即与工程团队聊天 技术作家 Curtis Chau 拥有卡尔顿大学的计算机科学学士学位,专注于前端开发,精通 Node.js、TypeScript、JavaScript 和 React。他热衷于打造直观且美观的用户界面,喜欢使用现代框架并创建结构良好、视觉吸引力强的手册。除了开发之外,Curtis 对物联网 (IoT) 有浓厚的兴趣,探索将硬件和软件集成的新方法。在空闲时间,他喜欢玩游戏和构建 Discord 机器人,将他对技术的热爱与创造力相结合。 相关文章 已发布2026年2月1日 如何用 C# 从 Scryber.Core 迁移到 IronPDF 通过这本完整的 C# 指南,掌握从 Scryber.Core 迁移到 IronPDF 的方法。从自定义 XML/HTML 解析转换到现代 Chromium 渲染器。包括 HTML 转换、URL 呈现和替换专有绑定的代码示例。 阅读更多 已发布2026年2月1日 如何用 C# 从 XFINIUM.PDF 迁移到 IronPDF 通过这本完整的 C# 指南,掌握从 XFINIUM.PDF 到 IronPDF 的迁移。从基于坐标的手动定位切换到声明式 HTML/CSS 渲染。包括替换图形基元和自动布局的代码示例。 阅读更多 已发布2026年2月1日 如何用 C# 从 PdfPig 迁移到 IronPDF 通过这本完整的 C# 指南,掌握从 PdfPig 迁移到 IronPDF 的方法。从纯粹的阅读库转换为全面的 PDF 解决方案。包括文本提取、HTML 转换和元数据访问的代码示例。 阅读更多 如何用 C# 从 XFINIUM.PDF 迁移...
已发布2026年2月1日 如何用 C# 从 Scryber.Core 迁移到 IronPDF 通过这本完整的 C# 指南,掌握从 Scryber.Core 迁移到 IronPDF 的方法。从自定义 XML/HTML 解析转换到现代 Chromium 渲染器。包括 HTML 转换、URL 呈现和替换专有绑定的代码示例。 阅读更多
已发布2026年2月1日 如何用 C# 从 XFINIUM.PDF 迁移到 IronPDF 通过这本完整的 C# 指南,掌握从 XFINIUM.PDF 到 IronPDF 的迁移。从基于坐标的手动定位切换到声明式 HTML/CSS 渲染。包括替换图形基元和自动布局的代码示例。 阅读更多
已发布2026年2月1日 如何用 C# 从 PdfPig 迁移到 IronPDF 通过这本完整的 C# 指南,掌握从 PdfPig 迁移到 IronPDF 的方法。从纯粹的阅读库转换为全面的 PDF 解决方案。包括文本提取、HTML 转换和元数据访问的代码示例。 阅读更多