Skip to footer content
MIGRATION GUIDES

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:

  1. 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.

  2. Data Privacy Risks: Sensitive documents (contracts, medical records, financial data) must be transmitted externally. Companies dealing with sensitive information will have legitimate concerns.

  3. 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.

  4. Network Dependency: Internet outages or PDFBolt downtime means your PDF generation stops entirely.

  5. Latency: Network round-trip adds seconds to every conversion compared to local processing.

  6. Compliance Issues: GDPR, HIPAA, and SOC2 audits are complicated by external document processing.

  7. API Key Security: Leaked API keys can result in unauthorized usage billed to your account.

  8. Vendor Lock-in: Your application fails if PDFBolt changes terms or shuts down.

PDFBolt vs IronPDF Comparison

ConcernPDFBoltIronPDF
Data LocationExternal serversYour servers only
Usage Limits100 free, then per-documentUnlimited
Internet RequiredYes, alwaysNo
LatencyNetwork round-tripMilliseconds
ComplianceComplex (external processing)Simple (local processing)
Cost ModelPer-documentOne-time or annual
Offline OperationImpossibleFully supported
API Key RisksLeaked = billedLicense 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

  1. .NET Environment: .NET Framework 4.6.2+ or .NET Core 3.1+ / .NET 5/6/7/8/9+
  2. NuGet Access: Ability to install NuGet packages
  3. 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 IronPdf
SHELL

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

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" .
SHELL

Complete API Reference

Core Class Mappings

PDFBoltIronPDFNotes
new HtmlToPdfConverter()new ChromePdfRenderer()Main renderer
PageSizePdfPaperSizeEnum for paper sizes
(returns byte[])PdfDocumentRich document object

Conversion Method Mappings

PDFBoltIronPDFNotes
converter.ConvertHtmlString(html)renderer.RenderHtmlAsPdf(html)Returns PdfDocument
converter.ConvertUrl(url)renderer.RenderUrlAsPdf(url)Returns PdfDocument

Output Method Mappings

PDFBoltIronPDFNotes
File.WriteAllBytes(path, pdf)pdf.SaveAs(path)Direct save method
(pdf is byte[])pdf.BinaryDataGet byte array
(manual stream)pdf.StreamStream property

Page Configuration Mappings

PDFBoltIronPDFNotes
converter.PageSize = PageSize.A4renderer.RenderingOptions.PaperSize = PdfPaperSize.A4Paper size enum
converter.MarginTop = 20renderer.RenderingOptions.MarginTop = 20In millimeters
converter.MarginBottom = 20renderer.RenderingOptions.MarginBottom = 20In millimeters
converter.MarginLeft = 15renderer.RenderingOptions.MarginLeft = 15In millimeters
converter.MarginRight = 15renderer.RenderingOptions.MarginRight = 15In millimeters
PDFBoltIronPDFNotes
{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);
    }
}
$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

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

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

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

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

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.A4PdfPaperSize.A4 (different enum name)
  • MarginTop = 20RenderingOptions.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;
$vbLabelText   $csharpLabel

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

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

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

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 entirely
$vbLabelText   $csharpLabel

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

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

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

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

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

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

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 PDFBolt NuGet package
  • Install IronPdf NuGet 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 HtmlToPdfConverter with ChromePdfRenderer
  • Replace ConvertHtmlString() with RenderHtmlAsPdf()
  • Replace ConvertUrl() with RenderUrlAsPdf()
  • Replace File.WriteAllBytes() with pdf.SaveAs()
  • Update PageSize to RenderingOptions.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)

Curtis Chau
Technical Writer

Curtis Chau holds a Bachelor’s degree in Computer Science (Carleton University) and specializes in front-end development with expertise in Node.js, TypeScript, JavaScript, and React. Passionate about crafting intuitive and aesthetically pleasing user interfaces, Curtis enjoys working with modern frameworks and creating well-structured, visually appealing manuals.

...

Read More