如何用 C# 从 Ghostscript GPL 迁移到 IronPDF
从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应用中的使用呈现了一些实际的挑战:
-
AGPL-3.0许可限制:Ghostscript自身和
Ghostscript.NET包装均根据AGPL-3.0或Artifex的商业许可进行双重许可。 AGPL的网络共版权条款通常要求您公布整个作品的对应源代码—包括SaaS / 网络使用—除非购买商业许可证。 这通常排除了AGPL版本用于闭源或托管.NET应用。 -
命令行接口:Ghostscript基本上是一个命令行工具。 从C#使用它意味着启动进程、传递字符串参数并解析输出—可以通过
Ghostscript.NETP/Invoke包装。 -
外部二进制依赖:您必须单独安装Ghostscript,管理PATH变量,并保持跨环境的一致版本。 32位和64位需要不同的本机DLL(
gsdll32.dllvsgsdll64.dll)。 -
无原生HTML转PDF:Ghostscript无法直接将HTML转换为PDF。 您首先需要使用其他工具将HTML转换为PostScript,然后运行Ghostscript将PostScript转换为PDF—一个多步骤的管道,并有外部依赖。
- 复杂的开关语法:操作通过类似
-dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=...的命令行开关进行控制。 没有IntelliSense,没有编译时检查。
6.错误处理:错误以文本字符串的形式通过 stderr 输出,需要进行解析而不是结构化的异常处理。
- 进程管理开销:每次操作都会生成一个独立的进程,增加超时和资源清理的复杂性和开销。
Ghostscript与IronPDF比较
| 方面 | Ghostscript | IronPDF |
|---|---|---|
| 许可证 | AGPL-3.0(网络共版权)或Artifex商业 | 术语清晰的商业用语 |
| 集成 | 命令行进程生成 | 本地 .NET 库 |
| 应用程序接口设计 | 基于字符串的开关 | 类型化、支持 IntelliSense 的 API |
| 错误处理 | 解析 stderr 文本 | .NET 例外情况 |
| HTML 转 PDF | 不支持(需要外部工具) | 内置 Chromium 引擎 |
| 依赖关系 | 外部二进制安装 | 自带 NuGet 包 |
| 部署 | 配置 PATH,复制 DLL | 只需添加 NuGet 参考资料 |
| 线程安全 | 仅限流程隔离 | 线程安全设计 |
| 现代 .NET | Ghostscript.NET v1.3.x 以.NET Standard 2.0为目标 |
.NET Framework 4.6.2+ and .NET 6/7/8/9 |
| 异步支持 | 基于流程 | 本地 async/await |
迁移复杂性评估
按功能估算的工作量
| 特征 | 迁移复杂性 |
|---|---|
| 将 PDF 转换为图像 | low |
| 合并 PDF | low |
| 压缩 PDF | low |
| PDF 优化 | low |
| 加密 | 语言 |
| 页面提取 | low |
| PostScript 转换为 PDF | 中高级 |
| 定制开关 | 中高级 |
范式转换
本次Ghostscript迁移的根本转变是从命令行进程执行到类型化.NET API调用:
Ghostscript:"将这些字符串开关传递给外部进程"
IronPDF:"调用这些.NET对象上的方法"
开始之前
前提条件
- .NET版本:IronPDF支持.NET Framework 4.6.2+和.NET Core / .NET 5+(包括.NET 6/7/8/9)。
Ghostscript.NETv1.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" .
# 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" .
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
移除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";
// 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;
// Before (Ghostscript)
using Ghostscript.NET;
using Ghostscript.NET.Processor;
using Ghostscript.NET.Rasterizer;
// After (IronPDF)
using IronPdf;
Imports Ghostscript.NET
Imports Ghostscript.NET.Processor
Imports Ghostscript.NET.Rasterizer
' After (IronPDF)
Imports IronPdf
完整的 API 参考
核心类映射
| Ghostscript.NET | IronPDF | 说明 |
|---|---|---|
GhostscriptProcessor |
各种PdfDocument方法 |
PDF 处理 |
GhostscriptRasterizer |
PdfDocument.RasterizeToImageFiles() |
将 PDF 转换为图像 |
GhostscriptVersionInfo |
不适用(不需要) | DLL 位置 |
GhostscriptStdIO |
不适用(使用例外) | I/O 处理 |
| 流程 + 命令行 | ChromePdfRenderer |
HTML 转 PDF |
命令行开关映射
| Ghostscript开关 | IronPDF 同等产品 | 说明 |
|---|---|---|
-dNOPAUSE |
不适用(不需要) | 页面之间不要停顿 |
-dBATCH |
不适用(不需要) | 处理后退出 |
-dSAFER |
不适用(默认) | 安全文件访问 |
-sDEVICE=pdfwrite |
各种 PDF 方法 | 输出 PDF |
-sDEVICE=png16m |
RasterizeToImageFiles("*.png", DPI: N) |
PNG 输出 |
-sOutputFile=X |
SaveAs("X") |
输出文件名 |
-r300 |
DPI: 300参数 |
分辨率 |
-dPDFSETTINGS=/ebook |
CompressImages(quality: 60) |
中等质量 |
-dFirstPage=N -dLastPage=M |
CopyPages(new[] {N-1, ..., M-1}) |
页面提取(0为起始) |
-sOwnerPassword=X |
SecuritySettings.OwnerPassword |
所有者密码 |
-sUserPassword=X |
SecuritySettings.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());
}
}
// 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());
}
}
Imports Ghostscript.NET
Imports Ghostscript.NET.Processor
Imports System.IO
Imports System.Text
Class GhostscriptExample
Shared Sub 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
Dim htmlContent As String = "<html><body><h1>Hello World</h1></body></html>"
Dim psFile As String = "temp.ps"
Dim outputPdf As String = "output.pdf"
' This is a workaround - Ghostscript primarily works with PostScript
Dim processor As New GhostscriptProcessor()
Dim switches As New List(Of String) From {
"-dNOPAUSE",
"-dBATCH",
"-dSAFER",
"-sDEVICE=pdfwrite",
$"-sOutputFile={outputPdf}",
psFile
}
processor.Process(switches.ToArray())
End Sub
End Class
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");
}
}
// 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");
}
}
Imports IronPdf
Class IronPdfExample
Shared Sub Main()
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
Dim renderer As New ChromePdfRenderer()
Dim htmlContent As String = "<html><body><h1>Hello World</h1></body></html>"
Dim pdf = renderer.RenderHtmlAsPdf(htmlContent)
pdf.SaveAs("output.pdf")
End Sub
End Class
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();
}
}
}
}
// 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();
}
}
}
}
Imports Ghostscript.NET
Imports Ghostscript.NET.Rasterizer
Imports System.Drawing
Imports System.Drawing.Imaging
Imports System.IO
Class GhostscriptExample
Shared Sub Main()
Dim inputPdf As String = "input.pdf"
Dim outputPath As String = "output"
Dim gvi As New GhostscriptVersionInfo("gsdll64.dll")
Using rasterizer As New GhostscriptRasterizer()
rasterizer.Open(inputPdf, gvi, False)
For pageNumber As Integer = 1 To rasterizer.PageCount
Dim img As Image = rasterizer.GetPage(300, pageNumber)
img.Save($"{outputPath}_page{pageNumber}.png", ImageFormat.Png)
img.Dispose()
Next
End Using
End Sub
End Class
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);
}
}
// 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);
}
}
Imports IronPdf
Imports System
Class IronPdfExample
Shared Sub Main()
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
Dim 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)
End Sub
End Class
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());
}
}
// 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());
}
}
Imports Ghostscript.NET
Imports Ghostscript.NET.Processor
Imports System.Collections.Generic
Class GhostscriptExample
Shared Sub Main()
Dim outputPdf As String = "merged.pdf"
Dim inputFiles As String() = {"file1.pdf", "file2.pdf", "file3.pdf"}
Dim processor As New GhostscriptProcessor()
Dim switches As New List(Of String) From {
"-dNOPAUSE",
"-dBATCH",
"-dSAFER",
"-sDEVICE=pdfwrite",
$"-sOutputFile={outputPdf}"
}
switches.AddRange(inputFiles)
processor.Process(switches.ToArray())
End Sub
End Class
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");
}
}
// 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");
}
}
Imports IronPdf
Imports System.Collections.Generic
Class IronPdfExample
Shared Sub Main()
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
Dim pdfs = New List(Of PdfDocument) From {
PdfDocument.FromFile("file1.pdf"),
PdfDocument.FromFile("file2.pdf"),
PdfDocument.FromFile("file3.pdf")
}
Dim merged = PdfDocument.Merge(pdfs)
merged.SaveAs("merged.pdf")
End Sub
End Class
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");
// 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");
' Ghostscript: -dFirstPage=5 -dLastPage=8 (1-indexed, inclusive)
' IronPDF: 0-indexed page array
Dim extracted = pdf.CopyPages({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);
// Ghostscript: process or P/Invoke overhead per call
processor.Process(switches.ToArray());
// IronPDF: in-process method call
var merged = PdfDocument.Merge(pdfs);
' Ghostscript: process or P/Invoke overhead per call
processor.Process(switches.ToArray())
' IronPDF: in-process method call
Dim 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
- 监控生产过程,发现任何问题

