跳至页脚内容
迁移指南

如何用 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(本地)

开始之前

前提条件

  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 主要转换器
转换选项 ChromePdfRenderOptions 通过 RenderingOptions
标题选项 HtmlHeaderFooter</code>或TextHeaderFooter` HTML/ 文本标题
脚注选项 HtmlHeaderFooter</code>或<code>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);
    }
}
$vbLabelText   $csharpLabel

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

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

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

Kaizen.io 方法要求使用 File.ReadAllText() 手动读取 HTML 文件内容,创建一个单独的转换选项对象,将两者传递给 Convert() 方法,然后手动将结果字节写入文件。

IronPDF 提供了专门的 RenderHtmlFileAsPdf() 方法,可直接读取文件--无需手动读取文件。 配置设置在呈现器的 RenderingOptions 属性上,将所有设置集中在一处。 PdfPaperSize.A4PdfPaperOrientation.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);
    }
}
$vbLabelText   $csharpLabel

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

本例展示了几个关键的迁移差异。 Kaizen.io 需要在转换选项中嵌套标题选项脚注选项对象,每个对象都有一个 HtmlContent 属性。IronPDF提供了更简洁的 TextHeaderTextFooter 配置,并具有专用的 CenterText, LeftTextRightText 属性。

重要提示:占位符语法有所不同! 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}"
$vbLabelText   $csharpLabel

完整的占位符映射: -{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
$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:未找到转换选项

问题: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}"

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

//IronPDFsyntax
"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()
  • 更新占位符语法({总计}{总页数}
  • File.WriteAllBytes()替换为pdf.SaveAs()
  • 移除 API 密钥配置
  • 删除重试/速率限制逻辑
  • 移除 API 调用的网络错误处理

测试

  • 测试所有 PDF 生成路径
  • 验证页眉/页脚渲染效果
  • 检查占位符渲染
  • 验证页边距和页面尺寸
  • 测试离线功能(新功能!)
  • 基准性能改进

后迁移

  • 从配置中移除 Kaizen.io API 密钥
  • 更新环境变量
  • 移除速率限制配置
  • 更新监控/警报

Curtis Chau
技术作家

Curtis Chau 拥有卡尔顿大学的计算机科学学士学位,专注于前端开发,精通 Node.js、TypeScript、JavaScript 和 React。他热衷于打造直观且美观的用户界面,喜欢使用现代框架并创建结构良好、视觉吸引力强的手册。

除了开发之外,Curtis 对物联网 (IoT) 有浓厚的兴趣,探索将硬件和软件集成的新方法。在空闲时间,他喜欢玩游戏和构建 Discord 机器人,将他对技术的热爱与创造力相结合。