IRONSOFTWAREHOME
视频

如何在C#中压缩PDF

Curtis Chau
Curtis Chau
Updated: 2026年7月19日

从Ghostscript迁移到IronPDF将您的.NET PDF工作流从命令行进程生成和基于字符串的开关操作移动到类型化、支持IntelliSense的原生.NET API。 本指南逐步演示了一个迁移路径,消除了AGPL-3.0许可风险和外部原生二进制依赖。

关于术语的一点说明:Ghostscript(由Artifex Software开发)采用双许可证制AGPL-3.0或商业许可证,而非普通GPL。 "GPL"标签是对开源版本的长期社区简写; 本指南中的所有内容均参考Ghostscript的AGPL-3.0构建和Ghostscript.NET包装(也是AGPL-3.0/商业双重许可)。 在.NET中,Ghostscript通常通过该包装使用,该包装通过P/Invoke调用本机gsdll32.dll / gswin32c / gswin64c

为什么要从Ghostscript迁移到IronPDF

Ghostscript的挑战

Ghostscript是来自Artifex Software的一个历经几十年历史的PostScript/PDF解释器。 其在现代.NET应用中的使用呈现了一些实际的挑战:

  1. **AGPL-3.0许可限制:**Ghostscript自身和Ghostscript.NET包装均根据AGPL-3.0或Artifex的商业许可进行双重许可。 AGPL的网络共版权条款通常要求您公布整个作品的对应源代码—包括SaaS / 网络使用—除非购买商业许可证。 这通常排除了AGPL版本用于闭源或托管.NET应用。

  2. **命令行接口:**Ghostscript基本上是一个命令行工具。 从C#使用它意味着启动进程、传递字符串参数并解析输出—可以通过Ghostscript.NET P/Invoke包装。

  3. **外部二进制依赖:**您必须单独安装Ghostscript,管理PATH变量,并保持跨环境的一致版本。 32位和64位需要不同的本机DLL(gsdll32.dll vs gsdll64.dll)。

  4. **无原生HTML转PDF:**Ghostscript无法直接将HTML转换为PDF。 您首先需要使用其他工具将HTML转换为PostScript,然后运行Ghostscript将PostScript转换为PDF—一个多步骤的管道,并有外部依赖。

  5. **复杂的开关语法:**操作通过类似-dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=...的命令行开关进行控制。 没有IntelliSense,没有编译时检查。

6.**错误处理:**错误以文本字符串的形式通过 stderr 输出,需要进行解析而不是结构化的异常处理。

  1. **进程管理开销:**每次操作都会生成一个独立的进程,增加超时和资源清理的复杂性和开销。

Ghostscript与IronPDF比较

方面GhostscriptIronPDF
许可证AGPL-3.0(网络共版权)或Artifex商业术语清晰的商业用语
集成命令行进程生成本地 .NET 库
应用程序接口设计基于字符串的开关类型化、支持 IntelliSense 的 API
错误处理解析 stderr 文本.NET 例外情况
HTML 转 PDF不支持(需要外部工具)内置 Chromium 引擎
依赖关系外部二进制安装自带 NuGet 包
部署配置 PATH,复制 DLL只需添加 NuGet 参考资料
线程安全仅限流程隔离线程安全设计
现代 .NETGhostscript.NET v1.3.x 以.NET Standard 2.0为目标.NET Framework 4.6.2+ and .NET 6/7/8/9
异步支持基于流程本地 async/await

迁移复杂性评估

按功能估算的工作量

特征迁移复杂性
将 PDF 转换为图像low
合并 PDFlow
压缩 PDFlow
PDF 优化low
加密语言
页面提取low
PostScript 转换为 PDF中高级
定制开关中高级

范式转换

本次Ghostscript迁移的根本转变是从命令行进程执行类型化.NET API调用:

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

开始之前

前提条件

  1. **.NET版本:**IronPDF支持.NET Framework 4.6.2+和.NET Core / .NET 5+(包括.NET 6/7/8/9)。 Ghostscript.NET v1.3.x 以.NET Standard 2.0为目标。 2.**许可证密钥:**从ironpdf.com获取您的IronPDF许可证密钥。 3.**备份:**创建一个用于迁移工作的分支

识别所有Ghostscript使用

# 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
SHELL

移除Ghostscript依赖

迁移后:

  • 从服务器卸载Ghostscript
  • 从部署中移除gsdll32.dll / gsdll64.dll
  • 删除Ghostscript的PATH配置
  • 移除任何GhostscriptVersionInfo引用

