IRONSOFTWAREHOME
동영상

C#에서 PDF를 압축하는 방법

Curtis Chau
Curtis Chau
Updated: 2026년 7월 19일

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 응용 프로그램에서 사용하면서 몇 가지 실질적인 도전 과제에 직면하게 됩니다:

  1. **AGPL-3.0 라이선스 제한:**Ghostscript자체와 Ghostscript.NET 래퍼는 AGPL-3.0 또는 Artifex의 상업적 라이선스를 통해 듀얼 라이선싱됩니다. AGPL의 네트워크 카피레프트 조항은 일반적으로 SaaS / 네트워크 사용을 포함한 더 큰 작업의 해당 소스를 배포하도록 요구합니다 — 상업 라이선스를 구매하지 않는 한. 이는 일반적으로 클로즈드 소스 또는 호스팅된 .NET 앱에서 AGPL 빌드를 배제하게 만듭니다.

  2. 명령줄 인터페이스: Ghostscript는 근본적으로 명령줄 도구입니다. C#에서의 사용은 프로세스 생성, 문자열 인수 전달 및 출력 구문 분석을 의미하며, 이는 Process.Start를 통해 gswin*c.exe에 대해, 또는 Ghostscript.NET P/Invoke 래퍼를 통한 방식 중 하나입니다.

  3. 외부 바이너리 종속성: Ghostscript를 별도로 설치하고, PATH 변수를 관리하며, 환경 간 버전을 일치시켜야 합니다. 32비트와 64비트용으로 다른 네이티브 DLL이 필요합니다 (gsdll32.dllgsdll64.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-to-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단계: 라이선스 구성 업데이트

Before (Ghostscript):

AGPL-3.0 하의 Ghostscript는 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를 이미지로 변환
GhostscriptVersionInfoN/A (필요 없음)DLL 위치
GhostscriptStdION/A (예외 사용)I/O 처리
프로세스 + 명령줄ChromePdfRendererHTML을 PDF로

명령줄 스위치 매핑

Ghostscript 스위치IronPDF 동등설명
-dNOPAUSEN/A (필요 없음)페이지 간 일시정지 금지
-dBATCHN/A (필요 없음)처리 후 종료
-dSAFERN/A (기본값)안전한 파일 액세스
-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로 변환

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());
    }
}
C#

이후 (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는 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();
            }
        }
    }
}

이후 (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 접근 방식은 외부 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());
    }
}

이후 (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의 정적 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");

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.dllgsdll64.dll 파일
  • 서버에서Ghostscript설치
  • PATH 환경 변수 구성
  • 코드의 GhostscriptVersionInfo 참조

PostScript 파일

IronPDF는 PostScript (.ps) 파일을 직접 처리하지 않습니다. 워크플로우에 PostScript 처리가 필요한 경우 다음 중 하나를 수행하세요:

  1. IronPDF 처리 전에 다른 도구를 사용하여 PostScript를 PDF로 변환
  2. 소스 콘텐츠를 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);

스레드 안전성

IronPDF는 여러 스레드에서 ChromePdfRendererPdfDocument를 동시에 사용할 수 있도록 지원합니다. 병렬 렌더링 패턴에 대한 지침은 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 메서드로 변환
  • GhostscriptRasterizerpdf.RasterizeToImageFiles()로 변환
  • 명령줄 스위치를 API 호출로 대체
  • 오류 처리를 stderr 파싱에서 예외로 업데이트
  • 1-인덱스 페이지 번호를 0-인덱스로 변환

테스트

  • PDF에서 이미지 변환 테스트
  • PDF 병합 테스트
  • 페이지 추출 테스트
  • 압축 품질 테스트
  • 비밀번호 보호 테스트
  • 출력 품질이 기대에 부합하는지 확인
  • 중요 경로 성능 벤치마크

배포

  • 서버에서Ghostscript제거
  • PATH 구성 제거
  • 배포에서 gsdll*.dll 파일 제거
  • Ghostscript가 설치되지 않은 상태로 애플리케이션이 작동하는지 확인

마이그레이션 이후

  • 상업적 라이선스 취소 (이전에 소유했고 더 이상 필요하지 않음) 결정
  • 문서 업데이트 -IronPDF API에 대한 팀 교육
  • 생산에서 문제 여부 모니터

참고해 주세요: Ghostscript는 해당 소유자의 등록 상표입니다. 이 사이트는 Artifex Software와 연계되어 있지 않으며, 승인을 받거나 후원을 받지 않습니다. 모든 제품명, 로고 및 브랜드는 해당 소유자의 자산입니다. 비교는 정보 제공 목적으로만 사용되며, 작성 시점에 공개적으로 이용 가능한 정보를 반영합니다.
Curtis Chau
기술 문서 작성자

커티스 차우는 칼턴 대학교에서 컴퓨터 과학 학사 학위를 취득했으며, Node.js, TypeScript, JavaScript, React를 전문으로 하는 프론트엔드 개발자입니다. 직관적이고 미적으로 뛰어난 사용자 인터페이스를 만드는 데 열정을 가진 그는 최신 프레임워크를 활용하고, 잘 구성되고 시각적으로 매력적인 매뉴얼을 제작하는 것을 즐깁니다.

...
더 읽어보기

관련 기사

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일 무료 체험판 키를 받으세요.
신용카드나 계정 생성은 필요하지 않습니다.