비교

Gotenberg vs IronPDF: 기술 비교 가이드

.NET 개발자가 PDF 생성 솔루션을 평가할 때, Gotenberg는 REST API 호출을 통해 HTML을 PDF로 변환하는 Docker 기반 마이크로서비스로 두드러집니다. 다양한 아키텍처에 적응할 수 있지만, Gotenberg는 Docker 컨테이너, 네트워크 지연, 운영 복잡성과 같은 상당한 인프라 오버헤드를 도입합니다. IronPDF는 대안으로, 컨테이너, 네트워크 호출 또는 인프라 관리 없이 동일한 Chromium 기반 렌더링을 제공하는 인프로세스 NuGet 패키지를 제공합니다.

이 비교는 .NET PDF 요구 사항을 위한 정보를 바탕으로 전문 개발자와 아키텍트가 정보에 입각한 결정을 내릴 수 있도록 기술적으로 관련된 차원에서 두 솔루션을 살펴봅니다.

Gotenberg이해하기

Gotenberg는 PDF 생성을 위한 Docker 기반 마이크로서비스 아키텍처입니다. HTML, URL 및 기타 형식을 PDF로 변환하기 위해 REST API 엔드포인트를 노출하는 별도의 컨테이너로 실행됩니다. 모든 PDF 작업은Gotenberg서비스에 대한 HTTP 호출이 필요합니다.

Gotenberg는 HTML을 PDF로 변환하기 위해 POST /forms/chromium/convert/html 같은 엔드포인트를, URL을 PDF로 변환하기 위해 POST /forms/chromium/convert/url 같은 엔드포인트를 사용합니다. 구성은 문자열 기반의 매개변수 paperWidth, paperHeight, marginTop, marginBottom (인치 단위)와 함께 multipart/form-data로 전달됩니다. 이 서비스는 Docker 배포, 컨테이너 오케스트레이션(Kubernetes/Docker Compose), 네트워크 인프라를 요구합니다.

아키텍처 요구 사항은 다음과 같습니다:

  • Docker 컨테이너 배포 및 관리
  • 모든 PDF 요청에 대한 네트워크 통신 (10-100ms+ 지연)
  • 컨테이너 콜드 스타트 처리 (첫 요청 시 2-5초)
  • 상태 확인 엔드포인트 및 서비스 모니터링
  • 모든 요청에 대한 multipart/form-data 구성

IronPDF대하여 PDF

IronPDF는 인프로세스 NuGet 패키지로 실행되는 본래의 .NET 라이브러리입니다. 외부 서비스, 네트워크 호출 또는 컨테이너 인프라 없이 Chromium 기반 HTML 렌더링을 제공합니다.

IronPDF는 ChromePdfRenderer를 주 렌더링 클래스로 사용하며, RenderHtmlAsPdf()RenderUrlAsPdf() 같은 메서드를 제공합니다. 구성은 RenderingOptions에 있는 유형화된 C# 프로퍼티를 사용하여 PaperSize, MarginTop, MarginBottom (밀리미터 단위)를 포함합니다. 문서는 SaveAs()으로 저장되거나 BinaryData으로 접근됩니다.

라이브러리에는 다음만 필요합니다:

  • NuGet Install-Package (dotnet add package IronPdf)
  • 라이선스 키 설정
  • 표준 .NET 프로젝트 설정

아키텍처 및 인프라 비교

이 솔루션들 간의 근본적인 차이는 배포 및 런타임 아키텍처에 있습니다.

요소GotenbergIronPDF
배포Docker 컨테이너 + 오케스트레이션단일 NuGet 패키지
아키텍처마이크로서비스 (REST API)프로세스 내 라이브러리
요청당 지연시간10-100ms+ (네트워크 왕복)< 1ms 오버헤드
콜드 스타트2-5초 (컨테이너 초기화)1-2초 (첫 렌더링만)
인프라Docker, Kubernetes, 로드 밸런서필요 없음
네트워크 의존성필요함없음
오류 모드네트워크, 컨테이너, 서비스 오류표준 .NET 예외
API 스타일REST multipart/form-data네이티브 C# 메서드 호출
확장성수평 확장 (더 많은 컨테이너)수직 확장 (프로세스 내)
디버깅분산 추적표준 디버거
메모리 관리별도의 컨테이너 (512MB-2GB)공유 애플리케이션 메모리
버전 관리컨테이너 이미지 태그NuGet 패키지 버전
상태 검사HTTP 엔드포인트 필요필요 없음 (프로세스 내)
CI/CD 복잡성컨테이너 빌드, 레지스트리 푸시표준 .NET 빌드

