跳過到頁腳內容
遷移指南

如何用 C# 從 Ghostscript GPL 轉換到 IronPDF

從Ghostscript GPL轉移到 IronPDF:完整的 C# 遷移指南。

從Ghostscript GPL轉換到IronPDF可將您的 .NET PDF 工作流程從命令列處理及基於字串的切換操作轉換為類型安全、支援 IntelliSense 的本機 .NET API。 本指南提供了一個全面、循序漸進的遷移路徑,可消除 Professional .NET 開發人員對 AGPL許可證的疑慮和外部二進位依賴。

為什麼要從Ghostscript GPL轉移到 IronPDF?

Ghostscript GPL的挑戰

Ghostscript GPL 是一款歷史悠久的 PostScript/PDF 解譯器,已有數十年的歷史,但在現代 .NET 應用程式中使用它卻面臨重大的挑戰:

1.AGPL 授權限制:Ghostscript GPL 的 AGPL 授權要求您在發行使用Ghostscript GPL的軟體時,必須釋出您的原始碼 - 除非您向 Artifex 購買昂貴的商業授權。 這種"病毒式"的授權模式會為專屬應用程式帶來重大的法律風險。

2.指令行介面:Ghostscript GPL 基本上是一個命令列工具。 從 C# 使用它需要產生進程、傳遞字串參數和解析輸出,這是一種脆弱且容易出錯的方法。

3.外部二進位相依性:您必須單獨安裝 Ghostscript GPL、管理 PATH 變數,並確保不同部署環境下的版本相容性。 32 位元與 64 位元需要不同的 DLL(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 函式庫
API 設計基於字串的切換類型化、支援 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 vs 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 處理
GhostscriptRasterizerPdfDocument.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=/ebookCompressImages(quality: 75)中等品質
-sOwnerPassword=XSecuritySettings.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 和現代網路標準。 請參閱 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-indexed 頁面,而IronPDF則使用 0-indexed 頁面(標準 .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 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授權 (若為商業用途)
  • [ ] 更新文件
  • [ ] 對團隊進行 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 熱衷於創建直觀且美觀的用戶界面,喜歡使用現代框架並打造結構良好、視覺吸引人的手冊。

除了開發之外,Curtis 對物聯網 (IoT) 有著濃厚的興趣,探索將硬體和軟體結合的創新方式。在閒暇時間,他喜愛遊戲並構建 Discord 機器人,結合科技與創意的樂趣。