푸터 콘텐츠로 바로가기
마이그레이션 가이드

C#에서 Kaizen.io에서 IronPDF로 마이그레이션하는 방법

Kaizen.io HTML-to-PDF에서 IronPDF로의 마이그레이션은 HTTP를 통해 노출된 자가 호스팅 Docker 컨테이너를 인 프로세스 .NET 라이브러리로 대체합니다. Kaizen.io HTML-to-PDF는 kaizenio.azurecr.io/html-to-pdf Docker 이미지이자 포트 8080의 POST /html-to-pdf REST 엔드포인트로만 배포됩니다. 공식 .NET SDK나 NuGet 패키지는 없으므로, 모든 C# 호출은 실행 중인 컨테이너에 대해 직접 구현해야 합니다 HttpClient. 이 가이드는 해당 패턴을 IronPDF의 ChromePdfRenderer로 교체하는 방법을 안내합니다.

Kaizen.io에서 IronPDF로 마이그레이션하는 이유

컨테이너 API 문제

Kaizen.io HTML-to-PDF는 의도적으로 작게 설계된 v1.x API와 함께 제공되는 Docker 컨테이너입니다. C# 통합은 여러분이 HttpClient 위에 직접 구축한 대로 이루어집니다. 그 모양은 프로덕션에서 실제로 제한이 있습니다:

  1. 운영할 컨테이너: 앱에서 접근 가능한 위치에서 kaizenio.azurecr.io/html-to-pdf:latest를 실행, 모니터링, 업데이트합니다 — 로컬 Docker, 사이드카 또는 별도의 호스트.

  2. .NET SDK 없음: 모든 C# 호출은 직접 구현한 HttpClient POST + JSON입니다. IntelliSense도 없고 요청 모양에 대한 컴파일 타임 검사도 없습니다.

  3. 작은 v1.x API 영역: 문서화된 JSON 본문은 html 필드만 허용합니다. URL-to-PDF, 사용자 지정 스타일 시트, 헤더/푸터, 페이지 크기, 방향, 여백은 출시 기능이 아닌 로드맵 항목으로 나열됩니다 — HTML 문자열 렌더링을 초과하는 모든 것은 일반적으로 CSS 및 절대 위치 div를 통해 HTML 내부에 표현해야 합니다 @page.

  4. 쪽 번호 지원 없음: API에는 {page}/ {total}대체자이 없으므로 'Page X of Y' 푸터는 서버 측에서 생성할 수 없습니다.

  5. PDF 당 HTTP 왕복: 심지어 localhost에서 컨테이너가 실행 중일 때도, 모든 PDF는 JSON 직렬화 및 소켓 홉 비용을 지불합니다.

  6. 무료 계층에 워터마크: 컨테이너에서 KAIZEN_PDF_LICENSE 환경 변수를 설정하지 않으면 출력에 워터마크가 표시됩니다.

Kaizen.io vsIronPDF비교

기능 Kaizen.io HTML-to-PDF IronPDF
배포 Docker 이미지 kaizenio.azurecr.io/html-to-pdf NuGet IronPdf
C# 통합 직접 구현한 HttpClient POST (SDK 없음) 강력한 형식의 ChromePdfRenderer API
프로세스 모델 아웃 오브 프로세스 컨테이너 인프로세스
엔드포인트 표면 (v1.x) POST /html-to-pdf with { "html": ... } HTML, 파일, URL을 위한 메서드들
URL 입력 로드맵 RenderUrlAsPdf(url)
헤더/푸터 v1.x API에 없음; 고정 위치 CSS로 처리 TextHeader/Footer and HtmlHeader/Footer
페이지 번호 지원되지 않음 {page}and {total-pages}대체자
페이지 크기/방향 @page CSS를 HTML에 삽입 RenderingOptions.PaperSize etc.
라이센스 1회 사용 라이선스; 워터마크된 무료 티어 상업적 (연간 또는 영구)