Gotenberg의 Docker 기반 접근 방식은 컨테이너 배포, 상태 모니터링 및 네트워크 인프라 관리를 필요로 합니다. IronPDF는 인프로세스로 실행하여 이러한 인프라 계층을 완전히 제거합니다.

코드 비교: 일반적인 PDF 작업

기본 HTML을 PDF로 변환

가장 근본적인 작업은 아키텍처의 차이를 명확히 보여줍니다.

Gotenberg:

using System;
using System.Net.Http;
using System.Threading.Tasks;
using System.IO;

class GotenbergExample
{
    static async Task Main()
    {
        var gotenbergUrl = "http://localhost:3000/forms/chromium/convert/html";

        using var client = new HttpClient();
        using var content = new MultipartFormDataContent();

        var html = "<html><body><h1>Hello from Gotenberg</h1></body></html>";
        content.Add(new StringContent(html), "files", "index.html");

        var response = await client.PostAsync(gotenbergUrl, content);
        var pdfBytes = await response.Content.ReadAsByteArrayAsync();

        await File.WriteAllBytesAsync("output.pdf", pdfBytes);
        Console.WriteLine("PDF generated successfully");
    }
}
using System;
using System.Net.Http;
using System.Threading.Tasks;
using System.IO;

class GotenbergExample
{
    static async Task Main()
    {
        var gotenbergUrl = "http://localhost:3000/forms/chromium/convert/html";

        using var client = new HttpClient();
        using var content = new MultipartFormDataContent();

        var html = "<html><body><h1>Hello from Gotenberg</h1></body></html>";
        content.Add(new StringContent(html), "files", "index.html");

        var response = await client.PostAsync(gotenbergUrl, content);
        var pdfBytes = await response.Content.ReadAsByteArrayAsync();

        await File.WriteAllBytesAsync("output.pdf", pdfBytes);
        Console.WriteLine("PDF generated successfully");
    }
}
$vbLabelText   $csharpLabel

IronPDF:

// NuGet: Install-Package IronPdf
using System;
using IronPdf;

class IronPdfExample
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();

        var html = "<html><body><h1>Hello from IronPDF</h1></body></html>";
        var pdf = renderer.RenderHtmlAsPdf(html);

        pdf.SaveAs("output.pdf");
        Console.WriteLine("PDF generated successfully");
    }
}
// NuGet: Install-Package IronPdf
using System;
using IronPdf;

class IronPdfExample
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();

        var html = "<html><body><h1>Hello from IronPDF</h1></body></html>";
        var pdf = renderer.RenderHtmlAsPdf(html);

        pdf.SaveAs("output.pdf");
        Console.WriteLine("PDF generated successfully");
    }
}
$vbLabelText   $csharpLabel

Gotenberg는 HttpClient를 생성하고, MultipartFormDataContent를 구성하고, HTML을 파일 첨부로 추가하며 특정 파일 이름 (index.html)을 사용합니다.Gotenberg서비스 엔드포인트에 비동기 HTTP POST를 수행하고, 응답 바이트를 읽고 디스크에 씁니다. 모든 요청은 네트워크를 통해 전송되며, 이에 따른 지연 시간과 실패 모드가 수반됩니다.

IronPDF는 ChromePdfRenderer을 생성하고, HTML 문자열을 가지고 RenderHtmlAsPdf()을 호출하며, SaveAs()으로 저장합니다. 이 작업은 동기식으로, 인프로세스에서 수행되며, 문자열 기반 양식 데이터 대신 타입화된 메서드를 사용합니다.

고급 HTML 렌더링 옵션을 보려면 HTML to PDF 변환 가이드를 탐색하세요.

URL을 PDF로 변환

