How to Migrate from Kaizen.io to IronPDF in C#
Migrating from Kaizen.io HTML-to-PDF to IronPDF transforms your .NET PDF workflow from a cloud-dependent service with network latency and data privacy concerns to a local in-process library that keeps your data within your infrastructure. This guide provides a comprehensive, step-by-step migration path that eliminates external API dependencies and per-request pricing for professional .NET developers.
Why Migrate from Kaizen.io to IronPDF
The Cloud-Based API Challenges
Kaizen.io HTML-to-PDF, like other cloud-based PDF services, introduces limitations that affect production applications:
Cloud Dependency: Requires constant internet connection and external service availability. If the Kaizen.io service experiences downtime, your application's PDF generation stops working.
Data Privacy Concerns: Sensitive HTML content—including customer data, financial reports, and confidential documents—must be transmitted to third-party servers for processing.
Network Latency: Every PDF generation incurs network round-trip delays of 100-500ms or more, adding significant overhead to your application's response times.
Per-Request Pricing: Costs scale directly with usage volume, making high-volume PDF generation increasingly expensive.
Rate Limiting: API throttling during high-traffic periods can cause PDF generation failures or delays when you need them most.
- Vendor Lock-In: API changes or service discontinuation risk leaves your application vulnerable to external business decisions.
Kaizen.io vs IronPDF Comparison
| Feature | Kaizen.io | IronPDF |
|---|---|---|
| Processing | Cloud (external servers) | Local (in-process) |
| Data Privacy | Data transmitted externally | Data never leaves your infrastructure |
| Latency | Network round-trip (100-500ms+) | Local processing (50-200ms) |
| Availability | Depends on external service | 100% under your control |
| Pricing | Per-request or subscription | One-time or annual license |
| Offline Mode | Not possible | Full functionality |
| Rate Limits | API throttling | No limits |
| JavaScript | Limited support | Full Chromium execution |
For teams planning .NET 10 and C# 14 adoption through 2025 and 2026, IronPDF provides a future-proof foundation with local processing that eliminates external service dependencies.
Migration Complexity Assessment
Estimated Effort by Feature
| Feature | Migration Complexity | Notes |
|---|---|---|
| Basic HTML to PDF | Very Low | Direct method replacement |
| HTML File to PDF | Very Low | Direct method replacement |
| URL to PDF | Very Low | Direct method replacement |
| Headers/Footers | Low | Placeholder syntax change |
| Page Settings | Very Low | Property mapping |
| API Key Management | Low | Delete entirely |
Paradigm Shift
The fundamental shift in this Kaizen.io migration is from cloud API calls to local in-process rendering:
Kaizen.io: HtmlToPdfConverter → Convert(html) → byte[] (via network)
IronPDF: ChromePdfRenderer → RenderHtmlAsPdf(html) → PdfDocument (local)Before You Start
Prerequisites
- .NET Environment: .NET Framework 4.6.2+ or .NET Core 3.1+ / .NET 5/6/7/8/9+
- NuGet Access: Ability to install NuGet packages
- IronPDF License: Obtain your license key from ironpdf.com
NuGet Package Changes
# 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 IronPdfLicense Configuration
// 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";Identify Kaizen.io Usage
# 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" .Complete API Reference
Class Mappings
| Kaizen.io Class | IronPDF Equivalent | Notes |
|---|---|---|
HtmlToPdfConverter | ChromePdfRenderer | Main converter |
ConversionOptions | ChromePdfRenderOptions | Via RenderingOptions |
HeaderOptions | HtmlHeaderFooter or TextHeaderFooter | HTML/text headers |
FooterOptions | HtmlHeaderFooter or TextHeaderFooter | HTML/text footers |
PageSize | PdfPaperSize | Paper size enum |
Orientation | PdfPaperOrientation | Orientation enum |
Method Mappings
| Kaizen.io Method | IronPDF Equivalent | Notes |
|---|---|---|
converter.Convert(html) | renderer.RenderHtmlAsPdf(html) | Returns PdfDocument |
converter.ConvertUrl(url) | renderer.RenderUrlAsPdf(url) | Direct URL support |
File.WriteAllBytes(path, bytes) | pdf.SaveAs(path) | Direct save method |
ConversionOptions Property Mappings
| Kaizen.io Property | IronPDF Equivalent | Notes |
|---|---|---|
PageSize | RenderingOptions.PaperSize | Enum value |
Orientation | RenderingOptions.PaperOrientation | Portrait/Landscape |
MarginTop | RenderingOptions.MarginTop | In millimeters |
MarginBottom | RenderingOptions.MarginBottom | In millimeters |
Header.HtmlContent | RenderingOptions.HtmlHeader.HtmlFragment | Header HTML |
Footer.HtmlContent | RenderingOptions.HtmlFooter.HtmlFragment | Footer HTML |
Placeholder Mappings
| Kaizen.io Placeholder | IronPDF Placeholder | Notes |
|---|---|---|
{page} | {page} | Current page (same) |
{total} | {total-pages} | Total pages (different!) |
{date} | {date} | Current date (same) |
{title} | {html-title} | Document title (different!) |
Code Migration Examples
Example 1: Basic HTML to PDF
Before (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");
}
}The Kaizen.io approach creates an HtmlToPdfConverter, calls Convert() to get a byte array, then manually writes the bytes to a file using File.WriteAllBytes(). This involves a network round-trip to the Kaizen.io cloud service.
IronPDF's ChromePdfRenderer processes everything locally. The RenderHtmlAsPdf() method returns a PdfDocument object with a convenient SaveAs() method—no manual byte array handling required, and no network latency. See the HTML to PDF documentation for additional rendering options.
Example 2: HTML File to PDF with Page Settings
Before (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");
}
}The Kaizen.io approach requires manually reading the HTML file content with File.ReadAllText(), creating a separate ConversionOptions object, passing both to the Convert() method, and then manually writing the result bytes to a file.
IronPDF provides a dedicated RenderHtmlFileAsPdf() method that reads the file directly—no manual file reading required. Configuration is set on the RenderingOptions property of the renderer, keeping all settings in one place. The PdfPaperSize.A4 and PdfPaperOrientation.Portrait enums map directly from Kaizen.io's equivalents.
Example 3: URL to PDF with Headers and Footers
Before (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");
}
}This example demonstrates several key migration differences. Kaizen.io requires nested HeaderOptions and FooterOptions objects within ConversionOptions, each with an HtmlContent property. IronPDF provides a cleaner TextHeader and TextFooter configuration with dedicated CenterText, LeftText, and RightText properties.
Critical Note: The placeholder syntax differs! Kaizen.io uses {total} for total page count, while IronPDF uses {total-pages}. This is the most common migration issue—search your codebase for {total} and replace with {total-pages}.
IronPDF's RenderUrlAsPdf() method directly renders any URL with full JavaScript execution via the Chromium engine—no workarounds required. Learn more about URL to PDF conversion and headers and footers.
Critical Migration Notes
Placeholder Syntax Change
The most important change when migrating headers and footers is the placeholder syntax:
// 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}"Complete placeholder mapping:
{page}→{page}(same){total}→{total-pages}(DIFFERENT!){title}→{html-title}(DIFFERENT!){date}→{date}(same){time}→{time}(same)
Return Type Change
Kaizen.io returns byte[] directly. IronPDF returns a PdfDocument object:
// 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 neededRemove API Key Management
Kaizen.io requires per-request API key authentication. IronPDF uses a license key set once at application startup:
// 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 neededDelete Network Error Handling
Remove retry logic, rate limit handling, and network timeout code—IronPDF processes locally:
// 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;Troubleshooting
Issue 1: HtmlToPdfConverter Not Found
Problem: HtmlToPdfConverter class doesn't exist in IronPDF.
Solution: Replace with ChromePdfRenderer:
// Kaizen.io
var converter = new HtmlToPdfConverter();
// IronPDF
var renderer = new ChromePdfRenderer();// Kaizen.io
var converter = new HtmlToPdfConverter();
// IronPDF
var renderer = new ChromePdfRenderer();Issue 2: ConversionOptions Not Found
Problem: ConversionOptions class doesn't exist in IronPDF.
Solution: Use RenderingOptions on the renderer:
// 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);Issue 3: Page Numbers Not Working
Problem: Footer shows literal {total} instead of page count.
Solution: Update placeholder syntax:
// 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}"Issue 4: Convert Method Not Found
Problem: Convert() method doesn't exist on ChromePdfRenderer.
Solution: Use 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;Issue 5: First Render Slow
Problem: First PDF generation takes 1-3 seconds.
Solution: IronPDF initializes Chromium on first use. Warm up at application startup:
// In Program.cs or Startup.cs:
new ChromePdfRenderer().RenderHtmlAsPdf("<html></html>");// In Program.cs or Startup.cs:
new ChromePdfRenderer().RenderHtmlAsPdf("<html></html>");Migration Checklist
Pre-Migration
- Identify all Kaizen.io
usingstatements - Document
ConversionOptionssettings used - Note header/footer templates and placeholders
- List API key locations (to remove)
- Check for retry/rate-limit logic (to delete)
- Obtain IronPDF license key
Package Changes
- Remove
Kaizen.HtmlToPdfpackage - Install
IronPdfNuGet package:dotnet add package IronPdf - Update namespace imports
Code Changes
- Add license key configuration at startup
- Replace
HtmlToPdfConverterwithChromePdfRenderer - Convert
ConversionOptionstoRenderingOptions - Update
Convert()toRenderHtmlAsPdf() - Update
ConvertUrl()toRenderUrlAsPdf() - Update placeholder syntax (
{total}→{total-pages}) - Replace
File.WriteAllBytes()withpdf.SaveAs() - Remove API key configuration
- Delete retry/rate-limit logic
- Remove network error handling for API calls
Testing
- Test all PDF generation paths
- Verify header/footer rendering
- Check placeholder rendering
- Validate margins and page sizes
- Test offline functionality (new capability!)
- Benchmark performance improvement
Post-Migration
- Remove Kaizen.io API key from configuration
- Update environment variables
- Remove rate limit configuration
- Update monitoring/alerting