현대적인 .NET을 표준화하는 팀에게 IronPDF는 사이드카 컨테이너와 HTTP 홉을 요청 경로에서 제거하며 강력히 타입화된 구성 표면을 제공합니다.


마이그레이션 복잡성 평가

기능별 예상 노력

기능 마이그레이션 복잡성
기본 HTML을 PDF로 매우 낮음
HTML 파일을 PDF로 매우 낮음
URL을 PDF로 변환 낮음 (Kaizen v1.x에는 URL 엔드포인트가 없음 — 해결 방법 전체 대체됨)
헤더/푸터 중간 (가짜 CSS div들이 실제 헤더 영역으로 대체)
페이지 번호 새로운 기능 (Kaizen v1.x에서는 사용 불가)
페이지 설정 낮음 (@page CSS를 RenderingOptions로 이동)

패러다임 전환

아웃 프로세스 HTTP 호출에서 Docker 컨테이너로의 근본적인 변화부터 인 프로세스 렌더링까지:

Kaizen.io:  HttpClient.PostAsync("http://.../html-to-pdf", { html }) → byte[]
IronPDF:    ChromePdfRenderer → RenderHtmlAsPdf(html) → PdfDocument

시작하기 전에

필수 조건

  1. .NET Environment: .NET Framework 4.6.2+ or .NET Core 3.1+ / .NET 5+
  2. NuGet 접근 권한: NuGet 패키지를 설치할 수 있는 능력
  3. IronPDF 라이선스: ironpdf.com에서 라이선스 키를 획득하세요

패키지 변경 사항

제거할 Kaizen NuGet 패키지는 없습니다 — Kaizen은 Docker 이미지로만 제공됩니다. 컨테이너를 중지하고IronPDF패키지를 추가하세요:

# Stop and remove the running Kaizen container (if any)
docker stop kaizen-pdf
docker rm kaizen-pdf

# Install IronPDF
dotnet add package IronPdf
# Stop and remove the running Kaizen container (if any)
docker stop kaizen-pdf
docker rm kaizen-pdf

# Install IronPDF
dotnet add package IronPdf
SHELL

라이선스 구성

// Add at application startup (Program.cs or Startup.cs)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
// Add at application startup (Program.cs or Startup.cs)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
' Add at application startup (Program.vb or Startup.vb)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
$vbLabelText   $csharpLabel

Kaizen.io 사용 식별

Kaizen에는 SDK가 없으므로, 호출은 일반적인 HttpClient POST와 같이 보입니다. 엔드포인트, 이미지 이름 및 라이선스 환경 변수를 네임스페이스 대신 검색하세요:

grep -r "html-to-pdf\|KAIZEN_PDF_LICENSE\|kaizenio.azurecr.io\|localhost:8080" \
  --include="*.cs" --include="*.json" --include="*.yml" .
grep -r "html-to-pdf\|KAIZEN_PDF_LICENSE\|kaizenio.azurecr.io\|localhost:8080" \
  --include="*.cs" --include="*.json" --include="*.yml" .
SHELL

완전한 API 참조

개념 매핑

매핑할 Kaizen .NET 클래스는 없으며, 오직 JSON 요청 모양과 그 주위에 구축한 규칙만 존재합니다.

Kaizen.io 개념 IronPDF 동등
HttpClient + POST /html-to-pdf ChromePdfRenderer
JSON { "html": "..." }본문 RenderHtmlAsPdf(string html)
(No URL field in v1.x) RenderUrlAsPdf(string url)
(No file field in v1.x) RenderHtmlFileAsPdf(string path)
크기용 인라인 @page CSS RenderingOptions.PaperSize
방향용 인라인 @page CSS RenderingOptions.PaperOrientation
인라인 @page { margin: ... } RenderingOptions.MarginTop/Bottom/Left/Right
고정 위치
RenderingOptions.TextHeader / HtmlHeader
고정 위치 RenderingOptions.TextFooter / HtmlFooter
HttpClient.PostAsync RenderHtmlAsPdfAsync
컨테이너 환경 변수 KAIZEN_PDF_LICENSE IronPdf.License.LicenseKey
HTTP byte[] 응답 pdf.BinaryData / pdf.SaveAs(path)

