跳過到頁腳內容
MIGRATION GUIDES

How to Migrate from Kaizen.io to IronPDF in C#

從 Kaizen.io HTML-to-PDF 遷移到 IronPDF,將您的 .NET PDF 工作流程從依賴雲端服務(存在網路延遲和資料隱私問題)轉變為本機進程內庫,從而將您的資料保留在您的基礎架構內。 本指南為專業 .NET 開發人員提供了一個全面的、分步的遷移路徑,消除了對外部 API 的依賴以及按請求計費的方式。

為什麼要從 Kaizen.io 遷移到 IronPDF

基於雲端的 API 挑戰

Kaizen.io HTML 轉 PDF 服務與其他基於雲端的 PDF 服務一樣,存在一些限制,會影響生產應用:

1.對雲端的依賴:需要持續的網路連線和外部服務的可用性。 如果 Kaizen.io 服務發生故障,您的應用程式的 PDF 產生功能將停止運作。

2.資料隱私問題:敏感的 HTML 內容(包括客戶資料、財務報告和機密文件)必須傳輸到第三方伺服器進行處理。

3.網路延遲:每次產生 PDF 都會產生 100-500 毫秒或更長的網路往返延遲,這會為應用程式的回應時間帶來顯著的開銷。

4.依請求定價:成本與使用量成正比,因此大批量產生 PDF 的成本越來越高。

5.速率限制:在高流量期間,API 限速可能會導致 PDF 產生失敗或延遲,而這正是您最需要它們的時候。

6.供應商鎖定: API 變更或服務終止風險使您的應用程式容易受到外部業務決策的影響。

Kaizen.io 與 IronPDF 對比

特徵 Kaizen.io IronPDF
加工 雲端(外部伺服器) 本地(進程中)
資料隱私 向外傳輸的數據 數據永遠不會離開您的基礎設施。
延遲 網路往返時間(100-500毫秒以上) 本地處理(50-200毫秒)
可用性 取決於外部服務 100% 由您掌控
定價 按請求或訂閱 一次性或年度許可
離線模式 不可能 完整功能
速率限制 API限流 無限制
JavaScript 支持有限 完整的 Chromium 執行

對於計劃在 2025 年和 2026 年採用 .NET 10 和 C# 14 的團隊,IronPDF 提供了一個面向未來的基礎,其本地處理消除了對外部服務的依賴。


遷移複雜度評估

各功能預計工作量

特徵 遷移複雜性 筆記
基本 HTML 轉 PDF 非常低 直接替代法
HTML 檔案轉 PDF 非常低 直接替代法
PDF檔案的URL 非常低 直接替代法
頁首/頁尾 低的 佔位符語法更改
頁面設定 非常低 屬性映射
API金鑰管理 低的 完全刪除

範式轉移

Kaizen.io這次遷移的根本轉變在於從雲端API呼叫轉向本地進程內渲染:

Kaizen.io:HtmlToPdfConverter → Convert(html) → byte[](透過網路)
IronPDF:ChromePdfRenderer → RenderHtmlAsPdf(html) → PdfDocument (local)

開始之前

先決條件

  1. .NET 環境: .NET Framework 4.6.2+ 或 .NET Core 3.1+ / .NET 5/6/7/8/9+
  2. NuGet 存取權限:能夠安裝 NuGet 套件
  3. IronPDF 許可證:請從ironpdf.com取得您的許可證密鑰。

NuGet 套件變更

# Remove Kaizen.io package
dotnet remove package Kaizen.HtmlToPdf
dotnet remove package Kaizen.IO.HtmlToPdf

# Install IronPDF
dotnet add package IronPdf
# Remove Kaizen.io package
dotnet remove package Kaizen.HtmlToPdf
dotnet remove package Kaizen.IO.HtmlToPdf

# 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";
$vbLabelText   $csharpLabel

辨識 Kaizen.io 的使用情況

# Find all Kaizen.io references
grep -r "using Kaizen\|HtmlToPdfConverter\|ConversionOptions" --include="*.cs" .
grep -r "ConvertUrl\|ConvertHtml\|Kaizen" --include="*.cs" .
# Find all Kaizen.io references
grep -r "using Kaizen\|HtmlToPdfConverter\|ConversionOptions" --include="*.cs" .
grep -r "ConvertUrl\|ConvertHtml\|Kaizen" --include="*.cs" .
SHELL

完整 API 參考

類別映射

