How to Migrate from PDFBolt to IronPDF in C#
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:
-
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.
-
Data Privacy Considerations: Sensitive documents (contracts, medical records, financial data) are transmitted externally. Companies dealing with regulated data will have legitimate review concerns.
-
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.
-
Network Dependency: Internet outages or PDFBolt downtime mean your PDF generation stops entirely.
-
Latency: Network round-trip adds seconds to every conversion compared to local processing.
-
Compliance Review: GDPR, HIPAA, and SOC2 audits typically require additional documentation when external document processing is involved.
-
API Key Security: Leaked API keys can result in unauthorized usage billed to your account.
- Vendor Lock-in: Your application stops working 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/month, then tiered subscriptions | Unlimited |
| Internet Required | Yes, always | No |
| Latency | Network round-trip | Local |
| Compliance | Complex (external processing) | Simple (local processing) |
| Cost Model | Monthly subscription tiers ($19–$249/mo) | One-time or annual |
| Offline Operation | Impossible | Fully supported |
| API Key Risks | Leaked = billed | License 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
- .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
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
# Install IronPDF (replaces the hand-rolled HttpClient wrapper)
dotnet add package IronPdf
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";
' Add at application startup (Program.vb or Startup.vb)
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" .
# 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" .
Complete API Reference
Core Concept Mappings
| PDFBolt (REST) | IronPDF |
|---|---|
HttpClient + API-KEY header |
new ChromePdfRenderer() |
| JSON request body | renderer.RenderingOptions |
POST https://api.pdfbolt.com/v1/direct |
renderer.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.WriteAllBytes |
pdf.SaveAs(path) |
await response.Content.ReadAsByteArrayAsync() |
pdf.BinaryData |
Page Configuration Mappings
| PDFBolt JSON | IronPDF |
|---|---|
"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);
}
}
// 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);
}
}
Imports System
Imports System.IO
Imports System.Net.Http
Imports System.Text
Imports System.Text.Json
Imports System.Threading.Tasks
Module Program
Async Function Main() As Task
Dim html As String = "<html><body><h1>Hello World</h1></body></html>"
Dim payload As String = JsonSerializer.Serialize(New With {
.html = Convert.ToBase64String(Encoding.UTF8.GetBytes(html))
})
Using http As New HttpClient()
http.DefaultRequestHeaders.Add("API-KEY", "YOUR-PDFBOLT-API-KEY")
Using content As New StringContent(payload, Encoding.UTF8, "application/json")
Using response As HttpResponseMessage = Await http.PostAsync("https://api.pdfbolt.com/v1/direct", content)
response.EnsureSuccessStatusCode()
Dim pdfBytes As Byte() = Await response.Content.ReadAsByteArrayAsync()
Await File.WriteAllBytesAsync("output.pdf", pdfBytes)
End Using
End Using
End Using
End Function
End Module
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");
}
}
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 Class
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);
}
}
// 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);
}
}
Imports System.IO
Imports System.Net.Http
Imports System.Text
Imports System.Text.Json
Imports System.Threading.Tasks
Module Program
Async Function Main() As Task
Dim payload = JsonSerializer.Serialize(New With {.url = "https://www.example.com"})
Using http As New HttpClient()
http.DefaultRequestHeaders.Add("API-KEY", "YOUR-PDFBOLT-API-KEY")
Using content As New StringContent(payload, Encoding.UTF8, "application/json")
Using response As HttpResponseMessage = Await http.PostAsync("https://api.pdfbolt.com/v1/direct", content)
response.EnsureSuccessStatusCode()
Dim pdfBytes As Byte() = Await response.Content.ReadAsByteArrayAsync()
Await File.WriteAllBytesAsync("webpage.pdf", pdfBytes)
End Using
End Using
End Using
End Function
End Module
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");
}
}
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 Class
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);
}
}
// 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);
}
}
Imports System
Imports System.IO
Imports System.Net.Http
Imports System.Text
Imports System.Text.Json
Imports System.Threading.Tasks
Module Program
Async Function Main() As Task
Dim html = Await File.ReadAllTextAsync("input.html")
Dim payload = JsonSerializer.Serialize(New With {
.html = Convert.ToBase64String(Encoding.UTF8.GetBytes(html)),
.format = "A4",
.margin = New With {.top = "20mm", .bottom = "20mm"},
.printBackground = True
})
Using http As New HttpClient()
http.DefaultRequestHeaders.Add("API-KEY", "YOUR-PDFBOLT-API-KEY")
Using content As New StringContent(payload, Encoding.UTF8, "application/json")
Using response As HttpResponseMessage = Await http.PostAsync("https://api.pdfbolt.com/v1/direct", content)
response.EnsureSuccessStatusCode()
Dim pdfBytes = Await response.Content.ReadAsByteArrayAsync()
Await File.WriteAllBytesAsync("output.pdf", pdfBytes)
End Using
End Using
End Using
End Function
End Module
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");
}
}
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 Class
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;
// 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;
Imports System.IO
Imports System.Net.Http
' PDFBolt pattern:
Dim pdfBytes = Await response.Content.ReadAsByteArrayAsync()
Await File.WriteAllBytesAsync("output.pdf", pdfBytes)
' IronPDF pattern:
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("output.pdf")
' Or if you need bytes:
Dim pdfBytes As Byte() = 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();
// 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();
Imports System.Net.Http
' PDFBolt
Using http As New HttpClient()
http.DefaultRequestHeaders.Add("API-KEY", "YOUR-PDFBOLT-API-KEY")
' ... build JSON, POST to https://api.pdfbolt.com/v1/direct
End Using
' IronPDF
Dim renderer As 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;
// PDFBolt: JSON request fields
new { format = "A4", margin = new { top = "20mm" } }
// IronPDF: RenderingOptions properties
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.MarginTop = 20;
' PDFBolt: JSON request fields
New With {Key .format = "A4", Key .margin = New With {Key .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();
// 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();
' 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"
Dim renderer As 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 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");
// 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: 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();
// IronPDF
var renderer = new ChromePdfRenderer();
' IronPDF
Dim renderer As 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);
// 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);
// 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;
// IronPDF
using IronPdf.Rendering;
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
Imports 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>");
' Warm up during application startup
Dim renderer As 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
HttpClientwrapper and DTOs (no NuGet package to uninstall) - 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 the
HttpClient+API-KEYintegration withChromePdfRenderer - Replace
POST /v1/directwithRenderHtmlAsPdf()/RenderUrlAsPdf() - Replace
await response.Content.ReadAsByteArrayAsync()+File.WriteAllBytes()withpdf.SaveAs()(orpdf.BinaryDataif bytes are still needed) - Map
"format"/"margin"JSON fields toRenderingOptions.PaperSize/RenderingOptions.MarginTopetc. - 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)

