IRONSOFTWAREHOME
MIGRATION GUIDES

How to Migrate from PDFBolt to IronPDF in C#

Curtis Chau
Curtis Chau
Updated: August 1, 2026

Migrating from PDFBolt to IronPDF moves your .NET PDF workflow from a cloud-only SaaS REST service to a self-hosted library with local document processing and no per-document quotas. This guide provides a step-by-step migration path that eliminates network dependencies, monthly usage caps, and external data transmission while adding PDF manipulation features that PDFBolt does not provide.

Why Migrate from PDFBolt to IronPDF

The Cloud-Only Problem

PDFBolt is a cloud-only SaaS platform exposed as a REST API; there is no official .NET SDK and no PDFBolt NuGet package. Integration is hand-rolled with HttpClient against https://api.pdfbolt.com/v1/direct. While convenient for quick prototypes, this architecture creates challenges for production applications:

  1. Cloud-Only Processing: Every document passes through PDFBolt's servers - there is no self-hosted option, which can be a blocker for teams that need more control over data flow.
  2. Data Privacy Considerations: Sensitive documents (contracts, medical records, financial data) are transmitted externally. Companies dealing with regulated data will have legitimate review concerns.
  3. Usage Limits: The free tier is capped at 100 documents per month, 20 requests/minute, 1 concurrent request, which may not suffice for production workloads. Paid tiers (per pdfbolt.com/pricing) scale from $19/mo to $249/mo.
  4. Network Dependency: Internet outages or PDFBolt downtime mean your PDF generation stops entirely.
  5. Latency: Network round-trip adds seconds to every conversion compared to local processing.
  6. Compliance Review: GDPR, HIPAA, and SOC2 audits typically require additional documentation when external document processing is involved.
  7. API Key Security: Leaked API keys can result in unauthorized usage billed to your account.
  8. Vendor Lock-in: Your application stops working if PDFBolt changes terms or shuts down.

PDFBolt vs IronPDF Comparison

ConcernPDFBoltIronPDF
Data LocationExternal serversYour servers only
Usage Limits100 free/month, then tiered subscriptionsUnlimited
Internet RequiredYes, alwaysNo
LatencyNetwork round-tripLocal
ComplianceComplex (external processing)Simple (local processing)
Cost ModelMonthly subscription tiers ($19-$249/mo)One-time or annual
Offline OperationImpossibleFully supported
API Key RisksLeaked = billedLicense key, no billing risk

IronPDF provides a self-hosted foundation on modern .NET that keeps document processing local and removes the dependency on an external cloud service.


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

PDFBolt has no official .NET SDK and no PDFBolt NuGet package, so there is nothing to uninstall. The PDFBolt-side cleanup is to delete the hand-rolled HttpClient wrapper and request/response DTOs. Then install IronPDF:

# Install IronPDF (replaces the hand-rolled HttpClient wrapper)
dotnet add package IronPdf
SHELL

License Configuration

// Add at application startup (Program.cs or Startup.cs)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";

Identify PDFBolt Usage

# Find all PDFBolt REST calls
grep -rE "api\.pdfbolt\.com|API-KEY|/v1/direct" --include="*.cs" .

# Find API key references
grep -r "PDFBOLT\|ApiKey" --include="*.cs" --include="*.json" --include="*.config" .
SHELL

Complete API Reference

Core Concept Mappings

PDFBolt (REST)IronPDF
HttpClient + API-KEY headernew ChromePdfRenderer()
JSON request bodyrenderer.RenderingOptions
POST https://api.pdfbolt.com/v1/directrenderer.RenderHtmlAsPdf(...) / RenderUrlAsPdf(...)
Response byte[]PdfDocument

Conversion Method Mappings

PDFBolt (REST)IronPDF
POST /v1/direct with { "html": <base64> }renderer.RenderHtmlAsPdf(html)
POST /v1/direct with { "url": "..." }renderer.RenderUrlAsPdf(url)

Output Method Mappings

PDFBolt (REST)IronPDF
await response.Content.ReadAsByteArrayAsync() then File.WriteAllBytespdf.SaveAs(path)
await response.Content.ReadAsByteArrayAsync()pdf.BinaryData

Page Configuration Mappings

PDFBolt JSONIronPDF
"format": "A4"renderer.RenderingOptions.PaperSize = PdfPaperSize.A4
"margin": { "top": "20mm" }renderer.RenderingOptions.MarginTop = 20
"margin": { "bottom": "20mm" }renderer.RenderingOptions.MarginBottom = 20
"margin": { "left": "15mm" }renderer.RenderingOptions.MarginLeft = 15
"margin": { "right": "15mm" }renderer.RenderingOptions.MarginRight = 15

Header/Footer Placeholder Mappings