Kaizen.io 課程 IronPDF當量 筆記
HtmlToPdfConverter ChromePdfRenderer 主轉換器
ConversionOptions ChromePdfRenderOptions 透過RenderingOptions
HeaderOptions HtmlHeaderFooterTextHeaderFooter HTML/文字標題
FooterOptions HtmlHeaderFooterTextHeaderFooter HTML/文字頁腳
PageSize PdfPaperSize 紙張尺寸編號
Orientation PdfPaperOrientation 方向枚舉

方法映射

Kaizen.io 方法 IronPDF當量 筆記
converter.Convert(html) renderer.RenderHtmlAsPdf(html) 返回 PDF 文檔
converter.ConvertUrl(url) renderer.RenderUrlAsPdf(url) 直接 URL 支持
File.WriteAllBytes(path, bytes) pdf.SaveAs(path) 直接保存方法

ConversionOptions 屬性映射

Kaizen.io 物業 IronPDF當量 筆記
PageSize RenderingOptions.PaperSize 列舉值
Orientation RenderingOptions.PaperOrientation 人像/風景
MarginTop RenderingOptions.MarginTop 單位:毫米
MarginBottom RenderingOptions.MarginBottom 單位:毫米
Header.HtmlContent RenderingOptions.HtmlHeader.HtmlFragment 頭部 HTML
Footer.HtmlContent RenderingOptions.HtmlFooter.HtmlFragment 頁尾 HTML

佔位符映射

Kaizen.io佔位符 IronPDF佔位符 筆記
{page} {page} 目前頁面(相同)
{total} {total-pages} 總頁數(不同!)
{date} {date} 目前日期(相同)
{title} {html-title} 文件標題(不同!)

程式碼遷移範例

範例 1:基本 HTML 轉 PDF

(Kaizen.io 之前):

using Kaizen.IO;
using System.IO;

class Program
{
    static void Main()
    {
        var converter = new HtmlToPdfConverter();
        var html = "<html><body><h1>Hello World</h1></body></html>";
        var pdfBytes = converter.Convert(html);
        File.WriteAllBytes("output.pdf", pdfBytes);
    }
}
using Kaizen.IO;
using System.IO;

class Program
{
    static void Main()
    {
        var converter = new HtmlToPdfConverter();
        var html = "<html><body><h1>Hello World</h1></body></html>";
        var pdfBytes = converter.Convert(html);
        File.WriteAllBytes("output.pdf", pdfBytes);
    }
}
$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");
    }
}
$vbLabelText   $csharpLabel

Kaizen.io 的方法建立了一個HtmlToPdfConverter ,呼叫Convert()取得位元組數組,然後使用File.WriteAllBytes()手動將位元組寫入檔案。 這牽涉到與 Kaizen.io 雲端服務的一次網路往返。

IronPDF 的ChromePdfRenderer會在本地處理所有內容。 RenderHtmlAsPdf()方法傳回一個PdfDocument對象,該物件具有方便的SaveAs()方法-無需手動處理位元組數組,也沒有網路延遲。 有關其他渲染選項,請參閱HTML 轉 PDF 文件

範例 2:使用頁面設定將 HTML 檔案轉換為 PDF

(Kaizen.io 之前):

using Kaizen.IO;
using System;
using System.IO;

class Program
{
    static void Main()
    {
        var converter = new HtmlToPdfConverter();
        var htmlContent = File.ReadAllText("input.html");
        var options = new ConversionOptions
        {
            PageSize = PageSize.A4,
            Orientation = Orientation.Portrait
        };
        var pdfBytes = converter.Convert(htmlContent, options);
        File.WriteAllBytes("document.pdf", pdfBytes);
    }
}
using Kaizen.IO;
using System;
using System.IO;

class Program
{
    static void Main()
    {
        var converter = new HtmlToPdfConverter();
        var htmlContent = File.ReadAllText("input.html");
        var options = new ConversionOptions
        {
            PageSize = PageSize.A4,
            Orientation = Orientation.Portrait
        };
        var pdfBytes = converter.Convert(htmlContent, options);
        File.WriteAllBytes("document.pdf", pdfBytes);
    }
}
$vbLabelText   $csharpLabel

(IronPDF 之後):

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

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;
using System;
using System.IO;

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");
    }
}
$vbLabelText   $csharpLabel

Kaizen.io 的方法需要使用File.ReadAllText()手動讀取 HTML 檔案內容,建立一個單獨的ConversionOptions對象,將兩者傳遞給Convert()方法,然後手動將結果位元組寫入檔案。

IronPDF 提供了一個專門的RenderHtmlFileAsPdf()方法,可以直接讀取文件-無需手動讀取文件。 配置設定在渲染器的RenderingOptions屬性中,所有設定都集中在一個地方。 PdfPaperSize.A4PdfPaperOrientation.Portrait枚舉直接映射自 Kaizen.io 的對應枚舉。