快速启动迁移

步骤 1:更新许可配置

之前(Ghostscript):

Ghostscript在AGPL-3.0下需要或根据AGPL条款披露源代码,或从Artifex获得商业许可证。

After (IronPDF):

// Set once at application startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";

步骤 2:更新名称空间导入

// Before (Ghostscript)
using Ghostscript.NET;
using Ghostscript.NET.Processor;
using Ghostscript.NET.Rasterizer;

// After (IronPDF)
using IronPdf;

完整的 API 参考

核心类映射

Ghostscript.NETIronPDF说明
GhostscriptProcessor各种PdfDocument方法PDF 处理
GhostscriptRasterizerPdfDocument.RasterizeToImageFiles()将 PDF 转换为图像
GhostscriptVersionInfo不适用(不需要)DLL 位置
GhostscriptStdIO不适用(使用例外)I/O 处理
流程 + 命令行ChromePdfRendererHTML 转 PDF

命令行开关映射

Ghostscript开关IronPDF 同等产品说明
-dNOPAUSE不适用(不需要)页面之间不要停顿
-dBATCH不适用(不需要)处理后退出
-dSAFER不适用(默认)安全文件访问
-sDEVICE=pdfwrite各种 PDF 方法输出 PDF
-sDEVICE=png16mRasterizeToImageFiles("*.png", DPI: N)PNG 输出
-sOutputFile=XSaveAs("X")输出文件名
-r300DPI: 300参数分辨率
-dPDFSETTINGS=/ebookCompressImages(quality: 60)中等质量
-dFirstPage=N -dLastPage=MCopyPages(new[] {N-1, ..., M-1})页面提取(0为起始)
-sOwnerPassword=XSecuritySettings.OwnerPassword所有者密码
-sUserPassword=XSecuritySettings.UserPassword用户密码

代码迁移示例

示例 1:HTML 到 PDF 的转换

之前(Ghostscript):

// NuGet: Install-Package Ghostscript.NET
using Ghostscript.NET;
using Ghostscript.NET.Processor;
using System.IO;
using System.Text;

class GhostscriptExample
{
    static void Main()
    {
        //Ghostscriptcannot directly convert HTML to PDF
        // You need to first convert HTML to PS/EPS using another tool
        // then useGhostscriptto 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 -Ghostscriptprimarily 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());
    }
}
C#

After (IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;

class IronPdfExample
{
    static void Main()
    {
        IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";

        var renderer = new ChromePdfRenderer();

        string htmlContent = "<html><body><h1>Hello World</h1></body></html>";

        var pdf = renderer.RenderHtmlAsPdf(htmlContent);
        pdf.SaveAs("output.pdf");
    }
}

Ghostscript无法直接将HTML转换为PDF—它只接受PostScript或PDF输入,因此HTML工作流需要中间转换(通常通过wkhtmltopdf或类似工具)。 IronPDF的ChromePdfRenderer提供直接的HTML到PDF渲染,支持CSS、JavaScript和现代Web标准,通过嵌入的Chromium引擎实现。查看HTML到PDF文档以获取更多渲染选项。

示例 2:将 PDF 转换为图像

之前(Ghostscript):

// 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();
            }
        }
    }
}

After (IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class IronPdfExample
{
    static void Main()
    {
        IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";

        var pdf = PdfDocument.FromFile("input.pdf");

        // One-shot: write every page as PNG matching Ghostscript's -r300 -sDEVICE=png16m
        pdf.RasterizeToImageFiles("output_page*.png", DPI: 300);
    }
}

Ghostscript的方法需要定位外部GhostscriptVersionInfo对象,并使用1为起始的页面编号迭代页面。 IronPDF的DPI:参数,没有外部本机依赖。 请注意,使用页面索引时,Ghostscript使用1为起始页面,而IronPDF使用0为起始页面(标准.NET惯例)。

示例 3:合并 PDF 文件

之前(Ghostscript):

// 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());
    }
}

