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";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 | Notes |
|---|---|---|
new HtmlToPdfConverter() | new ChromePdfRenderer() | Main renderer |
PageSize | PdfPaperSize | Enum for paper sizes |
| (returns byte[]) | PdfDocument | Rich document object |
Conversion Method Mappings
| PDFBolt | IronPDF | Notes |
|---|---|---|
converter.ConvertHtmlString(html) | renderer.RenderHtmlAsPdf(html) | Returns PdfDocument |
converter.ConvertUrl(url) | renderer.RenderUrlAsPdf(url) | Returns PdfDocument |
Output Method Mappings
| PDFBolt | IronPDF | Notes |
|---|---|---|
File.WriteAllBytes(path, pdf) | pdf.SaveAs(path) | Direct save method |
| (pdf is byte[]) | pdf.BinaryData | Get byte array |
| (manual stream) | pdf.Stream | Stream property |
Page Configuration Mappings
| PDFBolt | IronPDF | Notes |
|---|---|---|
converter.PageSize = PageSize.A4 | renderer.RenderingOptions.PaperSize = PdfPaperSize.A4 | Paper size enum |
converter.MarginTop = 20 | renderer.RenderingOptions.MarginTop = 20 | In millimeters |
converter.MarginBottom = 20 | renderer.RenderingOptions.MarginBottom = 20 | In millimeters |
converter.MarginLeft = 15 | renderer.RenderingOptions.MarginLeft = 15 | In millimeters |
converter.MarginRight = 15 | renderer.RenderingOptions.MarginRight = 15 | In millimeters |
Header/Footer Placeholder Mappings
| PDFBolt | IronPDF | Notes |
|---|---|---|
{pageNumber} | {page} | Current page |
{totalPages} | {total-pages} | Total pages |
{date} | {date} | Same |
{title} | {html-title} | Document 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);
}
}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 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);
}
}After (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");
}
}The 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);
}
}After (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");
}
}This 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;Class 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();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;API 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();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 entirelyNew 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");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();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);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);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;Issue 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>");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)