라이브 웹 페이지를 PDF로 변환하는 것은 유사한 아키텍처 패턴을 보여줍니다.

Gotenberg:

using System;
using System.Net.Http;
using System.Threading.Tasks;
using System.IO;

class GotenbergUrlToPdf
{
    static async Task Main()
    {
        var gotenbergUrl = "http://localhost:3000/forms/chromium/convert/url";

        using var client = new HttpClient();
        using var content = new MultipartFormDataContent();

        content.Add(new StringContent("https://example.com"), "url");

        var response = await client.PostAsync(gotenbergUrl, content);
        var pdfBytes = await response.Content.ReadAsByteArrayAsync();

        await File.WriteAllBytesAsync("webpage.pdf", pdfBytes);
        Console.WriteLine("PDF from URL generated successfully");
    }
}
using System;
using System.Net.Http;
using System.Threading.Tasks;
using System.IO;

class GotenbergUrlToPdf
{
    static async Task Main()
    {
        var gotenbergUrl = "http://localhost:3000/forms/chromium/convert/url";

        using var client = new HttpClient();
        using var content = new MultipartFormDataContent();

        content.Add(new StringContent("https://example.com"), "url");

        var response = await client.PostAsync(gotenbergUrl, content);
        var pdfBytes = await response.Content.ReadAsByteArrayAsync();

        await File.WriteAllBytesAsync("webpage.pdf", pdfBytes);
        Console.WriteLine("PDF from URL generated successfully");
    }
}
$vbLabelText   $csharpLabel

IronPDF:

// NuGet: Install-Package IronPdf
using System;
using IronPdf;

class IronPdfUrlToPdf
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();

        var pdf = renderer.RenderUrlAsPdf("https://example.com");

        pdf.SaveAs("webpage.pdf");
        Console.WriteLine("PDF from URL generated successfully");
    }
}
// NuGet: Install-Package IronPdf
using System;
using IronPdf;

class IronPdfUrlToPdf
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();

        var pdf = renderer.RenderUrlAsPdf("https://example.com");

        pdf.SaveAs("webpage.pdf");
        Console.WriteLine("PDF from URL generated successfully");
    }
}
$vbLabelText   $csharpLabel

Gotenberg는 URL을 form data로 전달하여 /forms/chromium/convert/url 엔드포인트를 사용합니다. IronPDF는 URL 문자열을 갖고 RenderUrlAsPdf()을 직접 호출하여 HTTP 인프라를 대체합니다.

사용자 정의 페이지 크기 및 여백

구성 처리에서 API 설계 차이를 드러냅니다.

Gotenberg:

using System;
using System.Net.Http;
using System.Threading.Tasks;
using System.IO;

class GotenbergCustomSize
{
    static async Task Main()
    {
        var gotenbergUrl = "http://localhost:3000/forms/chromium/convert/html";

        using var client = new HttpClient();
        using var content = new MultipartFormDataContent();

        var html = "<html><body><h1>Custom Size PDF</h1></body></html>";
        content.Add(new StringContent(html), "files", "index.html");
        content.Add(new StringContent("8.5"), "paperWidth");
        content.Add(new StringContent("11"), "paperHeight");
        content.Add(new StringContent("0.5"), "marginTop");
        content.Add(new StringContent("0.5"), "marginBottom");

        var response = await client.PostAsync(gotenbergUrl, content);
        var pdfBytes = await response.Content.ReadAsByteArrayAsync();

        await File.WriteAllBytesAsync("custom-size.pdf", pdfBytes);
        Console.WriteLine("Custom size PDF generated successfully");
    }
}
using System;
using System.Net.Http;
using System.Threading.Tasks;
using System.IO;

class GotenbergCustomSize
{
    static async Task Main()
    {
        var gotenbergUrl = "http://localhost:3000/forms/chromium/convert/html";

        using var client = new HttpClient();
        using var content = new MultipartFormDataContent();

        var html = "<html><body><h1>Custom Size PDF</h1></body></html>";
        content.Add(new StringContent(html), "files", "index.html");
        content.Add(new StringContent("8.5"), "paperWidth");
        content.Add(new StringContent("11"), "paperHeight");
        content.Add(new StringContent("0.5"), "marginTop");
        content.Add(new StringContent("0.5"), "marginBottom");

        var response = await client.PostAsync(gotenbergUrl, content);
        var pdfBytes = await response.Content.ReadAsByteArrayAsync();

        await File.WriteAllBytesAsync("custom-size.pdf", pdfBytes);
        Console.WriteLine("Custom size PDF generated successfully");
    }
}
$vbLabelText   $csharpLabel

