How to Migrate from PDFBolt to IronPDF in C#
Migrating from PDFBolt to IronPDF moves your .NET PDF workflow from a cloud-only SaaS service with external document processing to a self-hosted library with complete data privacy and unlimited local generation. This guide provides a comprehensive, step-by-step migration path that eliminates network dependencies, usage limits, and external data transmission while gaining access to PDF manipulation features that PDFBolt cannot provide.
Why Migrate from PDFBolt to IronPDF
The Cloud-Only Problem
PDFBolt is a cloud-only SaaS platform that processes your documents on external servers. While convenient for quick prototypes, this architecture creates significant challenges for production applications:
Cloud-Only Processing: Every document passes through external servers—there is no self-hosted option available, which could deter businesses needing more control over their data and processes.
Data Privacy Risks: Sensitive documents (contracts, medical records, financial data) must be transmitted externally. Companies dealing with sensitive information will have legitimate concerns.
Usage Limits: The free tier is capped at 100 documents per month, which might not suffice for larger businesses. Pay-per-document pricing adds up quickly for production workloads.
Network Dependency: Internet outages or PDFBolt downtime means your PDF generation stops entirely.
Latency: Network round-trip adds seconds to every conversion compared to local processing.
Compliance Issues: GDPR, HIPAA, and SOC2 audits are complicated by external document processing.
API Key Security: Leaked API keys can result in unauthorized usage billed to your account.
- Vendor Lock-in: Your application fails if PDFBolt changes terms or shuts down.
PDFBolt vs IronPDF Comparison
| Concern | PDFBolt | IronPDF |
|---|---|---|
| Data Location | External servers | Your servers only |
| Usage Limits | 100 free, then per-document | Unlimited |
| Internet Required | Yes, always | No |
| Latency | Network round-trip | Milliseconds |
| Compliance | Complex (external processing) | Simple (local processing) |
| Cost Model | Per-document | One-time or annual |
| Offline Operation | Impossible | Fully supported |
| API Key Risks | Leaked = billed | License key, no billing risk |
For teams planning .NET 10 and C# 14 adoption through 2025 and 2026, IronPDF provides a self-hosted foundation that ensures complete data privacy and eliminates dependency on external cloud services.
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 PDFBolt
dotnet remove package PDFBolt
# Install IronPDF
dotnet add package IronPdf# Remove PDFBolt
dotnet remove package PDFBolt
# 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";' Add at application startup (Program.vb or Startup.vb)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"Identify PDFBolt Usage
# Find all PDFBolt references
grep -r "PDFBolt\|HtmlToPdfConverter\|ConvertHtmlString\|ConvertUrl" --include="*.cs" .
# Find API key references
grep -r "PDFBOLT\|ApiKey" --include="*.cs" --include="*.json" --include="*.config" .# Find all PDFBolt references
grep -r "PDFBolt\|HtmlToPdfConverter\|ConvertHtmlString\|ConvertUrl" --include="*.cs" .
# Find API key references
grep -r "PDFBOLT\|ApiKey" --include="*.cs" --include="*.json" --include="*.config" .Complete API Reference
Core Class Mappings
| PDFBolt | IronPDF |
|---|---|
new HtmlToPdfConverter() | new ChromePdfRenderer() |
PageSize | PdfPaperSize |
| (returns byte[]) | PdfDocument |
Conversion Method Mappings
| PDFBolt | IronPDF |
|---|---|
converter.ConvertHtmlString(html) | renderer.RenderHtmlAsPdf(html) |
converter.ConvertUrl(url) | renderer.RenderUrlAsPdf(url) |
Output Method Mappings
| PDFBolt | IronPDF |
|---|---|
File.WriteAllBytes(path, pdf) | pdf.SaveAs(path) |
| (pdf is byte[]) | pdf.BinaryData |
| (manual stream) | pdf.Stream |
Page Configuration Mappings
| PDFBolt | IronPDF |
|---|---|
converter.PageSize = PageSize.A4 | renderer.RenderingOptions.PaperSize = PdfPaperSize.A4 |
converter.MarginTop = 20 | renderer.RenderingOptions.MarginTop = 20 |
converter.MarginBottom = 20 | renderer.RenderingOptions.MarginBottom = 20 |
converter.MarginLeft = 15 | renderer.RenderingOptions.MarginLeft = 15 |
converter.MarginRight = 15 | renderer.RenderingOptions.MarginRight = 15 |
Header/Footer Placeholder Mappings
| PDFBolt | IronPDF |
|---|---|
{pageNumber} | {page} |
{totalPages} | {total-pages} |
{date} | {date} |
{title} | {html-title} |
Code Migration Examples
Example 1: Basic HTML to PDF
Before (PDFBolt):
// NuGet: Install-Package PDFBolt
using PDFBolt;
using System.IO;
class Program
{
static void Main()
{
var converter = new HtmlToPdfConverter();
var html = "<html><body><h1>Hello World</h1></body></html>";
var pdf = converter.ConvertHtmlString(html);
File.WriteAllBytes("output.pdf", pdf);
}
}// NuGet: Install-Package PDFBolt
using PDFBolt;
using System.IO;
class Program
{
static void Main()
{
var converter = new HtmlToPdfConverter();
var html = "<html><body><h1>Hello World</h1></body></html>";
var pdf = converter.ConvertHtmlString(html);
File.WriteAllBytes("output.pdf", pdf);
}
}Imports PDFBolt
Imports System.IO
Class Program
Shared Sub Main()
Dim converter = New HtmlToPdfConverter()
Dim html = "<html><body><h1>Hello World</h1></body></html>"
Dim pdf = converter.ConvertHtmlString(html)
File.WriteAllBytes("output.pdf", pdf)
End Sub
End ClassAfter (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");
}
}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 ClassThe fundamental difference here is the return type and save pattern. PDFBolt's HtmlToPdfConverter.ConvertHtmlString() returns a byte[] that you must manually write to disk using File.WriteAllBytes(). This requires importing System.IO and handling the file operation yourself.
IronPDF's ChromePdfRenderer.RenderHtmlAsPdf() returns a PdfDocument object with a built-in SaveAs() method. This object-oriented approach provides additional benefits: you can manipulate the PDF (add watermarks, merge documents, add security) before saving. If you need the raw bytes for compatibility with existing code, use pdf.BinaryData. See the HTML to PDF documentation for additional rendering options.
Example 2: URL to PDF Conversion
Before (PDFBolt):
// NuGet: Install-Package PDFBolt
using PDFBolt;
using System.IO;
class Program
{
static void Main()
{
var converter = new HtmlToPdfConverter();
var pdf = converter.ConvertUrl("https://www.example.com");
File.WriteAllBytes("webpage.pdf", pdf);
}
}// NuGet: Install-Package PDFBolt
using PDFBolt;
using System.IO;
class Program
{
static void Main()
{
var converter = new HtmlToPdfConverter();
var pdf = converter.ConvertUrl("https://www.example.com");
File.WriteAllBytes("webpage.pdf", pdf);
}
}Imports PDFBolt
Imports System.IO
Class Program
Shared Sub Main()
Dim converter = New HtmlToPdfConverter()
Dim pdf = converter.ConvertUrl("https://www.example.com")
File.WriteAllBytes("webpage.pdf", pdf)
End Sub
End ClassAfter (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderUrlAsPdf("https://www.example.com");
pdf.SaveAs("webpage.pdf");
}
}// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderUrlAsPdf("https://www.example.com");
pdf.SaveAs("webpage.pdf");
}
}Imports IronPdf
Class Program
Shared Sub Main()
Dim renderer As New ChromePdfRenderer()
Dim pdf = renderer.RenderUrlAsPdf("https://www.example.com")
pdf.SaveAs("webpage.pdf")
End Sub
End ClassThe PDFBolt pattern for URL conversion follows the same approach as HTML conversion: ConvertUrl() returns byte[], requiring File.WriteAllBytes() for saving. Note that PDFBolt still requires a network round-trip to their servers even though you're already fetching from a URL.
IronPDF's RenderUrlAsPdf() method returns a PdfDocument with the built-in SaveAs() method. The key advantage here is that IronPDF performs the URL fetch and PDF rendering locally—no data leaves your infrastructure. Notice that the IronPDF version doesn't even need using System.IO; for this simple case. Learn more about URL to PDF conversion.
Example 3: HTML File with Custom Page Settings
Before (PDFBolt):
// NuGet: Install-Package PDFBolt
using PDFBolt;
using System.IO;
class Program
{
static void Main()
{
var converter = new HtmlToPdfConverter();
converter.PageSize = PageSize.A4;
converter.MarginTop = 20;
converter.MarginBottom = 20;
var html = File.ReadAllText("input.html");
var pdf = converter.ConvertHtmlString(html);
File.WriteAllBytes("output.pdf", pdf);
}
}// NuGet: Install-Package PDFBolt
using PDFBolt;
using System.IO;
class Program
{
static void Main()
{
var converter = new HtmlToPdfConverter();
converter.PageSize = PageSize.A4;
converter.MarginTop = 20;
converter.MarginBottom = 20;
var html = File.ReadAllText("input.html");
var pdf = converter.ConvertHtmlString(html);
File.WriteAllBytes("output.pdf", pdf);
}
}Imports PDFBolt
Imports System.IO
Class Program
Shared Sub Main()
Dim converter As New HtmlToPdfConverter()
converter.PageSize = PageSize.A4
converter.MarginTop = 20
converter.MarginBottom = 20
Dim html As String = File.ReadAllText("input.html")
Dim pdf As Byte() = converter.ConvertHtmlString(html)
File.WriteAllBytes("output.pdf", pdf)
End Sub
End ClassAfter (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;
using System.IO;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.MarginTop = 20;
renderer.RenderingOptions.MarginBottom = 20;
var html = File.ReadAllText("input.html");
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
}
}// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;
using System.IO;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.MarginTop = 20;
renderer.RenderingOptions.MarginBottom = 20;
var html = File.ReadAllText("input.html");
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
}
}Imports IronPdf
Imports IronPdf.Rendering
Imports System.IO
Class Program
Shared Sub Main()
Dim renderer = New ChromePdfRenderer()
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4
renderer.RenderingOptions.MarginTop = 20
renderer.RenderingOptions.MarginBottom = 20
Dim html = File.ReadAllText("input.html")
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("output.pdf")
End Sub
End ClassThis example demonstrates page configuration differences. PDFBolt sets properties directly on the converter object (converter.PageSize, converter.MarginTop). IronPDF uses a RenderingOptions object on the renderer (renderer.RenderingOptions.PaperSize, renderer.RenderingOptions.MarginTop).
The key mappings:
PageSize.A4→PdfPaperSize.A4(different enum name)MarginTop = 20→RenderingOptions.MarginTop = 20(via RenderingOptions)
Both use millimeters for margin values, so your existing margin values should transfer directly. The IronPdf.Rendering namespace is required for access to the PdfPaperSize enum. For additional page configuration options, see the rendering options documentation.
Critical Migration Notes
Return Type Change
PDFBolt returns byte[] directly; IronPDF returns PdfDocument:
// PDFBolt pattern:
byte[] pdf = converter.ConvertHtmlString(html);
File.WriteAllBytes("output.pdf", pdf);
// IronPDF pattern:
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
// Or if you need bytes:
byte[] pdfBytes = renderer.RenderHtmlAsPdf(html).BinaryData;// PDFBolt pattern:
byte[] pdf = converter.ConvertHtmlString(html);
File.WriteAllBytes("output.pdf", pdf);
// IronPDF pattern:
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
// Or if you need bytes:
byte[] pdfBytes = renderer.RenderHtmlAsPdf(html).BinaryData;' PDFBolt pattern:
Dim pdf As Byte() = converter.ConvertHtmlString(html)
File.WriteAllBytes("output.pdf", pdf)
' IronPDF pattern:
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("output.pdf")
' Or if you need bytes:
Dim pdfBytes As Byte() = renderer.RenderHtmlAsPdf(html).BinaryDataClass Naming Change
The main class name changes from converter-focused to renderer-focused:
// PDFBolt
var converter = new HtmlToPdfConverter();
// IronPDF
var renderer = new ChromePdfRenderer();// PDFBolt
var converter = new HtmlToPdfConverter();
// IronPDF
var renderer = new ChromePdfRenderer();' PDFBolt
Dim converter As New HtmlToPdfConverter()
' IronPDF
Dim renderer As New ChromePdfRenderer()Configuration Pattern Change
PDFBolt uses direct properties; IronPDF uses RenderingOptions:
// PDFBolt: Direct properties
converter.PageSize = PageSize.A4;
converter.MarginTop = 20;
// IronPDF: Via RenderingOptions
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.MarginTop = 20;// PDFBolt: Direct properties
converter.PageSize = PageSize.A4;
converter.MarginTop = 20;
// IronPDF: Via RenderingOptions
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.MarginTop = 20;' PDFBolt: Direct properties
converter.PageSize = PageSize.A4
converter.MarginTop = 20
' IronPDF: Via RenderingOptions
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4
renderer.RenderingOptions.MarginTop = 20API Key Elimination
PDFBolt requires per-request API key management; IronPDF uses a one-time license key:
// PDFBolt: API key per client (security risk if leaked)
var apiKey = config["PDFBolt:ApiKey"];
var client = new Client(apiKey);
// IronPDF: License key once at startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
var renderer = new ChromePdfRenderer();// PDFBolt: API key per client (security risk if leaked)
var apiKey = config["PDFBolt:ApiKey"];
var client = new Client(apiKey);
// IronPDF: License key once at startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
var renderer = new ChromePdfRenderer();' PDFBolt: API key per client (security risk if leaked)
Dim apiKey = config("PDFBolt:ApiKey")
Dim client = New Client(apiKey)
' IronPDF: License key once at startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
Dim renderer = New ChromePdfRenderer()Remove Network Error Handling
Local processing means no network errors to handle:
// PDFBolt: Network error handling required
catch (HttpRequestException ex)
catch (TaskCanceledException)
catch (TimeoutException)
// IronPDF: Remove network-specific catches entirely// PDFBolt: Network error handling required
catch (HttpRequestException ex)
catch (TaskCanceledException)
catch (TimeoutException)
// IronPDF: Remove network-specific catches entirelynetNew Capabilities Available
After migrating to IronPDF, you gain capabilities that PDFBolt cannot provide:
// PDF Merging (not available in PDFBolt)
var merged = PdfDocument.Merge(pdf1, pdf2);
// Watermarks (not available in PDFBolt)
pdf.ApplyWatermark("<h1 style='opacity:0.3;'>DRAFT</h1>");
// Password Protection (not available in PDFBolt)
pdf.SecuritySettings.UserPassword = "secret";
// Text Extraction (not available in PDFBolt)
string text = pdf.ExtractAllText();
// PDF to Images (not available in PDFBolt)
pdf.RasterizeToImageFiles("page_*.png");// PDF Merging (not available in PDFBolt)
var merged = PdfDocument.Merge(pdf1, pdf2);
// Watermarks (not available in PDFBolt)
pdf.ApplyWatermark("<h1 style='opacity:0.3;'>DRAFT</h1>");
// Password Protection (not available in PDFBolt)
pdf.SecuritySettings.UserPassword = "secret";
// Text Extraction (not available in PDFBolt)
string text = pdf.ExtractAllText();
// PDF to Images (not available in PDFBolt)
pdf.RasterizeToImageFiles("page_*.png");' PDF Merging (not available in PDFBolt)
Dim merged = PdfDocument.Merge(pdf1, pdf2)
' Watermarks (not available in PDFBolt)
pdf.ApplyWatermark("<h1 style='opacity:0.3;'>DRAFT</h1>")
' Password Protection (not available in PDFBolt)
pdf.SecuritySettings.UserPassword = "secret"
' Text Extraction (not available in PDFBolt)
Dim text As String = pdf.ExtractAllText()
' PDF to Images (not available in PDFBolt)
pdf.RasterizeToImageFiles("page_*.png")Troubleshooting
Issue 1: HtmlToPdfConverter Not Found
Problem: HtmlToPdfConverter class doesn't exist in IronPDF.
Solution: Use ChromePdfRenderer:
// PDFBolt
var converter = new HtmlToPdfConverter();
// IronPDF
var renderer = new ChromePdfRenderer();// PDFBolt
var converter = new HtmlToPdfConverter();
// IronPDF
var renderer = new ChromePdfRenderer();' PDFBolt
Dim converter As New HtmlToPdfConverter()
' IronPDF
Dim renderer As New ChromePdfRenderer()Issue 2: ConvertHtmlString Not Found
Problem: ConvertHtmlString() method doesn't exist.
Solution: Use RenderHtmlAsPdf():
// PDFBolt
var pdf = converter.ConvertHtmlString(html);
// IronPDF
var pdf = renderer.RenderHtmlAsPdf(html);// PDFBolt
var pdf = converter.ConvertHtmlString(html);
// IronPDF
var pdf = renderer.RenderHtmlAsPdf(html);' PDFBolt
Dim pdf = converter.ConvertHtmlString(html)
' IronPDF
Dim pdf = renderer.RenderHtmlAsPdf(html)Issue 3: ConvertUrl Not Found
Problem: ConvertUrl() method doesn't exist.
Solution: Use RenderUrlAsPdf():
// PDFBolt
var pdf = converter.ConvertUrl(url);
// IronPDF
var pdf = renderer.RenderUrlAsPdf(url);// PDFBolt
var pdf = converter.ConvertUrl(url);
// IronPDF
var pdf = renderer.RenderUrlAsPdf(url);' PDFBolt
Dim pdf = converter.ConvertUrl(url)
' IronPDF
Dim pdf = renderer.RenderUrlAsPdf(url)Issue 4: PageSize Enum Not Found
Problem: PageSize enum doesn't exist.
Solution: Use PdfPaperSize from IronPdf.Rendering:
// PDFBolt
converter.PageSize = PageSize.A4;
// IronPDF
using IronPdf.Rendering;
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;// PDFBolt
converter.PageSize = PageSize.A4;
// IronPDF
using IronPdf.Rendering;
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;' PDFBolt
converter.PageSize = PageSize.A4
' IronPDF
Imports IronPdf.Rendering
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4Issue 5: First PDF Generation Is Slow
Problem: Initial render takes longer than expected.
Solution: The Chromium engine initializes on first use. Pre-warm if needed:
// Warm up during application startup
var renderer = new ChromePdfRenderer();
renderer.RenderHtmlAsPdf("<html><body></body></html>");// Warm up during application startup
var renderer = new ChromePdfRenderer();
renderer.RenderHtmlAsPdf("<html><body></body></html>");' Warm up during application startup
Dim renderer As New ChromePdfRenderer()
renderer.RenderHtmlAsPdf("<html><body></body></html>")Migration Checklist
Pre-Migration
- Inventory all PDFBolt usages in codebase
- Document current page configuration settings (PageSize, margins)
- Identify API key management code to remove
- List any rate limit or network error handling to delete
- Obtain IronPDF license key
Package Changes
- Remove
PDFBoltNuGet package - Install
IronPdfNuGet package:dotnet add package IronPdf - Add
using IronPdf;namespace - Add
using IronPdf.Rendering;for paper size enums
Code Changes
- Add license key configuration at startup
- Replace
HtmlToPdfConverterwithChromePdfRenderer - Replace
ConvertHtmlString()withRenderHtmlAsPdf() - Replace
ConvertUrl()withRenderUrlAsPdf() - Replace
File.WriteAllBytes()withpdf.SaveAs() - Update
PageSizetoRenderingOptions.PaperSize - Update margin properties to
RenderingOptions.MarginTop, etc. - Remove API key management code
- Remove rate limit handling code
- Remove network error handling
Post-Migration
- Delete API key from configuration files
- Remove API key from secret managers
- Run all tests comparing PDF output
- Verify page sizes and margins render correctly
- Consider adding new capabilities (watermarks, security, merging)