플레이스홀더 매핑

Kaizen v1.x에는 서버 측 플레이스홀더가 없습니다. 이전에 POST하기 전에 HTML에 문자열을 수동으로 대체했다면, IronPDF의 렌더 타임 플레이스홀더로 전환하십시오:

당신이 하던 일 IronPDF 플레이스홀더
html.Replace("{page}", currentPage.ToString()) {page}
html.Replace("{total}", total.ToString()) {total-pages}
html.Replace("{date}", DateTime.Now.ToShortDateString()) {date}
html.Replace("{title}", docTitle) {html-title}

코드 마이그레이션 예제

예제 1: 기본 HTML에서 PDF로

이전 (Kaizen.io — 컨테이너에 JSON POST):

// Container must be running:
//   docker run -d -p 8080:8080 -e KAIZEN_PDF_LICENSE=... \
//     kaizenio.azurecr.io/html-to-pdf:latest
using System.IO;
using System.Net.Http;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        using var http = new HttpClient();
        var payload = JsonSerializer.Serialize(new { html = "<html><body><h1>Hello World</h1></body></html>" });
        var content = new StringContent(payload, Encoding.UTF8, "application/json");
        var response = await http.PostAsync("http://localhost:8080/html-to-pdf", content);
        response.EnsureSuccessStatusCode();
        var pdfBytes = await response.Content.ReadAsByteArrayAsync();
        File.WriteAllBytes("output.pdf", pdfBytes);
    }
}
// Container must be running:
//   docker run -d -p 8080:8080 -e KAIZEN_PDF_LICENSE=... \
//     kaizenio.azurecr.io/html-to-pdf:latest
using System.IO;
using System.Net.Http;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        using var http = new HttpClient();
        var payload = JsonSerializer.Serialize(new { html = "<html><body><h1>Hello World</h1></body></html>" });
        var content = new StringContent(payload, Encoding.UTF8, "application/json");
        var response = await http.PostAsync("http://localhost:8080/html-to-pdf", content);
        response.EnsureSuccessStatusCode();
        var pdfBytes = await response.Content.ReadAsByteArrayAsync();
        File.WriteAllBytes("output.pdf", pdfBytes);
    }
}
Imports System.IO
Imports System.Net.Http
Imports System.Text
Imports System.Text.Json
Imports System.Threading.Tasks

Module Program
    Async Function Main() As Task
        Using http As New HttpClient()
            Dim payload = JsonSerializer.Serialize(New With {.html = "<html><body><h1>Hello World</h1></body></html>"})
            Dim content As New StringContent(payload, Encoding.UTF8, "application/json")
            Dim response = Await http.PostAsync("http://localhost:8080/html-to-pdf", content)
            response.EnsureSuccessStatusCode()
            Dim pdfBytes = Await response.Content.ReadAsByteArrayAsync()
            File.WriteAllBytes("output.pdf", pdfBytes)
        End Using
    End Function
End Module
$vbLabelText   $csharpLabel

이후 (IronPDF):

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

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var html = "<html><body><h1>Hello World</h1></body></html>";
        var pdf = renderer.RenderHtmlAsPdf(html);
        pdf.SaveAs("output.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System.IO;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var html = "<html><body><h1>Hello World</h1></body></html>";
        var pdf = renderer.RenderHtmlAsPdf(html);
        pdf.SaveAs("output.pdf");
    }
}
Imports IronPdf
Imports System.IO

Class Program
    Shared Sub Main()
        Dim renderer = New ChromePdfRenderer()
        Dim html = "<html><body><h1>Hello World</h1></body></html>"
        Dim pdf = renderer.RenderHtmlAsPdf(html)
        pdf.SaveAs("output.pdf")
    End Sub
End Class
$vbLabelText   $csharpLabel