IronPDF:

// NuGet: Install-Package IronPdf
using System;
using IronPdf;
using IronPdf.Rendering;

class IronPdfCustomSize
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();

        renderer.RenderingOptions.PaperSize = PdfPaperSize.Letter;
        renderer.RenderingOptions.MarginTop = 50;
        renderer.RenderingOptions.MarginBottom = 50;

        var html = "<html><body><h1>Custom Size PDF</h1></body></html>";
        var pdf = renderer.RenderHtmlAsPdf(html);

        pdf.SaveAs("custom-size.pdf");
        Console.WriteLine("Custom size PDF generated successfully");
    }
}
// NuGet: Install-Package IronPdf
using System;
using IronPdf;
using IronPdf.Rendering;

class IronPdfCustomSize
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();

        renderer.RenderingOptions.PaperSize = PdfPaperSize.Letter;
        renderer.RenderingOptions.MarginTop = 50;
        renderer.RenderingOptions.MarginBottom = 50;

        var html = "<html><body><h1>Custom Size PDF</h1></body></html>";
        var pdf = renderer.RenderHtmlAsPdf(html);

        pdf.SaveAs("custom-size.pdf");
        Console.WriteLine("Custom size PDF generated successfully");
    }
}
$vbLabelText   $csharpLabel

Gotenberg는 문자열 기반의 매개변수 ("8.5", "11", "0.5")를 multipart form data에 추가합니다. 용지의 치수는 인치 단위입니다. 각 매개변수는 별도의 Add() 호출로, 타입 체크나 IntelliSense 지원이 없습니다.

IronPDF는 RenderingOptions에 있는 유형화된 프로퍼티를 사용합니다. PaperSize은 (PdfPaperSize.Letter) enum을 허용하며, 여백은 밀리미터 단위의 숫자 값입니다. 타입화된 API는 컴파일 타임 검사 및 IDE 지원을 제공합니다.

IronPDF 튜토리얼에서 렌더링 구성에 대해 더 알아보세요.

API 매핑 참조

Gotenberg 마이그레이션을 평가하거나 기능을 비교하는 개발자를 위해 이 매핑은 동등한 동작을 보여줍니다:

엔드포인트에서 메서드 매핑

Gotenberg 라우트IronPDF 동등
POST /forms/chromium/convert/htmlChromePdfRenderer.RenderHtmlAsPdf()
POST /forms/chromium/convert/urlChromePdfRenderer.RenderUrlAsPdf()
POST /forms/chromium/convert/markdown먼저 Markdown을 HTML로 렌더링
POST /forms/pdfengines/mergePdfDocument.Merge()
POST /forms/pdfengines/metadata/readpdf.MetaData
POST /forms/pdfengines/metadata/writepdf.MetaData.Author = "..."
GET /health해당 없음

양식 매개변수에서 RenderingOptions 매핑

Gotenberg 매개변수IronPDF 속성변환 참고사항
paperWidth (인치)RenderingOptions.SetCustomPaperSizeInInches()사용자 정의 메서드를 사용
paperHeight (인치)RenderingOptions.SetCustomPaperSizeInInches()사용자 정의 메서드를 사용
marginTop (인치)RenderingOptions.MarginTop밀리미터로 변환하기 위해 25.4를 곱하십시오.
marginBottom (인치)RenderingOptions.MarginBottom밀리미터로 변환하기 위해 25.4를 곱하십시오.
marginLeft (인치)RenderingOptions.MarginLeft밀리미터로 변환하기 위해 25.4를 곱하십시오.
marginRight (인치)RenderingOptions.MarginRight밀리미터로 변환하기 위해 25.4를 곱하십시오.
printBackgroundRenderingOptions.PrintHtmlBackgroundsBoolean
landscapeRenderingOptions.PaperOrientationLandscape enum
scaleRenderingOptions.Zoom퍼센트(100 = 1.0)
waitDelayRenderingOptions.RenderDelay밀리초로 변환
emulatedMediaTypeRenderingOptions.CssMediaTypeScreen 또는 Print

