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 위에 직접 구축한 대로 이루어집니다. 그 모양은 프로덕션에서 실제로 제한이 있습니다:
-
운영할 컨테이너: 앱에서 접근 가능한 위치에서
kaizenio.azurecr.io/html-to-pdf:latest를 실행, 모니터링, 업데이트합니다 — 로컬 Docker, 사이드카 또는 별도의 호스트. -
.NET SDK 없음: 모든 C# 호출은 직접 구현한
HttpClientPOST + JSON입니다. IntelliSense도 없고 요청 모양에 대한 컴파일 타임 검사도 없습니다. -
작은 v1.x API 영역: 문서화된 JSON 본문은
html필드만 허용합니다. URL-to-PDF, 사용자 지정 스타일 시트, 헤더/푸터, 페이지 크기, 방향, 여백은 출시 기능이 아닌 로드맵 항목으로 나열됩니다 — HTML 문자열 렌더링을 초과하는 모든 것은 일반적으로 CSS 및 절대 위치 div를 통해 HTML 내부에 표현해야 합니다@page. -
쪽 번호 지원 없음: API에는
{page}/{total}대체자이 없으므로 'Page X of Y' 푸터는 서버 측에서 생성할 수 없습니다. -
PDF 당 HTTP 왕복: 심지어
localhost에서 컨테이너가 실행 중일 때도, 모든 PDF는 JSON 직렬화 및 소켓 홉 비용을 지불합니다. - 무료 계층에 워터마크: 컨테이너에서
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
시작하기 전에
필수 조건
- .NET Environment: .NET Framework 4.6.2+ or .NET Core 3.1+ / .NET 5+
- NuGet 접근 권한: NuGet 패키지를 설치할 수 있는 능력
- 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
라이선스 구성
// 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"
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" .
완전한 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
이후 (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
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
이후 (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
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
이후 (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
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()
플레이스홀더 구문
이전에 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
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);
문제 해결
문제 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)
문제 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
문제 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}"
}
이전에 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>")
마이그레이션 체크리스트
사전 마이그레이션
- 모든 Kaizen 호출 위치 찾기 (검색:
html-to-pdf,KAIZEN_PDF_LICENSE,kaizenio.azurecr.io,localhost:8080) - 크기, 방향, 여백에 사용되는 인라인
@pageCSS 문서화 - 가짜 머리글/꼬리글 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제거 IronPdfNuGet Install-Package (dotnet add package IronPdf)
코드 변경 사항
- 시작 시 라이선스 키 구성 추가
HttpClientPOST를ChromePdfRenderer로 교체- 임베디드
@pageCSS를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 컨테이너 인프라 해체
- 환경 변수 / 비밀 업데이트
- 모니터링/알림에서 컨테이너 상태 확인 제거
- 새로운 형식의 예외 오류 패턴 문서화

