跳至页脚内容
迁移指南

如何用 C# 从 Ghostscript GPL 迁移到 IronPDF

从Ghostscript GPL迁移到 IronPDF:完整的 C# 迁移指南。

从Ghostscript GPL迁移到IronPDF可将您的 .NET PDF 工作流程从命令行进程启动和基于字符串的开关操作转变为类型安全、支持 IntelliSense 的本地 .NET API。 本指南为专业的 .NET 开发人员提供了一个全面的、循序渐进的迁移路径,消除了 AGPL许可证的顾虑和外部二进制依赖性。

为什么要从Ghostscript GPL迁移到 IronPDF.

Ghostscript GPL的挑战

Ghostscript GPL 是一款历史悠久的 PostScript/PDF 解释器,已有几十年的历史,但在现代 .NET 应用程序中使用它却面临着巨大的挑战:

1.AGPL 许可限制:Ghostscript GPL 的 AGPL 许可证要求您在发布使用该许可证的软件时必须发布源代码,除非您从 Artifex 购买了昂贵的商业许可证。 这种 "病毒式 "许可模式会给专有应用程序带来巨大的法律风险。

2.命令行界面:Ghostscript GPL 从根本上说是一个命令行工具。 从 C# 使用它需要启动进程、传递字符串参数和解析输出--这是一种脆弱且容易出错的方法。

3.外部二进制依赖性:您必须单独安装 Ghostscript GPL,管理 PATH 变量,并确保不同部署环境下的版本兼容性。 32 位与 64 位需要不同的动态链接库(gsdll32.dll vs gsdll64.dll)。

4.No Native HTML-to-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 GPLIronPDF
许可证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 映射
合并 PDFIronPdf 让翻译更简单
压缩 PDF内置选项
PDF 优化不同的方法
加密语言不同的 API
页面提取0-indexed 与 1-indexed
PostScript 转换为 PDF中高级先转换 PS → PDF
定制开关中高级研究同等功能

范式转换

这次Ghostscript GPL移植的根本转变是从 命令行流程执行类型化 .NET API 调用

Ghostscript GPL:  "将这些字符串开关传递给外部进程
IronPdf:          "在 .NET 对象上调用这些方法

开始之前

前提条件

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

完整的 API 参考

核心类映射

Ghostscript.NETIronPDF说明
<代码>GhostscriptProcessor</代码各种 PdfDocument 方法PDF 处理
<代码>GhostscriptRasterizer</代码<代码>PdfDocument.ToBitmap()</代码> / <代码>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());
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$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");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$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();
            }
        }
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$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");
        }
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$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());
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$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");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$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");
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

消除 AGPL 许可证方面的顾虑

Ghostscript GPL 的 AGPL 许可证具有 "病毒 "特性,要求在发布应用程序时公开源代码。IronPDF的商业许可证有明确的条款,没有此类要求。

无外部二进制文件

IronPdf 完全独立。 迁移后删除这些内容:

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

线程安全

IronPdf 采用线程安全设计。 多个线程可同时使用<代码>ChromePdfRenderer</代码和 PdfDocument 而无需考虑同步问题。


迁移清单

迁移前

  • [在代码库中清点所有Ghostscript GPL使用情况
  • [ ] 记录当前使用的命令行开关
  • [ ] 确定任何 PostScript 处理(需要特殊处理)
  • [ ] 审查 AGPL 许可证合规情况
  • [ ] 获取 IronPdf 许可证密钥
  • [ ] 在版本控制中创建迁移分支

代码迁移

  • [ ] 删除 Ghostscript.NET NuGet 软件包:<代码>dotnet 删除 Ghostscript.NET 软件包</代码
  • [ ] 安装 IronPdf NuGet 软件包:<代码>dotnet 添加软件包 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许可证(如果是商业许可证)
  • [ ] 更新文档
  • [ ] 对团队进行 IronPdf API 培训
  • [ ] 监控生产过程中的任何问题

结论

从Ghostscript GPL迁移到IronPDF可以消除 AGPL 许可问题,移除外部二进制依赖性,并用类型安全的 .NET API 调用取代脆弱的命令行字符串操作。 翻译的结果是代码更简洁、更易于维护,并能与现代 .NET 应用程序原生集成。

IronPDF 内置的 Chromium 引擎可提供Ghostscript GPL完全无法比拟的 HTML 转 PDF 功能,而独立的 NuGet 软件包可简化所有环境下的部署。 对于构建商业应用程序的团队来说,迁移可以消除 AGPL 合规性在法律上的复杂性。

探索完整的IronPdf文档教程API参考,加速您的Ghostscript GPL迁移。

Curtis Chau
技术作家

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

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