PDFBolt (inside base64-encoded headerTemplate / footerTemplate)IronPDF (HtmlFragment token)
<span class="pageNumber"></span>{page}
<span class="totalPages"></span>{total-pages}
<span class="date"></span>{date}
<span class="title"></span>{html-title}

Code Migration Examples

Example 1: Basic HTML to PDF

Before (PDFBolt - REST via HttpClient):

// REST API — no official .NET SDK; integrate via HttpClient.
// Docs: https://pdfbolt.com/docs/quick-start-guide/csharp
using System;
using System.IO;
using System.Net.Http;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        var html = "<html><body><h1>Hello World</h1></body></html>";
        var payload = JsonSerializer.Serialize(new
        {
            html = Convert.ToBase64String(Encoding.UTF8.GetBytes(html))
        });

        using var http = new HttpClient();
        http.DefaultRequestHeaders.Add("API-KEY", "YOUR-PDFBOLT-API-KEY");
        using var content = new StringContent(payload, Encoding.UTF8, "application/json");
        using var response = await http.PostAsync("https://api.pdfbolt.com/v1/direct", content);
        response.EnsureSuccessStatusCode();

        var pdfBytes = await response.Content.ReadAsByteArrayAsync();
        await File.WriteAllBytesAsync("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");
    }
}

The structural difference is the integration model. PDFBolt requires you to base64-encode the HTML, build a JSON payload, set the API-KEY header, POST to https://api.pdfbolt.com/v1/direct, await the response, and write the returned bytes to disk yourself.

IronPDF's ChromePdfRenderer.RenderHtmlAsPdf() returns a PdfDocument object with a built-in SaveAs() method. The object-oriented model lets you manipulate the PDF (add watermarks, merge documents, apply 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 - REST via HttpClient):

// REST API — no official .NET SDK; integrate via HttpClient.
// Docs: https://pdfbolt.com/docs/quick-start-guide/csharp
using System.IO;
using System.Net.Http;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        var payload = JsonSerializer.Serialize(new { url = "https://www.example.com" });

        using var http = new HttpClient();
        http.DefaultRequestHeaders.Add("API-KEY", "YOUR-PDFBOLT-API-KEY");
        using var content = new StringContent(payload, Encoding.UTF8, "application/json");
        using var response = await http.PostAsync("https://api.pdfbolt.com/v1/direct", content);
        response.EnsureSuccessStatusCode();

        var pdfBytes = await response.Content.ReadAsByteArrayAsync();
        await File.WriteAllBytesAsync("webpage.pdf", pdfBytes);
    }
}

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

On the PDFBolt side, URL conversion still requires the full REST round-trip: build the JSON body, set the API key header, await the POST, and write the response bytes. Even though you're already pointing at a public URL, the fetch and the render both happen on PDFBolt's servers.

IronPDF's RenderUrlAsPdf() returns a PdfDocument with the built-in SaveAs() method. The key advantage is that IronPDF performs the URL fetch and PDF rendering locally - no document data leaves your infrastructure. Learn more about URL to PDF conversion.

Example 3: HTML File with Custom Page Settings

Before (PDFBolt - REST via HttpClient):

// REST API — no official .NET SDK; integrate via HttpClient.
// Docs: https://pdfbolt.com/docs/parameters
using System;
using System.IO;
using System.Net.Http;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        var html = await File.ReadAllTextAsync("input.html");
        var payload = JsonSerializer.Serialize(new
        {
            html = Convert.ToBase64String(Encoding.UTF8.GetBytes(html)),
            format = "A4",
            margin = new { top = "20mm", bottom = "20mm" },
            printBackground = true
        });

        using var http = new HttpClient();
        http.DefaultRequestHeaders.Add("API-KEY", "YOUR-PDFBOLT-API-KEY");
        using var content = new StringContent(payload, Encoding.UTF8, "application/json");
        using var response = await http.PostAsync("https://api.pdfbolt.com/v1/direct", content);
        response.EnsureSuccessStatusCode();

        var pdfBytes = await response.Content.ReadAsByteArrayAsync();
        await File.WriteAllBytesAsync("output.pdf", pdfBytes);
    }
}

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

This example shows the page configuration mapping. PDFBolt accepts top-level format plus a nested margin object whose values are CSS-style strings ("20mm"). IronPDF uses a RenderingOptions object on the renderer with strongly-typed properties.

The key mappings:

  • "format": "A4"PdfPaperSize.A4 (strongly-typed enum)
  • "margin": { "top": "20mm" }RenderingOptions.MarginTop = 20 (numeric mm)

IronPDF margins are always numeric millimeters, so PDFBolt CSS-unit strings like "20mm" map directly. The IronPdf.Rendering namespace is required for access to the PdfPaperSize enum. For additional page configuration, see the rendering options documentation.