範例 3:帶有頁首和頁尾的 PDF 檔案的 URL

(Kaizen.io 之前):

using Kaizen.IO;
using System;
using System.IO;

class Program
{
    static void Main()
    {
        var converter = new HtmlToPdfConverter();
        var options = new ConversionOptions
        {
            Header = new HeaderOptions { HtmlContent = "<div style='text-align:center'>Company Header</div>" },
            Footer = new FooterOptions { HtmlContent = "<div style='text-align:center'>Page {page} of {total}</div>" },
            MarginTop = 20,
            MarginBottom = 20
        };
        var pdfBytes = converter.ConvertUrl("https://example.com", options);
        File.WriteAllBytes("webpage.pdf", pdfBytes);
    }
}
using Kaizen.IO;
using System;
using System.IO;

class Program
{
    static void Main()
    {
        var converter = new HtmlToPdfConverter();
        var options = new ConversionOptions
        {
            Header = new HeaderOptions { HtmlContent = "<div style='text-align:center'>Company Header</div>" },
            Footer = new FooterOptions { HtmlContent = "<div style='text-align:center'>Page {page} of {total}</div>" },
            MarginTop = 20,
            MarginBottom = 20
        };
        var pdfBytes = converter.ConvertUrl("https://example.com", options);
        File.WriteAllBytes("webpage.pdf", pdfBytes);
    }
}
$vbLabelText   $csharpLabel

(IronPDF 之後):

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

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;
using System;
using System.IO;

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");
    }
}
$vbLabelText   $csharpLabel

此範例展示了遷移過程中的幾個關鍵差異。 Kaizen.io 要求ConversionOptions中嵌套HeaderOptionsFooterOptions對象,每個對像都有一個HtmlContent屬性。 IronPDF 提供更簡潔的TextHeaderTextFooter配置,具有專用的CenterTextLeftTextRightText屬性。

重要提示:佔位符語法有所不同! Kaizen.io 使用{total}表示總頁數,而 IronPDF 則使用{total-pages}表示總頁數。 這是最常見的遷移問題—在您的程式碼庫中搜尋{total}並將其替換為{total-pages}

IronPDF 的RenderUrlAsPdf()方法透過 Chromium 引擎直接渲染任何 URL 並執行完整的 JavaScript 程式碼——無需任何變通方法。 了解更多關於URL轉PDF以及頁首和頁尾的資訊。


關鍵遷移說明

佔位符語法更改

遷移頁首和頁尾時最重要的變化是佔位符語法:

// Kaizen.io placeholders:
"Page {page} of {total}"

// IronPDF placeholders:
"Page {page} of {total-pages}"
// Kaizen.io placeholders:
"Page {page} of {total}"

// IronPDF placeholders:
"Page {page} of {total-pages}"
$vbLabelText   $csharpLabel

完整的佔位符映射:

  • {page}{page} (相同)
  • {total}{total-pages} (不同!)
  • {title}{html-title} (不同!)
  • {date}{date} (相同)
  • {time}{time} (相同)

返回類型變更

Kaizen.io 直接回到byte[] 。 IronPDF 回傳一個PdfDocument物件:

// Kaizen.io returns byte[]
byte[] pdfBytes = converter.Convert(html);
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[]
byte[] pdfBytes = converter.Convert(html);
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
$vbLabelText   $csharpLabel

移除 API 金鑰管理

Kaizen.io 需要每次請求都使用 API 金鑰進行身份驗證。 IronPDF 使用在應用程式啟動時設定一次的許可證金鑰:

// DELETE this Kaizen.io pattern:
var converter = new HtmlToPdfConverter("YOUR_API_KEY");

// IronPDF: Set once at startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
var renderer = new ChromePdfRenderer();  // No API key needed
// DELETE this Kaizen.io pattern:
var converter = new HtmlToPdfConverter("YOUR_API_KEY");

// IronPDF: Set once at startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
var renderer = new ChromePdfRenderer();  // No API key needed
$vbLabelText   $csharpLabel

刪除網路錯誤處理

移除重試邏輯、速率限制處理和網路逾時程式碼-IronPDF 程序在本地運行:

// DELETE this Kaizen.io pattern:
int retries = 3;
while (retries > 0)
{
    try
    {
        return converter.Convert(html);
    }
    catch (RateLimitException)
    {
        retries--;
        Thread.Sleep(1000);
    }
}

