C#에서 Ghostscript GPL에서 IronPDF로 마이그레이션하는 방법
Ghostscript에서 IronPDF로 마이그레이션하면 .NET PDF 워크플로우가 명령줄 프로세스 생성 및 문자열 기반 스위치 조작에서 입력 유형 및 IntelliSense가 지원되는 기본 .NET API로 이동합니다. 이 가이드는 AGPL-3.0 라이선스 노출 및 외부 네이티브 바이너리 종속성을 제거하는 단계별 마이그레이션 경로를 안내합니다.
용어에 대한 노트:Ghostscript(by Artifex Software)는 AGPL-3.0 또는 상업적 라이선스 하에 이중 라이선스되어 있습니다, 순수한 GPL이 아니라. "GPL" 태그는 오픈 소스 빌드에 대한 커뮤니티 약어로 오래전부터 사용되고 있습니다; 이 가이드의 모든 내용은 Ghostscript의 AGPL-3.0 빌드와 Ghostscript.NET 래퍼(역시 AGPL-3.0 / 상업용 듀얼)를 참조합니다. .NET에서 Ghostscript는 일반적으로 해당 래퍼를 통해 사용되며, 이는 네이티브 gsdll32.dll / gsdll64.dll를 P/Invoke 하거나 Process.Start를 통해 gswin32c / gswin64c로 셸 아웃하는 방식입니다.
왜 Ghostscript에서 IronPDF로 마이그레이션해야 하는가
Ghostscript의 도전 과제
Ghostscript는 Artifex Software의 오랜 PostScript/PDF 인터프리터로, 수십 년의 역사를 갖고 있습니다. 현대 .NET 응용 프로그램에서 사용하면서 몇 가지 실질적인 도전 과제에 직면하게 됩니다:
-
AGPL-3.0 라이선스 제한:Ghostscript자체와
Ghostscript.NET래퍼는 AGPL-3.0 또는 Artifex의 상업적 라이선스를 통해 듀얼 라이선싱됩니다. AGPL의 네트워크 카피레프트 조항은 일반적으로 SaaS / 네트워크 사용을 포함한 더 큰 작업의 해당 소스를 배포하도록 요구합니다 — 상업 라이선스를 구매하지 않는 한. 이는 일반적으로 클로즈드 소스 또는 호스팅된 .NET 앱에서 AGPL 빌드를 배제하게 만듭니다. -
명령줄 인터페이스: Ghostscript는 근본적으로 명령줄 도구입니다. C#에서의 사용은 프로세스 생성, 문자열 인수 전달 및 출력 구문 분석을 의미하며, 이는
Process.Start를 통해gswin*c.exe에 대해, 또는Ghostscript.NETP/Invoke 래퍼를 통한 방식 중 하나입니다. -
외부 바이너리 종속성: Ghostscript를 별도로 설치하고, PATH 변수를 관리하며, 환경 간 버전을 일치시켜야 합니다. 32비트와 64비트용으로 다른 네이티브 DLL이 필요합니다 (
gsdll32.dll대gsdll64.dll). -
네이티브 HTML-대-PDF 없음: Ghostscript는 HTML을 PDF로 직접 변환할 수 없습니다. 먼저 다른 도구로 HTML을 PostScript로 변환한 다음 Ghostscript를 실행하여 PostScript를 PDF로 변환해야 합니다 — 외부 종속성을 가진 여러 단계의 파이프라인.
-
복잡한 스위치 구문: 작업은
-dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=...같은 명령줄 스위치를 통해 제어됩니다. IntelliSense가 없고, 컴파일 시간 확인도 없습니다. -
오류 처리: 오류는 stderr를 통해 텍스트 문자열로 전달되어 구문 분석이 필요하며 구조적 예외 처리가 필요합니다.
- 프로세스 관리 오버헤드: 각 작업마다 별도의 프로세스를 생성하여 제한 시간 및 리소스 정리에 대한 오버헤드와 복잡성을 추가합니다.
Ghostscript 대 IronPDF 비교
| 측면 | Ghostscript | IronPDF |
|---|---|---|
| 라이선스 | AGPL-3.0 (네트워크 카피레프트) 또는 Artifex 상업 | 명확한 조건을 가진 상업적 |
| 통합 | 명령줄 프로세스 생성 | 네이티브 .NET 라이브러리 |
| API 설계 | 문자열 기반 스위치 | 타이핑 및 IntelliSense 지원 API |
| 오류 처리 | stderr 텍스트 파싱 | .NET 예외 |
| HTML-to-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를 이미지로 | 낮음 |
| PDF 병합 | 낮음 |
| PDF 압축 | 낮음 |
| PDF 최적화 | 낮음 |
| 암호화 | 중간 |
| 페이지 추출 | 낮음 |
| 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을 목표로 합니다. - 라이선스 키: ironpdf.com에서 IronPDF 라이선스 키를 얻으세요.
- 백업: 마이그레이션 작업을 위한 분기를 생성하세요.
모든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단계: 라이선스 구성 업데이트
Before (Ghostscript):
AGPL-3.0 하의 Ghostscript는 AGPL 약관에 따라 소스 공개 또는 Artifex의 상업적 라이선스를 요구합니다.
이후 (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 |
N/A (필요 없음) | DLL 위치 |
GhostscriptStdIO |
N/A (예외 사용) | I/O 처리 |
| 프로세스 + 명령줄 | ChromePdfRenderer |
HTML을 PDF로 |
명령줄 스위치 매핑
| Ghostscript 스위치 | IronPDF 동등 | 설명 |
|---|---|---|
-dNOPAUSE |
N/A (필요 없음) | 페이지 간 일시정지 금지 |
-dBATCH |
N/A (필요 없음) | 처리 후 종료 |
-dSAFER |
N/A (기본값) | 안전한 파일 액세스 |
-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로 변환
Before (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
이후 (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는 CSS, JavaScript 및 Chrome 엔진을 통한 최신 웹 표준을 지원하여 HTML을 PDF로 직접 렌더링합니다. 더 많은 렌더링 옵션은 HTML to PDF 문서를 참조하세요.
예제 2: PDF에서 이미지로
Before (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
이후 (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 접근 방식은 외부 gsdll64.dll를 찾고, GhostscriptVersionInfo 객체를 생성하고, 1-인덱스된 페이지 번호로 페이지를 반복해야 합니다. IronPDF의 RasterizeToImageFiles는 단일 호출로 모든 페이지를 작성하며, 개별 DPI: 매개변수를 가진 글롭 출력 패턴을 사용하여 외부 네이티브 의존성이 없습니다. 페이지 인덱스를 처리할 때, Ghostscript는 1부터 시작하는 페이지를 사용하고 IronPDF는 0부터 시작하는 페이지를 사용한다는 점을 주목하세요 (표준 .NET 관례).
예제 3: PDF 파일 병합
Before (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
이후 (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의 정적 Merge 메서드는 타이핑된 IEnumerable<PdfDocument>를 취하고 새로운 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 패키지로 배포됩니다. 마이그레이션 후 다음을 제거하세요:
gsdll32.dll및gsdll64.dll파일- 서버에서Ghostscript설치
- PATH 환경 변수 구성
- 코드의
GhostscriptVersionInfo참조
PostScript 파일
IronPDF는 PostScript (.ps) 파일을 직접 처리하지 않습니다. 워크플로우에 PostScript 처리가 필요한 경우 다음 중 하나를 수행하세요:
- IronPDF 처리 전에 다른 도구를 사용하여 PostScript를 PDF로 변환
- 소스 콘텐츠를 HTML로 변환하고 IronPDF의 HTML 렌더링 사용
성능 고려 사항
프로세스 생성 없음
gswin64c.exe에 셸 아웃(또는 gsdll64.dll P/Invoke)은 각 작업당 프로세스 및 네이티브 상호 작용 오버헤드를 수반합니다. 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는 여러 스레드에서 ChromePdfRenderer 및 PdfDocument를 동시에 사용할 수 있도록 지원합니다. 병렬 렌더링 패턴에 대한 지침은 IronPDF 문서 를 참조하세요.
마이그레이션 체크리스트
사전 마이그레이션
- 코드베이스 내 모든Ghostscript사용 내역
- 현재 사용 중인 명령줄 스위치 문서화
- PostScript 처리를 식별 (특별 처리 필요)
- AGPL-3.0 라이선스 준수 상태 검토
- IronPDF 라이센스 키를 받으세요
- 버전 컨트롤에 마이그레이션 분기를 생성
코드 마이그레이션
- Ghostscript.NET NuGet 패키지 제거:
dotnet remove package Ghostscript.NET-IronPDF NuGet Install-Package:dotnet add package IronPdf - 외부Ghostscript바이너리 종속성 제거
GhostscriptVersionInfo및 DLL 참조 제거GhostscriptProcessor.Process()를 IronPDF 메서드로 변환GhostscriptRasterizer를pdf.RasterizeToImageFiles()로 변환- 명령줄 스위치를 API 호출로 대체
- 오류 처리를 stderr 파싱에서 예외로 업데이트
- 1-인덱스 페이지 번호를 0-인덱스로 변환
테스트
- PDF에서 이미지 변환 테스트
- PDF 병합 테스트
- 페이지 추출 테스트
- 압축 품질 테스트
- 비밀번호 보호 테스트
- 출력 품질이 기대에 부합하는지 확인
- 중요 경로 성능 벤치마크
배포
- 서버에서Ghostscript제거
- PATH 구성 제거
- 배포에서
gsdll*.dll파일 제거 - Ghostscript가 설치되지 않은 상태로 애플리케이션이 작동하는지 확인
마이그레이션 이후
- 상업적 라이선스 취소 (이전에 소유했고 더 이상 필요하지 않음) 결정
- 문서 업데이트 -IronPDF API에 대한 팀 교육
- 생산에서 문제 여부 모니터

