如何用 C# 从 Kaizen.io 迁移到 IronPDF
从 Kaizen.io HTML-to-PDF 迁移到IronPDF可将您的 .NET PDF 工作流程从依赖云的服务(存在网络延迟和数据隐私问题)转变为本地进程内库,从而将您的数据保存在您的基础架构内。 本指南为专业的 .NET 开发人员提供了一个全面的、循序渐进的迁移路径,消除了外部 API 依赖性和按请求定价的问题。
为什么要从 Kaizen.io 迁移到 IronPDF.
基于云的 API 挑战
与其他基于云的 PDF 服务一样,Kaizen.io HTML-to-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-500ms 以上) | 本地处理(50-200 毫秒) |
| 可用性 | 取决于外部服务 | 100% 由您控制 |
| 定价 | 按请求或订阅 | 一次性或年度许可 |
| 离线模式 | 不可能 | 全部功能 |
| 费率限制 | API 节流 | 无限制 |
| JavaScript | 有限支持 | 全面执行 Chromium |
对于计划在 2025 年和 2026 年之前采用 .NET 10 和 C# 14 的团队来说,IronPDF 提供了一个面向未来的基础,其本地处理消除了外部服务依赖性。
迁移复杂性评估
按功能估算的工作量
| 特征 | 迁移复杂性 | 备注 |
|---|---|---|
| 基本 HTML 到 PDF | 极低 | 直接方法替换 |
| HTML 文件到 PDF | 极低 | 直接方法替换 |
| URL 至 PDF | 极低 | 直接方法替换 |
| 页眉/页脚 | 低 | 占位符语法更改 |
| 页面设置 | 极低 | 属性映射 |
| API 密钥管理 | 低 | 完全删除 |
范式转换
Kaizen.io此次迁移的根本转变在于从云端API调用转向本地进程内渲染:
Kaizen.io.HtmlToPdfConverter HtmlToPdfConverter → Convert(html) → byte[] (通过网络)
IronPDF: ChromePdfRenderer → RenderHtmlAsPdf(html) → PdfDocument(本地)开始之前
前提条件
- .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</代码 | 主要转换器 |
| <代码>转换选项</代码 | <代码>ChromePdfRenderOptions</代码 | 通过 RenderingOptions |
| <代码>标题选项</代码 | <代码>HtmlHeaderFooter</代码>或<代码>TextHeaderFooter</代码 | HTML/ 文本标题 |
| <代码>脚注选项</代码 | <代码>HtmlHeaderFooter</代码>或<代码>TextHeaderFooter</代码 | HTML/ 文本页脚 |
| <代码>页面大小</代码 | <代码>PdfPaperSize</代码 | 纸张尺寸枚举 |
| <代码>方向</代码 | <代码>PdfPaperOrientation</代码 | 方向枚举 |
方法映射
| Kaizen.io 方法 | IronPdf 同等产品 | 备注 |
|---|---|---|
| <代码>converter.Convert(html)</代码 | <代码>renderer.RenderHtmlAsPdf(html)</代码 | 返回 PdfDocument |
| <代码>converter.ConvertUrl(url)</代码 | <代码>renderer.RenderUrlAsPdf(url)</代码 | 支持直接 URL |
| <代码>File.WriteAllBytes(path,字节)</代码 | <代码>pdf.SaveAs(路径)</代码 | 直接保存法 |
转换选项属性映射
| Kaizen.io 属性 | IronPdf 同等产品 | 备注 |
|---|---|---|
| <代码>页面大小</代码 | <代码>RenderingOptions.PaperSize</代码 | 枚举值 |
| <代码>方向</代码 | <代码>RenderingOptions.PaperOrientation</代码 | 肖像/风景 |
| <代码>页边距</代码 | <代码>RenderingOptions.MarginTop</代码 | 单位:毫米 |
| <代码>边距下限</代码 | <代码>RenderingOptions.MarginBottom</代码 | 单位:毫米 |
| <代码>Header.HtmlContent</代码 | <代码>RenderingOptions.HtmlHeader.HtmlFragment</代码 | 标题 HTML |
| <代码>Footer.HtmlContent</代码 | <代码>RenderingOptions.HtmlFooter.HtmlFragment</代码 | 页脚 HTML |
占位符映射
| Kaizen.io 占位符 | IronPdf 占位符 | 备注 |
|---|---|---|
{page} | {page} | 当前页面(相同) |
| <代码>{总计}</代码 | <代码>{总页数}</代码 | 总页数(不同) |
| <代码>{日期}</代码 | <代码>{日期}</代码 | 当前日期(相同) |
| <代码>{标题}</代码 | <代码>{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);
}
}After (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 to 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);
}
}After (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 文件内容,创建一个单独的<代码>转换选项</代码对象,将两者传递给 Convert() 方法,然后手动将结果字节写入文件。
IronPDF 提供了专门的 RenderHtmlFileAsPdf() 方法,可直接读取文件--无需手动读取文件。 配置设置在呈现器的 RenderingOptions 属性上,将所有设置集中在一处。 PdfPaperSize.A4和PdfPaperOrientation.Portrait枚举直接映射自 Kaizen.io 的对应枚举。
示例 3:带页眉和页脚的 URL 至 PDF 文件
之前 (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);
}
}After (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 需要在<代码>转换选项</代码中嵌套<代码>标题选项</代码和<代码>脚注选项</代码对象,每个对象都有一个 HtmlContent 属性。IronPDF提供了更简洁的 TextHeader 和 TextFooter 配置,并具有专用的 CenterText, LeftText 和 RightText 属性。
重要提示:占位符语法有所不同! Kaizen.io 使用<代码>{总计}</代码表示总页数,而IronPDF使用<代码>{总页数}</代码表示总页数。 这是最常见的迁移问题--搜索代码库中的<代码>{总计}</代码并替换为 {total-pages}。
IronPDF 的 RenderUrlAsPdf() 方法可通过 Chromium 引擎直接以完整的JavaScript执行方式渲染任何 URL,无需任何变通方法。 了解有关 URL 到 PDF 转换和 页眉和页脚的更多信息。
关键迁移说明
替换语法
在迁移页眉和页脚时,最重要的变化是占位符语法:
// Kaizen.io placeholders:
"Page {page} of {total}"
//IronPDFplaceholders:
"Page {page} of {total-pages}"// Kaizen.io placeholders:
"Page {page} of {total}"
//IronPDFplaceholders:
"Page {page} of {total-pages}"完整的占位符映射: -{page}→{page}(相同) -<代码>{总计}</代码→<代码>{总页数}</代码(不同!)。 -<代码>{标题}</代码→<代码>{html-title}</代码(不同!)。 -<代码>{日期}</代码→<代码>{日期}</代码(相同)
{time}→{time}(相同)
返回类型更改
Kaizen.io 直接返回 byte[] 。IronPDF返回一个 PdfDocument 对象:
// Kaizen.io returns byte[]
byte[] pdfBytes = converter.Convert(html);
File.WriteAllBytes("output.pdf", pdfBytes);
//IronPDFreturns 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);
//IronPDFreturns 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:未找到转换选项
问题: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}"
//IronPDFsyntax
"Page {page} of {total-pages}"// Kaizen.io syntax (won't work)
"Page {page} of {total}"
//IronPDFsyntax
"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() - 更新占位符语法(<代码>{总计}</代码→<代码>{总页数}</代码)
- 将
File.WriteAllBytes()替换为pdf.SaveAs() - 移除 API 密钥配置
- 删除重试/速率限制逻辑
- 移除 API 调用的网络错误处理
测试
- 测试所有 PDF 生成路径
- 验证页眉/页脚渲染效果
- 检查占位符渲染
- 验证页边距和页面尺寸
- 测试离线功能(新功能!)
- 基准性能改进
后迁移
- 从配置中移除 Kaizen.io API 密钥
- 更新环境变量
- 移除速率限制配置
- 更新监控/警报






