迁移指南 如何用 C# 从 Ghostscript GPL 迁移到 IronPDF Curtis Chau 已发布:2026年1月25日 下载 IronPDF NuGet 下载 DLL 下载 Windows 安装程序 免费试用 法学硕士副本 法学硕士副本 将页面复制为 Markdown 格式,用于 LLMs 在 ChatGPT 中打开 向 ChatGPT 咨询此页面 在双子座打开 向 Gemini 询问此页面 在 Grok 中打开 向 Grok 询问此页面 打开困惑 向 Perplexity 询问有关此页面的信息 分享 在 Facebook 上分享 分享到 X(Twitter) 在 LinkedIn 上分享 复制链接 电子邮件文章 从Ghostscript GPL迁移到IronPDF可将您的 .NET PDF 工作流程从命令行进程启动和基于字符串的开关操作转变为类型安全、支持 IntelliSense 的本地 .NET API。 本指南为专业的 .NET 开发人员提供了一个全面的、循序渐进的迁移路径,消除了 AGPL许可证的顾虑和外部二进制依赖性。 为什么要从Ghostscript GPL迁移到 IronPDF. Ghostscript GPL的挑战 Ghostscript GPL 是一款历史悠久的 PostScript/PDF 解释器,已有几十年的历史,但在现代 .NET 应用程序中使用它却面临着巨大的挑战: AGPL 许可限制:Ghostscript GPL的 AGPL 许可要求,如果您分发使用该许可的软件,则必须发布您的源代码——除非您从 Artifex 购买昂贵的商业许可。 这种 "病毒式 "许可模式会给专有应用程序带来巨大的法律风险。 2.命令行界面:Ghostscript GPL本质上是一个命令行工具。 从 C# 使用它需要启动进程、传递字符串参数和解析输出--这是一种脆弱且容易出错的方法。 3.外部二进制依赖项:您必须单独安装 Ghostscript GPL,管理 PATH 变量,并确保跨部署环境的版本兼容性。 32 位与 64 位需要不同的动态链接库(gsdll32.dll vs gsdll64.dll)。 4.不支持原生 HTML 转 PDF:Ghostscript GPL无法直接将 HTML 转换为 PDF。 您需要先使用其他工具将 HTML 转换为 PostScript,然后使用Ghostscript GPL将 PostScript 转换为 PDF--这是一个多步骤的流程,需要外部依赖。 5.复杂的开关语法:操作通过晦涩难懂的命令行开关进行控制,例如-dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=... 。 没有 IntelliSense,没有类型安全,容易打错。 6.错误处理:错误以文本字符串的形式通过 stderr 输出,需要进行解析而不是结构化的异常处理。 7.进程管理开销:每个操作都会生成一个单独的进程,这增加了错误处理、超时和资源清理的开销和复杂性。 Ghostscript GPL与IronPDF对比 方面 Ghostscript GPL IronPDF 许可证 AGPL(病毒)或昂贵的商业 术语清晰的商业用语 集成 命令行进程生成 本地 .NET 库 应用程序接口设计 基于字符串的开关 类型化、支持 IntelliSense 的 API 错误处理 解析 stderr 文本 .NET 例外情况 HTML 转 PDF 不支持(需要外部工具) 内置 Chromium 引擎 依赖关系 外部二进制安装 自带 NuGet 包 部署 配置 PATH,复制 DLL 只需添加 NuGet 参考资料 线程安全 仅限流程隔离 线程安全设计 现代 .NET 有限支持 完全支持 .NET 6/7/8/9/10 异步支持 基于流程 本地 async/await 对于计划在 2025 年和 2026 年之前采用 .NET 10 和 C# 14 的团队来说,IronPDF 提供了一个面向未来的基础,可与现代 .NET 模式原生集成。 迁移复杂性评估 按功能估算的工作量 特征 迁移复杂性 备注 将 PDF 转换为图像 低 直接 API 映射 合并 PDF 低 IronPdf 让翻译更简单 压缩 PDF 低 内置选项 PDF 优化 低 不同的方法 加密 语言 不同的 API 页面提取 低 0-indexed 与 1-indexed PostScript 转换为 PDF 中高级 先转换 PS → PDF 定制开关 中高级 研究同等功能 范式转换 Ghostscript GPL 迁移的根本转变在于从命令行进程执行转变为类型化的 .NET API 调用: Ghostscript GPL: "将这些字符串开关传递给外部进程 IronPdf: "在 .NET 对象上调用这些方法 开始之前 前提条件 .NET 版本:IronPDF支持 .NET Framework 4.6.2+ 和 .NET Core 2.0+ / .NET 5/6/7/8/9+ 2.许可证密钥:从ironpdf.com获取您的IronPDF许可证密钥。 3.备份:创建一个用于迁移工作的分支 识别所有Ghostscript GPL使用情况 # Find all Ghostscript.NET references grep -r "Ghostscript\.NET\|GhostscriptProcessor\|GhostscriptRasterizer\|gsdll" --include="*.cs" . # Find direct process calls to Ghostscript grep -r "gswin64c\|gswin32c\|gs\|ProcessStartInfo.*ghost" --include="*.cs" . # Find package references grep -r "Ghostscript" --include="*.csproj" . # Find all Ghostscript.NET references grep -r "Ghostscript\.NET\|GhostscriptProcessor\|GhostscriptRasterizer\|gsdll" --include="*.cs" . # Find direct process calls to Ghostscript grep -r "gswin64c\|gswin32c\|gs\|ProcessStartInfo.*ghost" --include="*.cs" . # Find package references grep -r "Ghostscript" --include="*.csproj" . SHELL NuGet 软件包变更 # Remove Ghostscript.NET dotnet remove package Ghostscript.NET # Install IronPDF dotnet add package IronPdf # Remove Ghostscript.NET dotnet remove package Ghostscript.NET # Install IronPDF dotnet add package IronPdf SHELL 移除Ghostscript GPL依赖关系 迁移后: 从服务器卸载 Ghostscript GPL 从部署中移除 gsdll32.dll / gsdll64.dll 移除Ghostscript GPL的 PATH 配置 删除任何GhostscriptVersionInfo引用 快速启动迁移 步骤 1:更新许可配置 之前(Ghostscript GPL): AGPL 下的Ghostscript GPL要求公开源代码或从 Artifex 购买昂贵的商业许可证。 After (IronPDF): // Set once at application startup IronPdf.License.LicenseKey = "YOUR-IRONPDF-LICENSE-KEY"; // Set once at application startup IronPdf.License.LicenseKey = "YOUR-IRONPDF-LICENSE-KEY"; $vbLabelText $csharpLabel 步骤 2:更新名称空间导入 // Before (Ghostscript GPL) using Ghostscript.NET; using Ghostscript.NET.Processor; using Ghostscript.NET.Rasterizer; // After (IronPDF) using IronPdf; // Before (Ghostscript GPL) using Ghostscript.NET; using Ghostscript.NET.Processor; using Ghostscript.NET.Rasterizer; // After (IronPDF) using IronPdf; $vbLabelText $csharpLabel 完整的 API 参考 核心类映射 Ghostscript.NET IronPDF 说明 GhostscriptProcessor 各种 PdfDocument 方法 PDF 处理 GhostscriptRasterizer PdfDocument.ToBitmap()</code> / <code>RasterizeToImageFiles() 将 PDF 转换为图像 GhostscriptVersionInfo 不适用(不需要) DLL 位置 GhostscriptStdIO 不适用(使用例外) I/O 处理 流程 + 命令行 ChromePdfRenderer HTML 转 PDF 命令行开关映射 Ghostscript GPL 开关 IronPdf 同等产品 说明 -dNOPAUSE 不适用(不需要) 页面之间不要停顿 -dBATCH 不适用(不需要) 处理后退出 -dSAFER 不适用(默认) 安全文件访问 -sDEVICE=pdfwrite 各种 PDF 方法 输出 PDF -sDEVICE=png16m ToBitmap() 或 RasterizeToImageFiles() PNG 输出 -sOutputFile=X SaveAs("X") 输出文件名 -r300 方法中的 DPI 参数 分辨率 -dPDFSETTINGS=/ebook CompressImages(质量:75) 中等质量 -sOwnerPassword=X SecuritySettings.OwnerPassword 所有者密码 -sUserPassword=X SecuritySettings.UserPassword 用户密码 代码迁移示例 示例 1:HTML 到 PDF 的转换 之前(Ghostscript GPL): // NuGet: Install-Package Ghostscript.NET using Ghostscript.NET; using Ghostscript.NET.Processor; using System.IO; using System.Text; class GhostscriptExample { static void Main() { // Ghostscript cannot directly convert HTML to PDF // You need to first convert HTML to PS/EPS using another tool // then use Ghostscript to convert PS to PDF string htmlContent = "<html><body><h1>Hello World</h1></body></html>"; string psFile = "temp.ps"; string outputPdf = "output.pdf"; // This is a workaround - Ghostscript primarily works with PostScript GhostscriptProcessor processor = new GhostscriptProcessor(); List<string> switches = new List<string> { "-dNOPAUSE", "-dBATCH", "-dSAFER", "-sDEVICE=pdfwrite", $"-sOutputFile={outputPdf}", psFile }; processor.Process(switches.ToArray()); } } // NuGet: Install-Package Ghostscript.NET using Ghostscript.NET; using Ghostscript.NET.Processor; using System.IO; using System.Text; class GhostscriptExample { static void Main() { // Ghostscript cannot directly convert HTML to PDF // You need to first convert HTML to PS/EPS using another tool // then use Ghostscript to convert PS to PDF string htmlContent = "<html><body><h1>Hello World</h1></body></html>"; string psFile = "temp.ps"; string outputPdf = "output.pdf"; // This is a workaround - Ghostscript primarily works with PostScript GhostscriptProcessor processor = new GhostscriptProcessor(); List<string> switches = new List<string> { "-dNOPAUSE", "-dBATCH", "-dSAFER", "-sDEVICE=pdfwrite", $"-sOutputFile={outputPdf}", psFile }; processor.Process(switches.ToArray()); } } $vbLabelText $csharpLabel After (IronPDF): // NuGet: Install-Package IronPdf using IronPdf; class IronPdfExample { static void Main() { var renderer = new ChromePdfRenderer(); string htmlContent = "<html><body><h1>Hello World</h1></body></html>"; var pdf = renderer.RenderHtmlAsPdf(htmlContent); pdf.SaveAs("output.pdf"); } } // NuGet: Install-Package IronPdf using IronPdf; class IronPdfExample { static void Main() { var renderer = new ChromePdfRenderer(); string htmlContent = "<html><body><h1>Hello World</h1></body></html>"; var pdf = renderer.RenderHtmlAsPdf(htmlContent); pdf.SaveAs("output.pdf"); } } $vbLabelText $csharpLabel Ghostscript GPL 根本无法直接将 HTML 转换为 PDF,需要使用外部工具进行 PostScript 转换。IronPDF的ChromePdfRenderer`提供 HTML 到 PDF 的直接转换,并完全支持 CSS3、JavaScript 和现代 Web 标准。 请参阅 HTML to PDF 文档,了解更多渲染选项。 示例 2:将 PDF 转换为图像 之前(Ghostscript GPL): // NuGet: Install-Package Ghostscript.NET using Ghostscript.NET; using Ghostscript.NET.Rasterizer; using System.Drawing; using System.Drawing.Imaging; using System.IO; class GhostscriptExample { static void Main() { string inputPdf = "input.pdf"; string outputPath = "output"; GhostscriptVersionInfo gvi = new GhostscriptVersionInfo("gsdll64.dll"); using (GhostscriptRasterizer rasterizer = new GhostscriptRasterizer()) { rasterizer.Open(inputPdf, gvi, false); for (int pageNumber = 1; pageNumber <= rasterizer.PageCount; pageNumber++) { Image img = rasterizer.GetPage(300, pageNumber); img.Save($"{outputPath}_page{pageNumber}.png", ImageFormat.Png); img.Dispose(); } } } } // NuGet: Install-Package Ghostscript.NET using Ghostscript.NET; using Ghostscript.NET.Rasterizer; using System.Drawing; using System.Drawing.Imaging; using System.IO; class GhostscriptExample { static void Main() { string inputPdf = "input.pdf"; string outputPath = "output"; GhostscriptVersionInfo gvi = new GhostscriptVersionInfo("gsdll64.dll"); using (GhostscriptRasterizer rasterizer = new GhostscriptRasterizer()) { rasterizer.Open(inputPdf, gvi, false); for (int pageNumber = 1; pageNumber <= rasterizer.PageCount; pageNumber++) { Image img = rasterizer.GetPage(300, pageNumber); img.Save($"{outputPath}_page{pageNumber}.png", ImageFormat.Png); img.Dispose(); } } } } $vbLabelText $csharpLabel After (IronPDF): // NuGet: Install-Package IronPdf using IronPdf; using System; class IronPdfExample { static void Main() { var pdf = PdfDocument.FromFile("input.pdf"); var images = pdf.ToBitmap(); for (int i = 0; i < images.Length; i++) { images[i].Save($"output_page{i + 1}.png"); } } } // NuGet: Install-Package IronPdf using IronPdf; using System; class IronPdfExample { static void Main() { var pdf = PdfDocument.FromFile("input.pdf"); var images = pdf.ToBitmap(); for (int i = 0; i < images.Length; i++) { images[i].Save($"output_page{i + 1}.png"); } } } $vbLabelText $csharpLabel Ghostscript GPL 方法要求找到外部 gsdll64.dll 文件,创建GhostscriptVersionInfo对象,并使用 1 索引页码。 IronPdf 的 ToBitmap() 方法提供了一种简洁的单行方法,没有任何外部依赖性。 注意页面索引的不同:Ghostscript GPL 使用 1 索引页面,而IronPDF使用 0 索引(标准 .NET 约定)。 示例 3:合并 PDF 文件 之前(Ghostscript GPL): // NuGet: Install-Package Ghostscript.NET using Ghostscript.NET; using Ghostscript.NET.Processor; using System.Collections.Generic; class GhostscriptExample { static void Main() { string outputPdf = "merged.pdf"; string[] inputFiles = { "file1.pdf", "file2.pdf", "file3.pdf" }; GhostscriptProcessor processor = new GhostscriptProcessor(); List<string> switches = new List<string> { "-dNOPAUSE", "-dBATCH", "-dSAFER", "-sDEVICE=pdfwrite", $"-sOutputFile={outputPdf}" }; switches.AddRange(inputFiles); processor.Process(switches.ToArray()); } } // NuGet: Install-Package Ghostscript.NET using Ghostscript.NET; using Ghostscript.NET.Processor; using System.Collections.Generic; class GhostscriptExample { static void Main() { string outputPdf = "merged.pdf"; string[] inputFiles = { "file1.pdf", "file2.pdf", "file3.pdf" }; GhostscriptProcessor processor = new GhostscriptProcessor(); List<string> switches = new List<string> { "-dNOPAUSE", "-dBATCH", "-dSAFER", "-sDEVICE=pdfwrite", $"-sOutputFile={outputPdf}" }; switches.AddRange(inputFiles); processor.Process(switches.ToArray()); } } $vbLabelText $csharpLabel After (IronPDF): // NuGet: Install-Package IronPdf using IronPdf; using System.Collections.Generic; class IronPdfExample { static void Main() { var pdfs = new List<PdfDocument> { PdfDocument.FromFile("file1.pdf"), PdfDocument.FromFile("file2.pdf"), PdfDocument.FromFile("file3.pdf") }; var merged = PdfDocument.Merge(pdfs); merged.SaveAs("merged.pdf"); } } // NuGet: Install-Package IronPdf using IronPdf; using System.Collections.Generic; class IronPdfExample { static void Main() { var pdfs = new List<PdfDocument> { PdfDocument.FromFile("file1.pdf"), PdfDocument.FromFile("file2.pdf"), PdfDocument.FromFile("file3.pdf") }; var merged = PdfDocument.Merge(pdfs); merged.SaveAs("merged.pdf"); } } $vbLabelText $csharpLabel Ghostscript GPL 方法要求记住开关语法(-dNOPAUSE、-dBATCH、-sDEVICE=pdfwrite)并将文件路径连接到字符串数组中。IronPDF的静态 Merge 方法提供了类型安全、IntelliSense 支持的合并功能,可合并适当的 PdfDocument 对象。 了解有关 合并和拆分 PDF 的更多信息。 关键迁移说明 页面索引转换 此次Ghostscript GPL迁移中最重要的变化之一是页面索引的不同: // Ghostscript GPL: 1-indexed pages for (int pageNumber = 1; pageNumber <= rasterizer.PageCount; pageNumber++) { Image img = rasterizer.GetPage(300, pageNumber); } // IronPDF: 0-indexed pages (standard .NET) for (int i = 0; i < images.Length; i++) { images[i].Save($"output_page{i + 1}.png"); } // Ghostscript GPL: 1-indexed pages for (int pageNumber = 1; pageNumber <= rasterizer.PageCount; pageNumber++) { Image img = rasterizer.GetPage(300, pageNumber); } // IronPDF: 0-indexed pages (standard .NET) for (int i = 0; i < images.Length; i++) { images[i].Save($"output_page{i + 1}.png"); } $vbLabelText $csharpLabel 消除 AGPL 许可证方面的顾虑 Ghostscript GPL 的 AGPL 许可证具有 "病毒 "特性,要求在发布应用程序时公开源代码。IronPDF的商业许可证有明确的条款,没有此类要求。 无外部二进制文件 IronPdf 完全独立。 迁移后删除这些内容: gsdll32.dll 和 gsdll64.dll 文件 从服务器安装 Ghostscript GPL PATH 环境变量配置 代码中的GhostscriptVersionInfo引用 PostScript 文件 IronPDF 不能直接处理 PostScript (.ps) 文件。 如果您的工作流程需要 PostScript 处理,可以选择 1.在IronPDF处理之前使用其他工具将 PostScript 转换为 PDF 2.将源内容转换为 HTML 并使用 IronPdf 的 HTML 渲染功能 性能考虑 无进程催生 Ghostscript GPL 操作会产生外部进程,并带来相关开销。IronPDF可在您的 .NET 流程中运行: // Ghostscript GPL: Process spawning overhead processor.Process(switches.ToArray()); // Creates new OS process // IronPDF: In-process execution var merged = PdfDocument.Merge(pdfs); // Native .NET method call // Ghostscript GPL: Process spawning overhead processor.Process(switches.ToArray()); // Creates new OS process // IronPDF: In-process execution var merged = PdfDocument.Merge(pdfs); // Native .NET method call $vbLabelText $csharpLabel 线程安全 IronPdf 采用线程安全设计。 多个线程可同时使用ChromePdfRenderer和 PdfDocument 而无需考虑同步问题。 迁移清单 迁移前 清点代码库中所有Ghostscript GPL的使用情况 记录当前使用的命令行开关 识别任何 PostScript 处理(需要特殊处理) 审查 AGPL 许可合规性 获取IronPDF许可证密钥 在版本控制系统中创建迁移分支 代码迁移 删除 Ghostscript.NET NuGet 包: dotnet remove package Ghostscript.NET 安装 IronPdf NuGet 包: dotnet add package IronPdf 移除外部Ghostscript GPL二进制依赖项 删除GhostscriptVersionInfo和 DLL 引用 将GhostscriptProcessor.Process()转换为IronPDF方法 将GhostscriptRasterizer转换为pdf.ToBitmap() 用 API 调用替换命令行开关 将错误处理方式从解析标准错误输出 (stderr) 改为抛出异常 将以 1 为索引的页码转换为以 0 为索引的页码 测试 测试 PDF 转图像转换 测试 PDF 合并 测试页面提取 测试压缩质量 测试密码保护 验证输出质量是否符合预期 性能基准关键路径 部署 从服务器中移除 Ghostscript GPL 删除 PATH 配置 从部署中移除gsdll*.dll文件 验证应用程序在未安装Ghostscript GPL的情况下是否能正常工作 后迁移 移除Ghostscript GPL许可证(如果是商业用途) 更新文档 培训团队使用IronPDFAPI 监控生产过程,发现任何问题 Curtis Chau 立即与工程团队聊天 技术作家 Curtis Chau 拥有卡尔顿大学的计算机科学学士学位,专注于前端开发,精通 Node.js、TypeScript、JavaScript 和 React。他热衷于打造直观且美观的用户界面,喜欢使用现代框架并创建结构良好、视觉吸引力强的手册。除了开发之外,Curtis 对物联网 (IoT) 有浓厚的兴趣,探索将硬件和软件集成的新方法。在空闲时间,他喜欢玩游戏和构建 Discord 机器人,将他对技术的热爱与创造力相结合。 相关文章 已发布2026年2月1日 如何用 C# 从 ZetPDF 迁移到 IronPDF 通过这本完整的 C# 指南,掌握从 ZetPDF 到 IronPDF 的迁移。从基于坐标的库转换到现代的 HTML 到 PDF 解决方案。包括 HTML 转换、合并 PDF 和移除 PDFSharp 依赖性的代码示例。 阅读更多 已发布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 渲染。包括替换图形基元和自动布局的代码示例。 阅读更多 如何用 C# 从 Gnostice PDFOne 迁移到 IronPDF如何用 C# 从 GemBox PDF 迁移...
已发布2026年2月1日 如何用 C# 从 ZetPDF 迁移到 IronPDF 通过这本完整的 C# 指南,掌握从 ZetPDF 到 IronPDF 的迁移。从基于坐标的库转换到现代的 HTML 到 PDF 解决方案。包括 HTML 转换、合并 PDF 和移除 PDFSharp 依赖性的代码示例。 阅读更多
已发布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 渲染。包括替换图形基元和自动布局的代码示例。 阅读更多