단위 변환을 유의하세요: Gotenberg는 여백에 인치를 사용하고 (예: "0.5" = 0.5 인치 = 12.7mm), IronPDF는 밀리미터를 사용합니다.

인프라 비교

GotenbergDocker 컴포즈

Gotenberg는 컨테이너 인프라를 요구합니다:

#Gotenbergrequires container management
version: '3.8'
services:
  app:
    depends_on:
      - gotenberg
    environment:
      - GOTENBERG_URL=http://gotenberg:3000

  gotenberg:
    image: gotenberg/gotenberg:8
    ports:
      - "3000:3000"
    deploy:
      resources:
        limits:
          memory: 2G
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:3000/health"]
      interval: 30s
#Gotenbergrequires container management
version: '3.8'
services:
  app:
    depends_on:
      - gotenberg
    environment:
      - GOTENBERG_URL=http://gotenberg:3000

  gotenberg:
    image: gotenberg/gotenberg:8
    ports:
      - "3000:3000"
    deploy:
      resources:
        limits:
          memory: 2G
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:3000/health"]
      interval: 30s
YAML

IronPDF구성

IronPDF는 추가 서비스가 필요하지 않습니다:

#IronPDF- No additional services needed
version: '3.8'
services:
  app:
    environment:
      - IRONPDF_LICENSE_KEY=${IRONPDF_LICENSE_KEY}
# NoGotenbergservice. No health checks. No resource limits.
#IronPDF- No additional services needed
version: '3.8'
services:
  app:
    environment:
      - IRONPDF_LICENSE_KEY=${IRONPDF_LICENSE_KEY}
# NoGotenbergservice. No health checks. No resource limits.
YAML

인프라 차이는 큽니다: Gotenberg는 컨테이너 배포, 상태 모니터링, 자원 할당 및 서비스 종속성을 요구합니다. IronPDF는 애플리케이션과 인프로세스에서 실행됩니다.

성능 특성

작업Gotenberg (따뜻한 컨테이너)Gotenberg (콜드 스타트)IronPDF (첫 번째 렌더)IronPDF (후속)
간단한 HTML150-300ms2-5초1-2초50-150ms
복잡한 HTML500-1500ms3-7초1.5-3초200-800ms
URL 렌더링1-5초3-10초1-5초500ms-3s
PDF 병합200-500ms2-5초100-300ms100-300ms

Gotenberg의 네트워크 왕복은 요청당 10-100ms+를 추가합니다. 컨테이너 콜드 스타트는 2-5초를 추가합니다. IronPDF의 첫 번째 렌더링은 Chromium 초기화(1-2초)를 발생시키지만, 이후 렌더링에는 최소한의 오버헤드가 있습니다.

팀이 Gotenberg에서 IronPDF로 이동을 고려하는 시점

개발 팀은 여러 가지 이유로 Gotenberg에서 IronPDF로의 전환을 평가합니다:

인프라 오버헤드: Gotenberg는 Docker, 컨테이너 오케스트레이션(Kubernetes/Docker Compose), 서비스 검색 및 부하 분산을 필요로 합니다. 더 간단한 배포를 원하는 팀은 IronPDF의 NuGet 전용 접근 방식이 이러한 인프라 문제를 제거한다고 느낍니다.

네트워크 지연: 모든GotenbergPDF 작업은 별도의 서비스에 대한 HTTP 호출이 필요하여 요청당 10-100ms+를 추가합니다. 대량 응용 프로그램에서 이 오버헤드는 누적됩니다. IronPDF의 인프로세스 접근 방식은 초기화 후 거의 오버헤드가 없습니다.

콜드 스타트 문제: 컨테이너 시작은 첫 번째 요청에 2-5초를 추가할 수 있습니다. 심지어 웜 컨테이너도 네트워크 오버헤드를 가집니다. 모든 포드 재시작, 스케일 업 이벤트 또는 배포는 콜드 스타트를 유발합니다. IronPDF의 콜드 스타트는 애플리케이션 수명당 한 번 발생합니다.