Kaizen.io 접근 방식은 JSON을 시리얼라이즈하고, 컨테이너의 REST 엔드포인트에 POST하며, 상태 코드를 확인하고, 응답을 바이트로 읽어 디스크에 씁니다. IronPDF의 ChromePdfRenderer는 프로세스 내에서 실행됩니다 — RenderHtmlAsPdf()PdfDocument를 반환하며, SaveAs() 메서드를 포함하여 왕복 및 수동 바이트 처리 작업이 사라집니다. HTML to PDF 문서에서 추가 렌더링 옵션을 참조하십시오.

예제 2: 페이지 설정과 함께 HTML 파일을 PDF로

Kaizen v1.x에는 파일 엔드포인트 및 페이지 레이아웃 필드가 없습니다 — 파일을 직접 읽고 @page CSS에 페이지 크기/방향을 삽입합니다.

이전 (Kaizen.io):

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

class Program
{
    static async Task Main()
    {
        var body = File.ReadAllText("input.html");
        var html = "<style>@page { size: A4 portrait; }</style>" + body;

        using var http = new HttpClient();
        var payload = JsonSerializer.Serialize(new { html });
        var response = await http.PostAsync(
            "http://localhost:8080/html-to-pdf",
            new StringContent(payload, Encoding.UTF8, "application/json"));
        response.EnsureSuccessStatusCode();
        File.WriteAllBytes("document.pdf", await response.Content.ReadAsByteArrayAsync());
    }
}
using System.IO;
using System.Net.Http;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        var body = File.ReadAllText("input.html");
        var html = "<style>@page { size: A4 portrait; }</style>" + body;

        using var http = new HttpClient();
        var payload = JsonSerializer.Serialize(new { html });
        var response = await http.PostAsync(
            "http://localhost:8080/html-to-pdf",
            new StringContent(payload, Encoding.UTF8, "application/json"));
        response.EnsureSuccessStatusCode();
        File.WriteAllBytes("document.pdf", await response.Content.ReadAsByteArrayAsync());
    }
}
Imports System.IO
Imports System.Net.Http
Imports System.Text
Imports System.Text.Json
Imports System.Threading.Tasks

Module Program
    Async Function Main() As Task
        Dim body = File.ReadAllText("input.html")
        Dim html = "<style>@page { size: A4 portrait; }</style>" & body

        Using http As New HttpClient()
            Dim payload = JsonSerializer.Serialize(New With {Key .html = html})
            Dim response = Await http.PostAsync(
                "http://localhost:8080/html-to-pdf",
                New StringContent(payload, Encoding.UTF8, "application/json"))
            response.EnsureSuccessStatusCode()
            File.WriteAllBytes("document.pdf", Await response.Content.ReadAsByteArrayAsync())
        End Using
    End Function
End Module
$vbLabelText   $csharpLabel

이후 (IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
        renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Portrait;
        var pdf = renderer.RenderHtmlFileAsPdf("input.html");
        pdf.SaveAs("document.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
        renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Portrait;
        var pdf = renderer.RenderHtmlFileAsPdf("input.html");
        pdf.SaveAs("document.pdf");
    }
}
Imports IronPdf

Class Program
    Shared Sub Main()
        Dim renderer = New ChromePdfRenderer()
        renderer.RenderingOptions.PaperSize = PdfPaperSize.A4
        renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Portrait
        Dim pdf = renderer.RenderHtmlFileAsPdf("input.html")
        pdf.SaveAs("document.pdf")
    End Sub
End Class
$vbLabelText   $csharpLabel

RenderHtmlFileAsPdf()가 파일을 직접 읽고, 페이지 크기 및 방향은 인라인 @page CSS에서 RenderingOptions 속성으로 이동합니다.

예제 3: 헤더와 푸터가 있는 URL을 PDF로 전환

Kaizen v1.x에는 ConvertUrl, 헤더/푸터 필드, 페이지 번호 대체자가 없습니다. 해결 방법은 페이지를 직접 가져온 후 @page CSS와 고정 위치 div로 감싸 가짜 헤더/푸터를 생성하는 것입니다 — 페이지 번호는 렌더링할 수 없습니다.

이전 (Kaizen.io):

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