After (IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;
using System.Collections.Generic;

class IronPdfExample
{
    static void Main()
    {
        IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";

        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");
    }
}

Ghostscript的方法需要完整的开关咒语(-dNOPAUSE, -dBATCH, -sDEVICE=pdfwrite)并将文件路径连接到一个字符串数组。 IronPDF的静态PdfDocument。 了解有关 合并和拆分 PDF 的更多信息。


关键迁移说明

页面索引转换

此迁移中最重要的区别之一是页面索引。 Ghostscript的开关如-dFirstPage=N / -dLastPage=M是1起始; IronPDF的CopyPages是0起始(标准.NET):

// Ghostscript: -dFirstPage=5 -dLastPage=8 (1-indexed, inclusive)

// IronPDF: 0-indexed page array
var extracted = pdf.CopyPages(new[] {4, 5, 6, 7});
extracted.SaveAs("pages_5_to_8.pdf");

AGPL-3.0许可证问题

Ghostscript和Ghostscript.NET包装均根据AGPL-3.0或Artifex的商业许可证进行双重许可。 AGPL-3.0的网络共版权条款通常要求发布整个作品的对应源代码—包括SaaS / 网络可访问的部署—除非拥有Artifex商业许可。 将PDF工作负载迁移到IronPDF会消除对迁移部分的义务; 如果您仅对PostScript接入保留Ghostscript,一份Artifex商业许可证即可涵盖该部分。 (This is a general summary, not legal advice — consult counsel for your specific deployment.)

无外部二进制文件

IronPDF作为NuGet包分发。 迁移后删除这些内容:

  • gsdll64.dll文件
  • 服务器上的Ghostscript安装
  • PATH 环境变量配置
  • 代码中的GhostscriptVersionInfo引用

PostScript 文件

IronPDF 不能直接处理 PostScript (.ps) 文件。 如果您的工作流程需要 PostScript 处理,可以选择 1.在IronPDF处理之前使用其他工具将 PostScript 转换为 PDF 2.将源内容转换为 HTML 并使用IronPDF的 HTML 渲染功能


性能考虑

无进程催生

调用gsdll64.dll)在每次操作中有进程和本机互操作的开销。 IronPDF运行在进程中作为托管.NET代码:

// Ghostscript: process or P/Invoke overhead per call
processor.Process(switches.ToArray());

// IronPDF: in-process method call
var merged = PdfDocument.Merge(pdfs);

线程安全

IronPDF支持从多个线程并发使用PdfDocument。 请参阅IronPDF文档以获取并行渲染模式指南。


迁移清单

迁移前

  • 盘点所有代码库中的Ghostscript使用
  • 记录当前使用的命令行开关
  • 识别任何 PostScript 处理(需要特殊处理)
  • 审查AGPL-3.0许可证合规状态
  • 获取IronPDF许可证密钥
  • 在版本控制系统中创建迁移分支

代码迁移

  • 移除Ghostscript.NET NuGet包:dotnet remove package Ghostscript.NET
  • 安装IronPDF NuGet包:dotnet add package IronPdf
  • 删除外部Ghostscript二进制依赖
  • 移除GhostscriptVersionInfo和DLL引用
  • GhostscriptProcessor.Process()转换为IronPDF方法
  • pdf.RasterizeToImageFiles()
  • 用 API 调用替换命令行开关
  • 将错误处理方式从解析标准错误输出 (stderr) 改为抛出异常 将以 1 为索引的页码转换为以 0 为索引的页码

测试

  • 测试 PDF 转图像转换
  • 测试 PDF 合并
  • 测试页面提取
  • 测试压缩质量
  • 测试密码保护
  • 验证输出质量是否符合预期
  • 性能基准关键路径

部署

  • 从服务器移除Ghostscript
  • 删除 PATH 配置
  • 从部署中移除gsdll*.dll文件
  • 验证应用程序在未安装Ghostscript情况下是否正常工作

后迁移

  • 取消Artifex商业许可证(如果曾持有且不再需要)
  • 更新文档
  • 培训团队使用IronPDFAPI
  • 监控生产过程,发现任何问题

请注意: Ghostscript是其相应所有者的注册商标。 本网站与Artifex Software无隶属关系,不受其认可或赞助。 所有产品名称、徽标和品牌均为各自所有者的财产。 比较仅供参考,反映撰写时公开可用的信息。
Curtis Chau
技术作家

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

...
阅读更多

相关文章

Key in blue circle

立即获取免费的 30 天试用版密钥

Your trial license will be sent to your email address

无任何限制。100% 解锁。无需信用卡。

bullet_checked无需信用卡或创建账户无任何限制。100% 解锁。无需信用卡。
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
预约您的免费现场演示
Booking Badge

深受全球数百万工程师信赖

Iron Software 的客户徽标
获取您的无义务咨询
填写下面的表格或通过sales@ironsoftware.com
您的资料将始终保密。
深受全球数百万工程师信赖
Iron Software 的客户徽标
立即获取您的免费30 天试用密钥
无需信用卡或创建账户