운영 복잡성: Gotenberg는 별개의 문제로 컨테이너 상태, 스케일링, 로깅 및 모니터링을 관리하는 것을 요구합니다. 네트워크 타임아웃, 서비스 비가용성 및 컨테이너 충돌은 애플리케이션 문제로 발전합니다. IronPDF는 표준 .NET 예외 처리를 사용합니다.

Multipart Form Data API: 모든Gotenberg요청은 문자열 기반 매개변수가 포함된 multipart/form-data 페이로드를 구성해야 합니다. 이는 장황하고 컴파일 시간 타입 체크가 없습니다. IronPDF는 IntelliSense 지원이 있는 형식화된 C# 속성을 제공합니다.

버전 관리:Gotenberg이미지는 애플리케이션과 별도로 업데이트됩니다. API 변경은 통합을 깨뜨릴 수 있습니다.IronPDF버전은 표준 .NET 종속성 관리로 NuGet을 통해 관리됩니다.

강점과 고려사항

Gotenberg강점

  • 폴리글랏 아키텍처: HTTP 호출이 가능한 모든 언어와 호환됩니다.
  • 언어 무관: .NET 생태계에 묶여 있지 않습니다.
  • MIT 라이선스: 무료 및 오픈 소스
  • 마이크로서비스 패턴: 컨테이너화된 아키텍처와 적합합니다.

Gotenberg고려사항

  • 인프라 오버헤드: Docker, Kubernetes, 로드 밸런서가 필요합니다.
  • 네트워크 지연: 요청당 10-100ms+
  • 콜드 스타트: 2-5초 컨테이너 초기화
  • 문자열 기반 API: 타입 안전성이나 IntelliSense가 없습니다.
  • 분산 디버깅: 분산 추적이 필요합니다.
  • 상태 모니터링: 관리해야 할 추가 엔드포인트

IronPDF강점

  • 제로 인프라: NuGet 패키지만 필요
  • 인프로세스 성능: 초기화 후 네트워크 지연 없음
  • 타입 안전 API: IntelliSense를 사용하는 강하게 타입화된 속성
  • 표준 디버깅: 일반 .NET 디버거 작동
  • 포괄적인 리소스: 광범위한 튜토리얼문서
  • 전문 지원: 상업용 라이선스에 지원 포함

IronPDF고려 사항

  • .NET 전용: .NET 생태계에 맞게 설계
  • 상업적 라이선스: 제작 사용에 필요

Gotenberg와 IronPDF는 .NET 애플리케이션에서 PDF 생성에 대해 근본적으로 다른 접근 방식을 취합니다. Gotenberg의 Docker 기반 마이크로서비스 아키텍처는 컨테이너 관리, 네트워크 지연, 운영 복잡성을 도입합니다. 모든 PDF 작업에는 관련된 실패 모드와 콜드 스타트 페널티가 있는 HTTP 통신이 필요합니다.

IronPDF는 인프로세스 라이브러리로서 동일한 Chromium 기반 렌더링을 제공합니다. NuGet 패키지는 Docker 컨테이너, 네트워크 호출 및 인프라 관리를 제거합니다. 타입화된 C# API가 문자열 기반 멀티파트 폼 데이터를 대체합니다. 표준 .NET 예외 처리가 HTTP 상태 코드와 네트워크 실패 모드를 대체합니다.

.NET 10, C# 14 및 2026년까지의 애플리케이션 개발을 계획하는 조직들은 마이크로서비스 인프라의 오버헤드와 인프로세스 라이브러리의 단순성 간의 선택이 배포 및 운영 복잡성에 큰 영향을 미친다고 봅니다. HTML/CSS/JavaScript 렌더링 충실도를 유지하면서 인프라 부담을 줄이려는 팀에게는 IronPDF가 이러한 요구 사항을 효과적으로 충족합니다.

IronPDF 평가를 무료 체험판으로 시작하고 포괄적인 문서를 탐색하여 특정 요구 사항에 적합한지 평가하세요.