class Program
{
    static async Task Main()
    {
        using var http = new HttpClient();
        var page = await http.GetStringAsync("https://example.com");
        var html = $@"<!doctype html><html><head><style>
            @page {{margin: 20mm;}}
            .h {{position: fixed; top: -15mm; left: 0; right: 0; text-align: center;}}
            .f {{position: fixed; bottom: -15mm; left: 0; right: 0; text-align: center;}}
        </style></head><body>
            <div class='h'>Company Header</div>
            <div class='f'>Footer (page numbers unsupported in Kaizen v1.x)</div>
            {page}
        </body></html>";

        var payload = JsonSerializer.Serialize(new { html });
        var response = await http.PostAsync(
            "http://localhost:8080/html-to-pdf",
            new StringContent(payload, Encoding.UTF8, "application/json"));
        response.EnsureSuccessStatusCode();
        File.WriteAllBytes("webpage.pdf", await response.Content.ReadAsByteArrayAsync());
    }
}
using System.IO;
using System.Net.Http;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        using var http = new HttpClient();
        var page = await http.GetStringAsync("https://example.com");
        var html = $@"<!doctype html><html><head><style>
            @page {{margin: 20mm;}}
            .h {{position: fixed; top: -15mm; left: 0; right: 0; text-align: center;}}
            .f {{position: fixed; bottom: -15mm; left: 0; right: 0; text-align: center;}}
        </style></head><body>
            <div class='h'>Company Header</div>
            <div class='f'>Footer (page numbers unsupported in Kaizen v1.x)</div>
            {page}
        </body></html>";

        var payload = JsonSerializer.Serialize(new { html });
        var response = await http.PostAsync(
            "http://localhost:8080/html-to-pdf",
            new StringContent(payload, Encoding.UTF8, "application/json"));
        response.EnsureSuccessStatusCode();
        File.WriteAllBytes("webpage.pdf", await response.Content.ReadAsByteArrayAsync());
    }
}
Imports System.IO
Imports System.Net.Http
Imports System.Text
Imports System.Text.Json
Imports System.Threading.Tasks

Module Program
    Async Function Main() As Task
        Using http As New HttpClient()
            Dim page As String = Await http.GetStringAsync("https://example.com")
            Dim html As String = $"<!doctype html><html><head><style>
                @page {{margin: 20mm;}}
                .h {{position: fixed; top: -15mm; left: 0; right: 0; text-align: center;}}
                .f {{position: fixed; bottom: -15mm; left: 0; right: 0; text-align: center;}}
            </style></head><body>
                <div class='h'>Company Header</div>
                <div class='f'>Footer (page numbers unsupported in Kaizen v1.x)</div>
                {page}
            </body></html>"

            Dim payload As String = JsonSerializer.Serialize(New With {Key .html = html})
            Dim response As HttpResponseMessage = Await http.PostAsync(
                "http://localhost:8080/html-to-pdf",
                New StringContent(payload, Encoding.UTF8, "application/json"))
            response.EnsureSuccessStatusCode()
            File.WriteAllBytes("webpage.pdf", Await response.Content.ReadAsByteArrayAsync())
        End Using
    End Function
End Module
$vbLabelText   $csharpLabel

이후 (IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        renderer.RenderingOptions.TextHeader.CenterText = "Company Header";
        renderer.RenderingOptions.TextFooter.CenterText = "Page {page} of {total-pages}";
        renderer.RenderingOptions.MarginTop = 20;
        renderer.RenderingOptions.MarginBottom = 20;
        var pdf = renderer.RenderUrlAsPdf("https://example.com");
        pdf.SaveAs("webpage.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        renderer.RenderingOptions.TextHeader.CenterText = "Company Header";
        renderer.RenderingOptions.TextFooter.CenterText = "Page {page} of {total-pages}";
        renderer.RenderingOptions.MarginTop = 20;
        renderer.RenderingOptions.MarginBottom = 20;
        var pdf = renderer.RenderUrlAsPdf("https://example.com");
        pdf.SaveAs("webpage.pdf");
    }
}
Imports IronPdf

