Kaizen.io vs IronPDF: Technical Comparison Guide
When .NET developers need to convert HTML content into PDF documents, they can choose between container-based services like Kaizen.io HTML-to-PDF or native .NET libraries like IronPDF. This comparison examines both approaches across key technical dimensions to help developers, architects, and technical decision-makers select the right solution for their PDF generation workflows.
What Is Kaizen.io HTML-to-PDF?
Kaizen.io HTML-to-PDF is a self-hosted Docker container that converts HTML content into PDF documents via a REST API. Developers deploy the container (e.g., docker run kaizenio.azurecr.io/html-to-pdf:latest) and send HTTP POST requests with JSON payloads to http://localhost:8080/html-to-pdf. The service returns the rendered PDF in the response body.
This architecture means developers manage the container infrastructure themselves but don't need to embed a rendering engine into their application. Integration uses standard HTTP clients in any language — there is no Kaizen.io NuGet package or .NET SDK.
However, this architecture introduces a dependency on Docker, requires container orchestration for production deployments, and adds HTTP round-trip overhead for each conversion.
What Is IronPDF?
IronPDF is a native C# library that processes PDF generation entirely within your .NET application. Rather than sending data to external servers, IronPDF uses an embedded Chromium rendering engine to convert HTML, CSS, and JavaScript into PDF documents locally.
The ChromePdfRenderer class serves as the primary interface for conversions. Developers configure rendering behavior through the RenderingOptions property, then call methods like RenderHtmlAsPdf() or RenderUrlAsPdf() to generate PDF documents. The resulting PdfDocument object provides direct access to binary data, file saving, and additional manipulation capabilities.
This local processing model eliminates network dependencies while giving developers complete control over rendering configuration and data privacy.
Architecture Comparison: Container Service vs Embedded Library
The fundamental difference between Kaizen.io HTML-to-PDF and IronPDF lies in how PDF rendering is integrated into your application. This architectural distinction affects deployment complexity, performance characteristics, and developer experience.
| Feature | Kaizen.io HTML-to-PDF | IronPDF |
|---|---|---|
| Deployment Model | Self-hosted Docker container | NuGet package (embedded in app) |
| Integration | HTTP POST to container endpoint | Direct C# method calls |
| Processing | Separate container process via HTTP | In-process rendering |
| Infrastructure | Requires Docker + container orchestration | No external dependencies |
| Processing Overhead | HTTP round-trip per conversion | Direct in-memory processing |
| Offline Mode | Requires running container | Full functionality |
| SDK/Package | No .NET SDK — uses standard HttpClient | Native .NET library |
| Pricing Model | One-time license | One-time or annual license |
Both approaches process documents within your own infrastructure — Kaizen.io runs as a Docker container on your servers, and IronPDF runs directly within your .NET application. The key difference is operational: Kaizen.io requires managing a separate container service and communicating via HTTP, while IronPDF embeds the rendering engine directly into your application with no external process.
Basic HTML to PDF Conversion
The simplest PDF generation scenario involves converting an HTML string to a PDF file. Comparing the code patterns reveals differences in API design and complexity.
Kaizen.io HTML-to-PDF implementation:
// Requires: docker run -d -p 8080:8080 kaizenio.azurecr.io/html-to-pdf:latest
using System.Net.Http;
using System.Net.Http.Json;
using System.IO;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
var client = new HttpClient();
var html = "<html><body><h1>Hello World</h1></body></html>";
var response = await client.PostAsJsonAsync(
"http://localhost:8080/html-to-pdf",
new { html });
var pdfBytes = await response.Content.ReadAsByteArrayAsync();
File.WriteAllBytes("output.pdf", pdfBytes);
}
}// Requires: docker run -d -p 8080:8080 kaizenio.azurecr.io/html-to-pdf:latest
using System.Net.Http;
using System.Net.Http.Json;
using System.IO;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
var client = new HttpClient();
var html = "<html><body><h1>Hello World</h1></body></html>";
var response = await client.PostAsJsonAsync(
"http://localhost:8080/html-to-pdf",
new { html });
var pdfBytes = await response.Content.ReadAsByteArrayAsync();
File.WriteAllBytes("output.pdf", pdfBytes);
}
}Imports System.Net.Http
Imports System.Net.Http.Json
Imports System.IO
Imports System.Threading.Tasks
Module Program
Async Function Main() As Task
Dim client As New HttpClient()
Dim html As String = "<html><body><h1>Hello World</h1></body></html>"
Dim response = Await client.PostAsJsonAsync(
"http://localhost:8080/html-to-pdf",
New With {Key .html = html})
Dim pdfBytes = Await response.Content.ReadAsByteArrayAsync()
File.WriteAllBytes("output.pdf", pdfBytes)
End Function
End ModuleIronPDF implementation:
// 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");
}
}Imports IronPdf
Imports System.IO
Class Program
Shared Sub Main()
Dim renderer = New ChromePdfRenderer()
Dim html = "<html><body><h1>Hello World</h1></body></html>"
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("output.pdf")
End Sub
End ClassKaizen.io requires setting up a Docker container and making HTTP requests — there is no .NET SDK or NuGet package. The REST API returns raw PDF bytes. IronPDF returns a PdfDocument object with a convenient SaveAs() method and access to additional PDF manipulation capabilities through the document object.
HTML File to PDF Conversion
When converting HTML files rather than strings, the libraries handle file reading differently.
Kaizen.io HTML-to-PDF approach:
// Requires: docker run -d -p 8080:8080 kaizenio.azurecr.io/html-to-pdf:latest
using System.Net.Http;
using System.Net.Http.Json;
using System.IO;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
var client = new HttpClient();
var htmlContent = File.ReadAllText("input.html");
var response = await client.PostAsJsonAsync(
"http://localhost:8080/html-to-pdf",
new { html = htmlContent });
var pdfBytes = await response.Content.ReadAsByteArrayAsync();
File.WriteAllBytes("document.pdf", pdfBytes);
}
}// Requires: docker run -d -p 8080:8080 kaizenio.azurecr.io/html-to-pdf:latest
using System.Net.Http;
using System.Net.Http.Json;
using System.IO;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
var client = new HttpClient();
var htmlContent = File.ReadAllText("input.html");
var response = await client.PostAsJsonAsync(
"http://localhost:8080/html-to-pdf",
new { html = htmlContent });
var pdfBytes = await response.Content.ReadAsByteArrayAsync();
File.WriteAllBytes("document.pdf", pdfBytes);
}
}Imports System.Net.Http
Imports System.Net.Http.Json
Imports System.IO
Imports System.Threading.Tasks
Module Program
Async Function Main() As Task
Dim client As New HttpClient()
Dim htmlContent As String = File.ReadAllText("input.html")
Dim response = Await client.PostAsJsonAsync(
"http://localhost:8080/html-to-pdf",
New With {.html = htmlContent})
Dim pdfBytes As Byte() = Await response.Content.ReadAsByteArrayAsync()
File.WriteAllBytes("document.pdf", pdfBytes)
End Function
End ModuleIronPDF approach:
// 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");
}
}Imports IronPdf
Imports System
Imports System.IO
Class Program
Shared Sub Main()
Dim renderer = New ChromePdfRenderer()
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4
renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Portrait
Dim pdf = renderer.RenderHtmlFileAsPdf("input.html")
pdf.SaveAs("document.pdf")
End Sub
End ClassKaizen.io's REST API accepts HTML content as a JSON string, so developers must read the file first and send it via HTTP. IronPDF provides a dedicated RenderHtmlFileAsPdf method that handles file reading internally, reducing boilerplate code. IronPDF also supports page configuration directly through RenderingOptions, while Kaizen.io's configuration options depend on what the REST API endpoint accepts.
URL to PDF with Headers and Footers
Professional documents typically require headers and footers with page numbers, company branding, or document metadata. Both libraries support this functionality with different configuration patterns.
Kaizen.io HTML-to-PDF approach:
Kaizen.io's REST API accepts an HTML string via POST http://localhost:8080/html-to-pdf. For URL-to-PDF conversion, the application must fetch the web page content first and then send it to the container. Header/footer support depends on the container's API capabilities — consult the Kaizen.io documentation for available options.
// Requires: docker run -d -p 8080:8080 kaizenio.azurecr.io/html-to-pdf:latest
using System.Net.Http;
using System.Net.Http.Json;
using System.IO;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
var client = new HttpClient();
// Kaizen.io accepts HTML content — URL fetching must be done separately
var html = await client.GetStringAsync("https://example.com");
var response = await client.PostAsJsonAsync(
"http://localhost:8080/html-to-pdf",
new { html });
var pdfBytes = await response.Content.ReadAsByteArrayAsync();
File.WriteAllBytes("webpage.pdf", pdfBytes);
}
}// Requires: docker run -d -p 8080:8080 kaizenio.azurecr.io/html-to-pdf:latest
using System.Net.Http;
using System.Net.Http.Json;
using System.IO;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
var client = new HttpClient();
// Kaizen.io accepts HTML content — URL fetching must be done separately
var html = await client.GetStringAsync("https://example.com");
var response = await client.PostAsJsonAsync(
"http://localhost:8080/html-to-pdf",
new { html });
var pdfBytes = await response.Content.ReadAsByteArrayAsync();
File.WriteAllBytes("webpage.pdf", pdfBytes);
}
}Imports System.Net.Http
Imports System.Net.Http.Json
Imports System.IO
Imports System.Threading.Tasks
Module Program
Async Function Main() As Task
Dim client As New HttpClient()
' Kaizen.io accepts HTML content — URL fetching must be done separately
Dim html As String = Await client.GetStringAsync("https://example.com")
Dim response = Await client.PostAsJsonAsync(
"http://localhost:8080/html-to-pdf",
New With {Key .html = html})
Dim pdfBytes As Byte() = Await response.Content.ReadAsByteArrayAsync()
File.WriteAllBytes("webpage.pdf", pdfBytes)
End Function
End ModuleIronPDF with headers and footers:
// 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");
}
}Imports IronPdf
Imports System
Imports System.IO
Module Program
Sub Main()
Dim renderer As 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
Dim pdf = renderer.RenderUrlAsPdf("https://example.com")
pdf.SaveAs("webpage.pdf")
End Sub
End ModuleIronPDF provides both TextHeader/TextFooter for simple text-based headers and HtmlHeader/HtmlFooter for complex HTML-based designs. The RenderingOptions class centralizes all configuration, making it easy to discover available options through IDE autocomplete.
IronPDF supports dynamic placeholders in headers and footers including {page}, {total-pages}, {date}, {time}, {html-title}, and {url}. Kaizen.io's header/footer capabilities depend on the container's REST API — consult their documentation for supported options.
API Design Comparison
The integration approaches are fundamentally different. Kaizen.io is a REST API — developers send HTTP requests with JSON payloads and receive PDF bytes. There are no .NET classes, methods, or configuration objects to map. IronPDF is a native .NET library with a rich C# API.
Integration Pattern Comparison
| Kaizen.io (REST API) | IronPDF (C# Library) |
|---|---|
POST /html-to-pdf with {"html": "..."} | renderer.RenderHtmlAsPdf(html) |
| Fetch URL content, then POST HTML | renderer.RenderUrlAsPdf(url) |
| Read file, then POST HTML | renderer.RenderHtmlFileAsPdf(path) |
| HTTP response body (PDF bytes) | pdf.SaveAs(path) or pdf.BinaryData |
| JSON request parameters | renderer.RenderingOptions.* properties |
When Teams Consider Moving from Kaizen.io to IronPDF
Several factors drive teams to evaluate IronPDF as an alternative to Kaizen.io HTML-to-PDF:
Simpler Deployment: Kaizen.io requires Docker infrastructure — container orchestration, health monitoring, port management, and container updates. IronPDF installs as a NuGet package with no external processes or container dependencies.
Performance: Each Kaizen.io conversion involves an HTTP round-trip to the container process. IronPDF renders in-process, avoiding serialization and network overhead for each conversion.
No Container Dependency: Applications that need to generate PDFs without Docker — desktop apps, simple web servers, or environments where containers are not available — benefit from IronPDF's embedded architecture.
Richer API: Kaizen.io's REST API accepts HTML and returns PDF bytes — that's its scope. IronPDF provides a full .NET API with PDF merging, splitting, watermarking, form filling, digital signatures, and security settings beyond basic generation.
Developer Experience: IronPDF integrates directly into C# code with IDE autocomplete, type safety, and synchronous or async method calls. Kaizen.io requires HTTP client boilerplate, JSON serialization, and manual byte array handling.
Return Type Differences
A key API difference affects how applications handle conversion results:
Kaizen.io returns raw HTTP response bytes:
var response = await client.PostAsJsonAsync("http://localhost:8080/html-to-pdf", new { html });
var pdfBytes = await response.Content.ReadAsByteArrayAsync();
File.WriteAllBytes("output.pdf", pdfBytes);var response = await client.PostAsJsonAsync("http://localhost:8080/html-to-pdf", new { html });
var pdfBytes = await response.Content.ReadAsByteArrayAsync();
File.WriteAllBytes("output.pdf", pdfBytes);Imports System.IO
Imports System.Net.Http
Imports System.Threading.Tasks
Dim response = Await client.PostAsJsonAsync("http://localhost:8080/html-to-pdf", New With {Key .html})
Dim pdfBytes = Await response.Content.ReadAsByteArrayAsync()
File.WriteAllBytes("output.pdf", pdfBytes)IronPDF returns PdfDocument objects:
var pdf = renderer.RenderHtmlAsPdf(html);
byte[] bytes = pdf.BinaryData; // Get bytes if needed
pdf.SaveAs("output.pdf"); // Or save directlyvar pdf = renderer.RenderHtmlAsPdf(html);
byte[] bytes = pdf.BinaryData; // Get bytes if needed
pdf.SaveAs("output.pdf"); // Or save directlyDim pdf = renderer.RenderHtmlAsPdf(html)
Dim bytes As Byte() = pdf.BinaryData ' Get bytes if needed
pdf.SaveAs("output.pdf") ' Or save directlyThe IronPDF PdfDocument object provides access to binary data through the BinaryData property while also offering convenient methods like SaveAs(). Beyond basic output, PdfDocument enables additional operations like merging documents, adding watermarks, filling forms, and applying security settings.
Installation and Setup
The installation process differs significantly between the two approaches:
Kaizen.io setup:
docker pull kaizenio.azurecr.io/html-to-pdf:latest
docker run -d -p 8080:8080 kaizenio.azurecr.io/html-to-pdf:latestdocker pull kaizenio.azurecr.io/html-to-pdf:latest
docker run -d -p 8080:8080 kaizenio.azurecr.io/html-to-pdf:latestNo NuGet package — integration uses standard HttpClient to call the container's REST API.
IronPDF setup:
dotnet add package IronPdfdotnet add package IronPdfRequires license key set once at application startup:
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"IronPDF supports .NET Framework 4.6.2+ and .NET Core 3.1+ / .NET 5+, making it compatible with modern .NET development targeting .NET 10 and C# 14. The single NuGet package includes all necessary dependencies without platform-specific packages.
Error Handling Considerations
Container-based and embedded library approaches require different error handling:
Kaizen.io error scenarios:
- Container not running or unreachable
- HTTP connection failures to container endpoint
- Container resource limits (memory, CPU)
- Request timeout handling
- Container restart/health monitoring
IronPDF error scenarios:
- HTML parsing issues
- Resource loading failures
- Memory constraints for large documents
- File system access errors
Teams migrating from Kaizen.io to IronPDF can simplify their error handling by removing HTTP client logic, container health checks, and inter-process communication concerns. IronPDF's in-process rendering eliminates the failure modes associated with managing a separate container service.
Performance Considerations
IronPDF initializes its Chromium rendering engine on first use, which may introduce a brief delay for the initial conversion. For applications with latency-sensitive startup requirements, warming up the renderer at application initialization prevents this delay from affecting user-facing operations:
// In Program.cs or Startup.cs
new ChromePdfRenderer().RenderHtmlAsPdf("<html></html>");// In Program.cs or Startup.cs
new ChromePdfRenderer().RenderHtmlAsPdf("<html></html>");' In Program.vb or Startup.vb
Call New ChromePdfRenderer().RenderHtmlAsPdf("<html></html>")After initialization, subsequent conversions execute at full speed. The IronPDF documentation provides additional optimization techniques for high-volume scenarios.
Making the Decision
The choice between Kaizen.io HTML-to-PDF and IronPDF depends on your specific requirements:
Consider Kaizen.io HTML-to-PDF if: You already use Docker in your infrastructure, you want to decouple PDF rendering from your application process, your conversion needs are limited to basic HTML-to-PDF, and you prefer a language-agnostic HTTP-based integration.
Consider IronPDF if: You want a native .NET library with no container dependencies, you need PDF manipulation beyond basic generation (merge, watermark, sign, encrypt), you prefer direct C# API integration with IDE support, or your deployment environment doesn't support Docker.
For teams building modern .NET applications in 2025 and planning toward 2026, IronPDF's alignment with local processing, data privacy, and native .NET integration offers compelling advantages. The ability to control rendering configuration completely, eliminate external dependencies, and process documents without transmitting data externally addresses common enterprise requirements.
Getting Started with IronPDF
To evaluate IronPDF for your HTML-to-PDF conversion needs:
- Install the IronPDF NuGet package:
Install-Package IronPdf - Review the HTML to PDF tutorial for conversion patterns
- Explore URL to PDF conversion for web page capture
- Configure headers and footers for professional documents
The IronPDF tutorials provide comprehensive examples for common scenarios, and the API reference documents all available classes and methods.
Kaizen.io HTML-to-PDF and IronPDF represent different architectural approaches to PDF generation. Kaizen.io operates as a self-hosted Docker container with a REST API, while IronPDF is a native .NET library that embeds the rendering engine directly into your application.
For .NET teams that want direct library integration without container infrastructure, IronPDF provides a simpler deployment model with a richer feature set — including PDF manipulation, security, and digital signatures that go beyond basic HTML-to-PDF conversion.
Evaluate both options against your deployment infrastructure, feature requirements, and integration preferences.