Critical Migration Notes

Return Type Change

PDFBolt's /v1/direct endpoint returns the raw PDF as the HTTP response body; IronPDF returns a PdfDocument:

// PDFBolt pattern:
var pdfBytes = await response.Content.ReadAsByteArrayAsync();
await File.WriteAllBytesAsync("output.pdf", pdfBytes);

// IronPDF pattern:
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");

// Or if you need bytes:
byte[] pdfBytes = renderer.RenderHtmlAsPdf(html).BinaryData;

Integration Model Change

The integration shape changes from REST client to in-process library:

// PDFBolt
using var http = new HttpClient();
http.DefaultRequestHeaders.Add("API-KEY", "YOUR-PDFBOLT-API-KEY");
// ... build JSON, POST to https://api.pdfbolt.com/v1/direct

// IronPDF
var renderer = new ChromePdfRenderer();

Configuration Pattern Change

PDFBolt configuration is JSON fields on the request body; IronPDF uses RenderingOptions:

// PDFBolt: JSON request fields
new { format = "A4", margin = new { top = "20mm" } }

// IronPDF: RenderingOptions properties
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.MarginTop = 20;

API Key Elimination

PDFBolt requires an API-KEY header on every request; IronPDF uses a one-time license key:

// PDFBolt: API key per HTTP call (security risk if leaked)
http.DefaultRequestHeaders.Add("API-KEY", config["PDFBolt: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

New Capabilities Available

After migrating to IronPDF, you gain capabilities that PDFBolt does not 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");

Troubleshooting

Issue 1: No PDFBolt Package on NuGet

Problem: Looking for using PDFBolt; / new HtmlToPdfConverter() in IronPDF.

Solution: PDFBolt has no .NET SDK - its integration is HttpClient against https://api.pdfbolt.com/v1/direct. IronPDF replaces that wrapper entirely with ChromePdfRenderer:

// IronPDF
var renderer = new ChromePdfRenderer();

Issue 2: Where Did ConvertHtmlString Go?

Problem: Migrating an in-house PDFBolt wrapper that exposed a ConvertHtmlString(html) method.

Solution: Use RenderHtmlAsPdf():

// IronPDF
var pdf = renderer.RenderHtmlAsPdf(html);

Issue 3: Where Did ConvertUrl Go?

Problem: Migrating an in-house PDFBolt wrapper that exposed a ConvertUrl(url) method.

Solution: Use RenderUrlAsPdf():

// IronPDF
var pdf = renderer.RenderUrlAsPdf(url);

Issue 4: format JSON Field → Enum

Problem: Translating PDFBolt's "format": "A4" JSON field.

Solution: Use PdfPaperSize from IronPdf.Rendering:

// 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>");

Migration Checklist

Pre-Migration

  • Inventory all PDFBolt REST calls in codebase (api.pdfbolt.com)
  • Document current JSON request fields (format, margin, printBackground, headerTemplate, etc.)
  • Identify API key management code to remove
  • List 429 / quota retry handling to delete
  • Obtain IronPDF license key

Package Changes

  • Delete the hand-rolled PDFBolt HttpClient wrapper and DTOs (no NuGet package to uninstall)
  • 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 the HttpClient + API-KEY integration with ChromePdfRenderer
  • Replace POST /v1/direct with RenderHtmlAsPdf() / RenderUrlAsPdf()
  • Replace await response.Content.ReadAsByteArrayAsync() + File.WriteAllBytes() with pdf.SaveAs() (or pdf.BinaryData if bytes are still needed)
  • Map "format" / "margin" JSON fields to RenderingOptions.PaperSize / RenderingOptions.MarginTop etc.
  • Remove API key management code
  • Remove 429 / rate limit handling
  • 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)

Please note: PDFBolt is a registered trademark of its respective owner. This site is not affiliated with, endorsed by, or sponsored by PDFBolt. All product names, logos, and brands are property of their respective owners. Comparisons are for informational purposes only and reflect publicly available information at the time of writing.
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

Related Articles

Key in blue circle

Get your free 30-day Trial Key instantly.

Your trial license will be sent to your email address

No limitations. 100% unlocked. No credit card.

bullet_checkedNo credit card or account creation requiredNo limitations. 100% unlocked. No credit card.
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
Book your free Live Demo
Booking Badge

Trusted by Millions of Engineers Worldwide

Iron Software's customer logos
Get Your No-Obligation Consult
Complete the form below or email sales@ironsoftware.com
Your details will always be kept confidential.
Trusted by Millions of Engineers Worldwide
Iron Software's customer logos
Get your free 30-day Trial Key instantly.
No credit card or account creation required