Class Program
    Shared Sub Main()
        Dim renderer = New ChromePdfRenderer()
        renderer.RenderingOptions.TextHeader.CenterText = "Company Header"
        renderer.RenderingOptions.TextFooter.CenterText = "Page {page} of {total-pages}"
        renderer.RenderingOptions.MarginTop = 20
        renderer.RenderingOptions.MarginBottom = 20
        Dim pdf = renderer.RenderUrlAsPdf("https://example.com")
        pdf.SaveAs("webpage.pdf")
    End Sub
End Class
$vbLabelText   $csharpLabel

RenderUrlAsPdf()는 URL을 직접 가져와 렌더링하며 — 클라이언트 측 페이지 가져오기 없음 — 가짜 고정 위치 div는 TextHeader / TextFooter 영역으로 대체됩니다. 페이지 번호는 {page}{total-pages}대체자를 통해 생성되며, 이는 Kaizen v1.x에서 제공하지 않습니다. URL to PDF 변환헤더 및 푸터에 대해 더 알아보십시오.


중요한 마이그레이션 노트

라이선스는 코드에 있고 컨테이너에 있지 않습니다

Kaizen의 라이선스는 Docker 컨테이너의 KAIZEN_PDF_LICENSE 환경 변수를 통해 설정됩니다. IronPDF의 라이선스는 애플리케이션 시작 시 한 번 설정되는 정적 속성입니다:

// DELETE the Kaizen container env var:
//   docker run ... -e KAIZEN_PDF_LICENSE=... kaizenio.azurecr.io/html-to-pdf

// IronPDF: set once at startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
var renderer = new ChromePdfRenderer();
// DELETE the Kaizen container env var:
//   docker run ... -e KAIZEN_PDF_LICENSE=... kaizenio.azurecr.io/html-to-pdf

// IronPDF: set once at startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
var renderer = new ChromePdfRenderer();
' DELETE the Kaizen container env var:
'   docker run ... -e KAIZEN_PDF_LICENSE=... kaizenio.azurecr.io/html-to-pdf

' IronPDF: set once at startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
Dim renderer As New ChromePdfRenderer()
$vbLabelText   $csharpLabel

플레이스홀더 구문

이전에 POST하기 전에 HTML에 문자열을 수동으로 대체했다면, IronPDF의 렌더 타임 플레이스홀더로 전환하십시오:

  • {page}(변경 없음)
  • {total}{total-pages}
  • {title}{html-title}
  • {date}{date}(변경 없음)

반환 타입 변경

Kaizen은 HTTP를 통해 원시 바이트를 반환합니다. IronPDF는 PdfDocument를 반환합니다:

// Kaizen.io returns byte[] via HTTP
byte[] pdfBytes = await response.Content.ReadAsByteArrayAsync();
File.WriteAllBytes("output.pdf", pdfBytes);

//IronPDF returns PdfDocument
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");           // Direct save
byte[] bytes = pdf.BinaryData;      // Or get bytes if needed
// Kaizen.io returns byte[] via HTTP
byte[] pdfBytes = await response.Content.ReadAsByteArrayAsync();
File.WriteAllBytes("output.pdf", pdfBytes);

//IronPDF returns PdfDocument
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");           // Direct save
byte[] bytes = pdf.BinaryData;      // Or get bytes if needed
Imports System.IO

' Kaizen.io returns Byte() via HTTP
Dim pdfBytes As Byte() = Await response.Content.ReadAsByteArrayAsync()
File.WriteAllBytes("output.pdf", pdfBytes)

' IronPDF returns PdfDocument
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("output.pdf")           ' Direct save
Dim bytes As Byte() = pdf.BinaryData ' Or get bytes if needed
$vbLabelText   $csharpLabel

HTTP 배관 삭제

렌더러가 인 프로세스가 되면, 지원 코드가 사라집니다:

// DELETE all of:
// - HttpClient lifetime management
// - JSON serialization of { html }
// - response.EnsureSuccessStatusCode() / status-code branches
// - "container unreachable" retry/backoff
// - ReadAsByteArrayAsync()

// Replaced with a single in-process call:
var pdf = renderer.RenderHtmlAsPdf(html);
// DELETE all of:
// - HttpClient lifetime management
// - JSON serialization of { html }
// - response.EnsureSuccessStatusCode() / status-code branches
// - "container unreachable" retry/backoff
// - ReadAsByteArrayAsync()

// Replaced with a single in-process call:
var pdf = renderer.RenderHtmlAsPdf(html);
$vbLabelText   $csharpLabel

문제 해결

문제 1: HtmlToPdfConverter 클래스 없음

문제: 대체할 HtmlToPdfConverter 클래스가 없습니다 — Kaizen에는 .NET SDK가 전혀 없습니다.

해결책: HttpClient 컨테이너에 대한 POST에서 ChromePdfRenderer로의 마이그레이션이 필요합니다:

// Kaizen.io: hand-rolled HTTP
using var http = new HttpClient();
var response = await http.PostAsync("http://localhost:8080/html-to-pdf", content);

// IronPDF: in-process renderer
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
// Kaizen.io: hand-rolled HTTP
using var http = new HttpClient();
var response = await http.PostAsync("http://localhost:8080/html-to-pdf", content);

// IronPDF: in-process renderer
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
Imports System.Net.Http
Imports IronPdf

' Kaizen.io: hand-rolled HTTP
Using http As New HttpClient()
    Dim response = Await http.PostAsync("http://localhost:8080/html-to-pdf", content)
End Using

' IronPDF: in-process renderer
Dim renderer As New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf(html)
$vbLabelText   $csharpLabel

문제 2: 옵션 객체는 어디에 갔습니까?

문제: Kaizen v1.x에는 ConversionOptions가 없으며 — 페이지 레이아웃은 인라인 @page CSS였고, 헤더/푸터는 고정 위치 div였습니다.

해결책: 해당 구성을 렌더러의 RenderingOptions로 이동합니다:

// Before: <style>@page { size: A4 portrait; margin: 20mm; }</style>
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Portrait;
renderer.RenderingOptions.MarginTop = 20;
renderer.RenderingOptions.MarginBottom = 20;
// Before: <style>@page { size: A4 portrait; margin: 20mm; }</style>
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Portrait;
renderer.RenderingOptions.MarginTop = 20;
renderer.RenderingOptions.MarginBottom = 20;
' Before: <style>@page { size: A4 portrait; margin: 20mm; }</style>
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4
renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Portrait
renderer.RenderingOptions.MarginTop = 20
renderer.RenderingOptions.MarginBottom = 20
$vbLabelText   $csharpLabel

문제 3: 페이지 번호가 렌더링되지 않음

문제: Kaizen v1.x는 {page}/ {total}대체자 지원이 없으므로, 사전 마이그레이션 'Page X of Y' 푸터는 없거나 정적 텍스트였습니다.

해결책: IronPDF의 머리글/꼬리글 플레이스홀더를 사용하세요:

renderer.RenderingOptions.TextFooter = new TextHeaderFooter
{
    CenterText = "Page {page} of {total-pages}"
};
renderer.RenderingOptions.TextFooter = new TextHeaderFooter
{
    CenterText = "Page {page} of {total-pages}"
};
renderer.RenderingOptions.TextFooter = New TextHeaderFooter With {
    .CenterText = "Page {page} of {total-pages}"
}
$vbLabelText   $csharpLabel

이전에 POST하기 전에 자신의 코드에서 {total}을 직접 대체했다면, 해당 대체를 제거하십시오 — IronPDF는 렌더링 시 {total-pages}을 해결합니다.

문제 4: 컨테이너 연결 오류

문제: "컨테이너에 도달할 수 없음" / 포트 8080 오류를 처리하는 코드 경로.

해결책: IronPDF는 인 프로세스에서 실행되며 — 연결할 엔드포인트가 없습니다. 연결 오류 처리 삭제.

