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包裝器均由Artifex提供的AGPL-3.0或商業授權雙重授權。 AGPL的網路共享條款通常要求您公開較大工作源程式碼的對應部分,包括SaaS/網路使用,除非您購買了商業授權。 這往往排除了封閉源碼或託管.NET應用程式中使用AGPL版本的可能性。

  2. **命令行介面:**Ghostscript本質上是一個命令行工具。 從C#使用它意味著生成進程、傳遞字串參數及解析輸出 — 要麼通過對Ghostscript.NET的P/Invoke包裝器。

  3. **外部二進制依賴:**您必須分別安裝Ghostscript、管理PATH變數並保持版本跨環境一致。 32位與64位需要不同的本地DLL(gsdll64.dll)。

  4. **無本地HTML到PDF:**Ghostscript無法直接將HTML轉換為PDF。 您需要先使用其他工具將HTML轉換為PostScript,然後運行Ghostscript將PostScript轉換為PDF — 這是一個多步驟管道,且有外部依賴。

  5. **複雜的開關語法:**操作是通過如-dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=...那樣的命令行開關控制的。 沒有IntelliSense,沒有編譯時檢查。

  6. **錯誤處理:**錯誤通過stderr以文字字串形式出現,需要解析而非結構化異常處理。

  7. **進程管理負擔:**每次操作都會生成單獨的進程,增加了超時和資源清理的負擔和複雜性。

Ghostscript與IronPDF比較

方面GhostscriptIronPDF
授權AGPL-3.0(網路共享)或Artifex商業商業授權明確
整合命令行進程生成原生.NET程式庫
API設計基於字串的開關型別化且支援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轉圖像
合併PDF
壓縮PDF
PDF優化
加密
頁面提取
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的商業授權。

之後(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 to 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()
    {
        // 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());
    }
}

之後(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和現代網路標準,並使用內嵌的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();
            }
        }
    }
}

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

之後(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包裝器均由Artifex提供的AGPL-3.0或商業授權雙重授權。 AGPL-3.0的網路共享條款通常要求公開較大工作源程式碼的對應部分,包括SaaS/網路可存取的部署,除非您持有Artifex的商業授權。 將PDF工作負載遷移到IronPDF之後,移動的部分將不再有此義務; 如果您僅保持Ghostscript以便處理PostScript,那麼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渲染

效能考量

無進程生成

調用gswin64c.exe(或P/Invoking 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商業授權(如果之前持有且不再需要)
  • 更新文件
  • 培訓團隊使用IronPDF API
  • 監控生產環境中的任何問題

請注意: Ghostscript是其各自擁有者的註冊商標。 本網站與Artifex Software沒有關聯,也未經其認可或贊助。 所有產品名稱、標誌和品牌均為其各自所有者的財產。 比較僅供參考,反映撰寫時公開可用的資訊。
Curtis Chau
技術作家

Curtis Chau擁有Carleton大學的電腦科學學士學位,專精於前端開發,擁有Node.js、TypeScript、JavaScript和React的專業知識。Curtis熱衷於建立直觀且美觀的使用者介面,喜愛使用現代框架並建立結構良好、視覺吸引力的手冊。

...
閱讀更多

相關文章

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天試用金鑰
無需信用卡或帳戶建立