フッターコンテンツにスキップ
移行ガイド

C#でGhostscript GPLからIronPDFに移行する方法

Ghostscript GPLからIronPDFに移行することで、.NET PDFワークフローをコマンドラインでのプロセス生成や文字列ベースのスイッチ操作から、タイプセーフでインテリセンス対応の.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ビットでは異なるDLLが必要です(gsdll32.dllgsdll64.dll)。

4.ネイティブ HTML から PDF への変換なし:Ghostscript GPLは HTML を PDF に直接変換できません。 まず別のツールを使ってHTMLをPostScriptに変換し、次にGhostscript GPLを使ってPostScriptをPDFに変換する必要があります。

5.複雑なスイッチ構文:操作は-dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=...のような難解なコマンドラインスイッチによって制御されます。 インテリセンス、タイプセーフティがなく、ミスタイプしやすい。

6.エラー処理:エラーはテキスト文字列として stderr から渡されるため、構造化例外処理ではなく解析が必要です。

7.プロセス管理のオーバーヘッド:各操作は個別のプロセスを生成し、エラー処理、タイムアウト、およびリソースのクリーンアップのオーバーヘッドと複雑さを追加します。

ゴーストスクリプトGPLとIronPDFの比較

アスペクト Ghostscript GPL IronPDF
ライセンス AGPL(ウィルス性)または高価な商用 明確な用語によるコマーシャル
インテグレーション コマンドラインプロセスの起動 .NETネイティブライブラリ
APIデザイン 文字列ベースのスイッチ 型付き、インテリセンス対応API
エラー処理 標準エラーテキストの解析 .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インデックス vs 1インデックス
ポストスクリプトから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):

Ghostscript GPL under AGPLは、ソースコードの開示か、Artifexからの高価な商用ライセンスが必要です。

翻訳後(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";
$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;
$vbLabelText   $csharpLabel

完全な API リファレンス

コア クラス マッピング

Ghostscript.NET IronPDF 翻訳内容
GhostscriptProcessor(ゴーストスクリプトプロセッサー さまざまな PdfDocument メソッド PDF処理
GhostscriptRasterizer(ゴーストスクリプトラスタライザー PdfDocument.ToBitmap() / RasterizeToImageFiles(). PDFから画像へ
GhostscriptVersionInfo(ゴーストスクリプトバージョンインフォ 該当なし(不要) DLLの場所
GhostscriptStdIO` 該当なし(例外あり) I/O処理
プロセス+コマンドライン ChromePdfRenderer HTML to 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(quality: 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());
    }
}
$vbLabelText   $csharpLabel

翻訳後(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");
    }
}
$vbLabelText   $csharpLabel

Ghostscript GPLは、HTMLを直接PDFに変換することはできません。 IronPdfのChromePdfRendererはCSS3、JavaScript、最新のWeb標準を完全にサポートし、HTMLからPDFへの直接変換を提供します。 レンダリングオプションについては、HTML to PDF documentationを参照してください。

例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();
            }
        }
    }
}
$vbLabelText   $csharpLabel

翻訳後(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");
        }
    }
}
$vbLabelText   $csharpLabel

Ghostscript GPL のアプローチでは、外部の gsdll64.dll</code> を見つけ、<code>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());
    }
}
$vbLabelText   $csharpLabel

翻訳後(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");
    }
}
$vbLabelText   $csharpLabel

Ghostscript GPLのアプローチでは、スイッチ構文(-dNOPAUSE, -dBATCH, -sDEVICE=pdfwrite)を記憶し、ファイルパスを文字列配列に連結する必要があります。 IronPDFの静的なMergeメソッドはタイプセーフで、適切な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");
}
$vbLabelText   $csharpLabel

AGPLライセンスに関する懸念を払拭

Ghostscript GPLのAGPLライセンスには、アプリケーションを配布する際にソースコードの公開を要求する"ウィルス性"の特性があります。 IronPDFの商用ライセンスにはそのような条件はありません。

外部バイナリは使用しないでください

IronPDFは完全に自己完結しています。 移行後、これらを削除してください:

  • gsdll32.dllおよび gsdll64.dllファイル
  • サーバーからのGhostscript GPLインストール
  • PATH環境変数の設定
  • GhostscriptVersionInfoをコードで参照する

ポストスクリプトファイル

IronPDFはポストスクリプト(.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
$vbLabelText   $csharpLabel

スレッドの安全性

IronPDFは設計上スレッドセーフです。 複数のスレッドでChromePdfRendererPdfDocumentを同時に使用することができます。


移行チェックリスト

移行前

  • コードベース内のすべてのGhostscript GPLの使用状況を一覧表示する
  • 現在使用されているコマンドラインスイッチを文書化する
  • PostScript処理を識別する(特別な処理が必要)
  • AGPLライセンスのコンプライアンスステータスを確認する
  • IronPDFライセンスキーを取得する
  • バージョン管理に移行ブランチを作成する

コードの移行

  • Ghostscript.NET NuGet パッケージを削除します: dotnet remove package Ghostscript.NET
  • IronPdf NuGet パッケージをインストールします: dotnet add package IronPdf
  • 外部のGhostscript GPLバイナリ依存関係を削除する
  • GhostscriptVersionInfoとDLL参照を削除する
  • GhostscriptProcessor.Process()をIronPDFメソッドに変換する
  • GhostscriptRasterizerpdf.ToBitmap()に変換する
  • コマンドラインスイッチをAPI呼び出しに置き換える
  • エラー処理をstderr解析から例外に更新
  • 1から始まるページ番号を0から始まるページ番号に変換する

テスティング

  • PDFから画像への変換をテストする
  • PDF結合のテスト
  • テストページの抽出
  • 圧縮品質のテスト
  • パスワード保護をテストする
  • 出力品質が期待通りであることを確認する
  • パフォーマンスベンチマークのクリティカルパス

展開

  • サーバーからGhostscript GPLを削除する
  • PATH設定を削除する
  • デプロイメントからgsdll*.dllファイルを削除します -Ghostscript GPLをインストールせずにアプリケーションが動作することを確認します

移行後

  • Ghostscript GPLライセンスを削除する(商用の場合)
  • ドキュメントの更新 -IronPDFAPI についてチームをトレーニングする
  • 問題がないか生産状況を監視

カーティス・チャウ
テクニカルライター

Curtis Chauは、カールトン大学でコンピュータサイエンスの学士号を取得し、Node.js、TypeScript、JavaScript、およびReactに精通したフロントエンド開発を専門としています。直感的で美しいユーザーインターフェースを作成することに情熱を持ち、Curtisは現代のフレームワークを用いた開発や、構造の良い視覚的に魅力的なマニュアルの作成を楽しんでいます。

開発以外にも、CurtisはIoT(Internet of Things)への強い関心を持ち、ハードウェアとソフトウェアの統合方法を模索しています。余暇には、ゲームをしたりDiscordボットを作成したりして、技術に対する愛情と創造性を組み合わせています。