이슈 5: 초기 렌더링이 느림

문제: 첫 번째 PDF 생성이 1-3초가 소요됩니다.

해결책: IronPDF는 첫 사용 시 Chromium을 초기화합니다. 애플리케이션 시작 시 워밍업하세요:

// In Program.cs or Startup.cs:
new ChromePdfRenderer().RenderHtmlAsPdf("<html></html>");
// In Program.cs or Startup.cs:
new ChromePdfRenderer().RenderHtmlAsPdf("<html></html>");
' In Program.vb or Startup.vb:
Call New ChromePdfRenderer().RenderHtmlAsPdf("<html></html>")
$vbLabelText   $csharpLabel

마이그레이션 체크리스트

사전 마이그레이션

  • 모든 Kaizen 호출 위치 찾기 (검색: html-to-pdf, KAIZEN_PDF_LICENSE, kaizenio.azurecr.io, localhost:8080)
  • 크기, 방향, 여백에 사용되는 인라인 @page CSS 문서화
  • 가짜 머리글/꼬리글 div (음수 오프셋이 있는 고정 위치)를 문서화
  • 클라이언트 측 대체 목록 (html.Replace("{page}", ...) 등)
  • 컨테이너 라이프사이클 참고: pull, run, restart, license env var -IronPDF라이센스 키를 받으세요

컨테이너 해체

  • 실행 중인 Kaizen 컨테이너 멈추고 제거 (docker stop kaizen-pdf && docker rm kaizen-pdf)
  • CI/CD에서 Kaizen pull/run 단계 제거
  • 비밀/환경에서 KAIZEN_PDF_LICENSE 제거
  • IronPdf NuGet Install-Package (dotnet add package IronPdf)

코드 변경 사항

  • 시작 시 라이선스 키 구성 추가
  • HttpClient POST를 ChromePdfRenderer로 교체
  • 임베디드 @page CSS를 RenderingOptions 속성으로 이동
  • JSON POST를 RenderHtmlAsPdf() / RenderHtmlFileAsPdf() / RenderUrlAsPdf()로 교체
  • 가짜 헤더/푸터 div를 TextHeader/Footer 또는 HtmlHeader/Footer로 교체
  • 대체 구문 업데이트 ({total}{total-pages}, {title}{html-title})
  • byte[] HTTP 본문을 pdf.BinaryData로 교체
  • pdf.SaveAs() 대신 File.WriteAllBytes() 사용
  • 컨테이너 접근성 오류 처리 및 재시도/백오프 삭제

테스트

  • 모든 PDF 생성 경로 테스트
  • 머리글/꼬리글 렌더링 및 페이지 번호 확인 (새로운 기능)
  • 여백, 페이지 크기 및 방향 검증
  • 오프라인 작업 테스트 (컨테이너 필요 없음)

마이그레이션 이후

  • Kaizen 컨테이너 인프라 해체
  • 환경 변수 / 비밀 업데이트
  • 모니터링/알림에서 컨테이너 상태 확인 제거
  • 새로운 형식의 예외 오류 패턴 문서화

참고해 주세요Kaizen.io는 해당 소유자의 등록 상표입니다. 이 사이트는 Kaizen.io와 제휴하거나 인정을 받거나 후원을 받은 곳이 아닙니다. 모든 제품명, 로고 및 브랜드는 해당 소유자의 자산입니다. 비교는 정보 제공 목적으로만 사용되며, 작성 시점에 공개적으로 이용 가능한 정보를 반영합니다.

Curtis Chau
기술 문서 작성자

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

커티스는 개발 분야 외에도 사물 인터넷(IoT)에 깊은 관심을 가지고 있으며, 하드웨어와 소프트웨어를 통합하는 혁신적인 방법을 연구합니다. 여가 시간에는 게임을 즐기거나 디스코드 봇을 만들면서 기술에 대한 애정과 창의성을 결합합니다.

아이언 서포트 팀

저희는 주 5일, 24시간 온라인으로 운영합니다.
채팅
이메일
전화해