// IronPDF: Just call the method
return renderer.RenderHtmlAsPdf(html).BinaryData;
// DELETE this Kaizen.io pattern:
int retries = 3;
while (retries > 0)
{
    try
    {
        return converter.Convert(html);
    }
    catch (RateLimitException)
    {
        retries--;
        Thread.Sleep(1000);
    }
}

// IronPDF: Just call the method
return renderer.RenderHtmlAsPdf(html).BinaryData;
$vbLabelText   $csharpLabel

故障排除

問題 1:未找到 HtmlToPdfConverter

問題: IronPDF 中不存在HtmlToPdfConverter類別。

解決方案:替換為ChromePdfRenderer

// Kaizen.io
var converter = new HtmlToPdfConverter();

// IronPDF
var renderer = new ChromePdfRenderer();
// Kaizen.io
var converter = new HtmlToPdfConverter();

// IronPDF
var renderer = new ChromePdfRenderer();
$vbLabelText   $csharpLabel

問題 2:未找到 ConversionOptions

問題: IronPDF 中不存在ConversionOptions類。

解決方案:在渲染器上使用RenderingOptions

// Kaizen.io
var options = new ConversionOptions { PageSize = PageSize.A4 };
converter.Convert(html, options);

// IronPDF
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderHtmlAsPdf(html);
// Kaizen.io
var options = new ConversionOptions { PageSize = PageSize.A4 };
converter.Convert(html, options);

// IronPDF
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderHtmlAsPdf(html);
$vbLabelText   $csharpLabel

問題 3:頁碼無法顯示

問題:頁腳顯示的是字面值{total}而不是頁數。

解決方案:更新佔位符語法:

// Kaizen.io syntax (won't work)
"Page {page} of {total}"

// IronPDF syntax
"Page {page} of {total-pages}"
// Kaizen.io syntax (won't work)
"Page {page} of {total}"

// IronPDF syntax
"Page {page} of {total-pages}"
$vbLabelText   $csharpLabel

問題 4:未找到轉換方法

問題: ChromePdfRenderer中不存在Convert()方法。

解決方案:使用RenderHtmlAsPdf()

// Kaizen.io
var pdfBytes = converter.Convert(html);

// IronPDF
var pdf = renderer.RenderHtmlAsPdf(html);
var pdfBytes = pdf.BinaryData;
// Kaizen.io
var pdfBytes = converter.Convert(html);

// IronPDF
var pdf = renderer.RenderHtmlAsPdf(html);
var pdfBytes = pdf.BinaryData;
$vbLabelText   $csharpLabel

問題 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>");
$vbLabelText   $csharpLabel

遷移清單

遷移前

  • 辨識所有 Kaizen.io using語句
  • 使用的文件ConversionOptions設定
  • 注意頁首/頁尾模板和占位符
  • 列出 API 金鑰位置(要刪除)
  • 檢查重試/速率限制邏輯(以刪除)
  • 取得 IronPDF 許可證密鑰

軟體包變更

  • 移除Kaizen.HtmlToPdf包 安裝IronPdf NuGet 套件: dotnet add package IronPdf
  • 更新命名空間匯入

程式碼更改

  • 在啟動時新增許可證金鑰配置
  • HtmlToPdfConverter替換為ChromePdfRenderer
  • ConversionOptions轉換為RenderingOptions
  • Convert()更新為RenderHtmlAsPdf()
  • ConvertUrl()更新為RenderUrlAsPdf()
  • 更新佔位符語法( {total}{total-pages}
  • File.WriteAllBytes()替換為pdf.SaveAs()
  • 移除 API 金鑰配置
  • 刪除重試/速率限制邏輯
  • 移除 API 呼叫的網路錯誤處理

測試

  • 測試所有 PDF 生成路徑
  • 驗證頁首/頁尾渲染效果
  • 檢查佔位符渲染
  • 驗證頁邊距和頁面尺寸
  • 測試離線功能(新功能!)
  • 基準性能改進

移民後

  • 從設定中移除 Kaizen.io API 金鑰
  • 更新環境變數
  • 移除速率限製配置
  • 更新監控/警報

Curtis Chau
技術撰稿人

Curtis Chau 擁有電腦科學學士學位(卡爾頓大學),專長於前端開發,精通 Node.js、TypeScript、JavaScript 和 React。Curtis 對製作直覺且美觀的使用者介面充滿熱情,他喜歡使用現代化的架構,並製作結構良好且視覺上吸引人的手冊。

除了開發之外,Curtis 對物聯網 (IoT) 也有濃厚的興趣,他喜歡探索整合硬體與軟體的創新方式。在空閒時間,他喜歡玩遊戲和建立 Discord bots,將他對技術的熱愛與創意結合。