如何使用 C# 將 Kaizen.io 移轉到 IronPDF
從 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)開始之前
先決條件
- .NET 環境: .NET Framework 4.6.2+ 或 .NET Core 3.1+ / .NET 5/6/7/8/9+
- NuGet 存取權限:能夠安裝 NuGet 套件
- 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許可證配置
// 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";辨識 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" .完整 API 參考
類別映射
| Kaizen.io 課程 | IronPDF當量 | 筆記 |
|---|---|---|
HtmlToPdfConverter | ChromePdfRenderer | 主轉換器 |
ConversionOptions | ChromePdfRenderOptions | 透過RenderingOptions |
HeaderOptions | HtmlHeaderFooter或TextHeaderFooter | HTML/文字標題 |
FooterOptions | HtmlHeaderFooter或TextHeaderFooter | 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);
}
}(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");
}
}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);
}
}(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");
}
}Kaizen.io 的方法需要使用File.ReadAllText()手動讀取 HTML 檔案內容,建立一個單獨的ConversionOptions對象,將兩者傳遞給Convert()方法,然後手動將結果位元組寫入檔案。
IronPDF 提供了一個專門的RenderHtmlFileAsPdf()方法,可以直接讀取文件-無需手動讀取文件。 配置設定在渲染器的RenderingOptions屬性中,所有設定都集中在一個地方。 PdfPaperSize.A4和PdfPaperOrientation.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);
}
}(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");
}
}此範例展示了遷移過程中的幾個關鍵差異。 Kaizen.io 要求ConversionOptions中嵌套HeaderOptions和FooterOptions對象,每個對像都有一個HtmlContent屬性。 IronPDF 提供更簡潔的TextHeader和TextFooter配置,具有專用的CenterText 、 LeftText和RightText屬性。
重要提示:佔位符語法有所不同! 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}"完整的佔位符映射:
{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移除 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刪除網路錯誤處理
移除重試邏輯、速率限制處理和網路逾時程式碼-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;故障排除
問題 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();問題 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);問題 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}"問題 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;問題 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>");遷移清單
遷移前
- 辨識所有 Kaizen.io
using語句 - 使用的文件
ConversionOptions設定 - 注意頁首/頁尾模板和占位符
- 列出 API 金鑰位置(要刪除)
- 檢查重試/速率限制邏輯(以刪除)
- 取得 IronPDF 許可證密鑰
軟體包變更
- 移除
Kaizen.HtmlToPdf包 安裝IronPdfNuGet 套件: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 金鑰
- 更新環境變數
- 移除速率限製配置
- 更新監控/警報






