如何用 C# 从 PDFBolt 迁移到 IronPDF
从PDFBolt迁移到IronPDF将您的.NET PDF工作流从一个仅限云的SaaS REST服务转移到一个具有本地文档处理和无文档配额的自托管库。 本指南提供了一个逐步的迁移路径,消除了网络依赖、每月使用上限和外部数据传输,同时增加了PDFBolt不提供的PDF操作功能。
为什么要从PDFBolt迁移到 IronPDF.
仅限云的问题
PDFBolt是一个以云为基础的SaaS平台,以REST API的形式提供; 没有官方 .NET SDK,也没有 PDFBolt NuGet 包。 集成是用HttpClient 进行的,针对https://api.pdfbolt.com/v1/direct。 尽管对于快速原型来说很方便,但这种架构为生产应用程序带来了挑战:
-
仅限云处理:每个文档都通过PDFBolt的服务器——没有自托管选项,这对需要更多对数据流控制的团队来说可能是一个障碍。
-
数据隐私考虑:敏感文档(合同、医疗记录、财务数据)会外部传输。 处理受监管数据的公司会有正当的审核顾虑。
-
使用限制:免费层的数量限制为每月100个文档,每分钟20请求,1个并发请求,这可能不足以应付生产工作负载。 付费层(见pdfbolt.com/pricing)从$19/月到$249/月不等。
- 网络依赖:互联网中断或PDFBolt停机意味着您的PDF生成将完全停止。
5.延迟:与本地处理相比,网络往返会使每次转换增加几秒钟。
-
合规审查:当涉及外部文档处理时,GDPR、HIPAA和SOC2审计通常需要额外的文档。
-
API 密钥安全:泄露的 API 密钥可能导致未经授权的使用,并被计入您的帐户。
- 供应商锁定:如果PDFBolt更改条款或关闭,您的应用程序将停止工作。
PDFBolt与IronPDF对比
| 关注 | PDFBolt | IronPDF |
|---|---|---|
| 数据位置 | 外部服务器 | 仅限您的服务器 |
| 使用限制 | 每月100个免费/然后是分级订阅 | 无限制 |
| 需要互联网 | 是的,始终 | 否 |
| 延迟 | 网络往返 | 当地的 |
| 合规性 | 复杂(外部处理) | 简单(本地处理) |
| 成本模式 | 每月订阅层($19–$249/月) | 一次性或年度 |
| 离线操作 | 不可能 | 完全支持 |
| API 关键风险 | 泄露 = 计费 | 许可证密钥,无计费风险 |
IronPDF提供了一个基于现代.NET的自托管基础,保持文档处理本地化并消除了对外部云服务的依赖。
开始之前
前提条件
- .NET 环境: .NET Framework 4.6.2+ 或 .NET Core 3.1+ / .NET 5/6/7/8/9+
- NuGet 访问权限:能够安装 NuGet 包
- IronPDF 许可证:请从ironpdf.com获取您的许可证密钥。
NuGet 软件包变更
PDFBolt 没有官方 .NET SDK,也没有 PDFBolt NuGet 包,因此没有需要卸载的内容。PDFBolt端的清理是删除手动编写的HttpClient 包装器和请求/响应 DTO。 然后安装IronPDF:
# InstallIronPDF(replaces the hand-rolled HttpClient wrapper)
dotnet add package IronPdf
# InstallIronPDF(replaces the hand-rolled HttpClient wrapper)
dotnet add package IronPdf
许可配置
// 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"
确定PDFBolt的用法
# Find allPDFBoltREST 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 allPDFBoltREST 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" .
完整的 API 参考
核心概念映射
| PDFBolt(REST) | IronPDF |
|---|---|
HttpClient + API-KEY header |
new ChromePdfRenderer() |
| JSON请求体 | renderer.RenderingOptions |
POST https://api.pdfbolt.com/v1/direct |
renderer.RenderHtmlAsPdf(...) / RenderUrlAsPdf(...) |
Response byte[] |
PdfDocument |
转换方法映射
| PDFBolt(REST) | IronPDF |
|---|---|
POST /v1/direct 和 { "html": <base64> } |
renderer.RenderHtmlAsPdf(html) |
POST /v1/direct 和 { "url": "..." } |
renderer.RenderUrlAsPdf(url) |
输出方法映射
| PDFBolt(REST) | IronPDF |
|---|---|
await response.Content.ReadAsByteArrayAsync() 然后 File.WriteAllBytes |
pdf.SaveAs(path) |
await response.Content.ReadAsByteArrayAsync() |
pdf.BinaryData |
页面配置映射
| 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 |
页眉/页脚占位符映射
PDFBolt (内部 base64 编码的 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} |
代码迁移示例
示例 1:将基本 HTML 转换为 PDF.
之前(PDFBolt—通过HttpClient的REST):
// 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
结构性差异是集成模式。PDFBolt要求您将 HTML 进行 base64 编码,构建 JSON 负载,设置 API-KEY 头,将 POST 到 https://api.pdfbolt.com/v1/direct,等待响应,并自行将返回的字节写入磁盘。
IronPDF 的 ChromePdfRenderer.RenderHtmlAsPdf() 返回一个带有内置 SaveAs() 方法的 PdfDocument 对象。 面向对象的模型允许您在保存之前操作PDF(添加水印,合并文档,应用安全性)。 如果您需要原始字节以便与现有代码兼容,请使用 pdf.BinaryData。 有关其他渲染选项,请参阅 HTML to PDF 文档。
示例 2:URL 到 PDF 的转换
之前(PDFBolt—通过HttpClient的REST):
// 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
在PDFBolt方面,URL转换仍然需要完整的REST往返:构建JSON体,设置API密钥头部,等待POST,然后写入响应字节。 即便如此,即使您已经指向了一个公共URL,获取和渲染都发生在PDFBolt的服务器上。
IronPDF 的 RenderUrlAsPdf() 返回一个带有内置 SaveAs() 方法的 PdfDocument。 关键优势是IronPDF在本地执行URL获取和PDF渲染——没有文档数据会离开您的基础设施。 了解有关 URL 至 PDF 转换的更多信息。
示例 3:带有自定义页面设置的 HTML 文件
之前(PDFBolt—通过HttpClient的REST):
// 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
该示例显示了页面配置映射。PDFBolt接受顶级 format 和一个嵌套的 margin 对象,其值是 CSS 样式字符串 ("20mm")。IronPDF使用渲染器上的 RenderingOptions 对象,具有强类型的属性。
关键映射:
"format": "A4"→PdfPaperSize.A4(强类型枚举)"margin": { "top": "20mm" }→RenderingOptions.MarginTop = 20(数字 mm)
IronPDF 的边距始终是数字毫米,因此PDFBolt的 CSS 单位字符串如 "20mm" 可直接映射。 需要 IronPdf.Rendering 命名空间来访问 PdfPaperSize 枚举。 有关其他页面配置,请参见渲染选项文档。
关键迁移说明
返回类型更改
PDFBolt 的 /v1/direct 端点将原始 PDF 作为 HTTP 响应体返回;IronPDF返回一个 PdfDocument:
//PDFBoltpattern:
var pdfBytes = await response.Content.ReadAsByteArrayAsync();
await File.WriteAllBytesAsync("output.pdf", pdfBytes);
//IronPDFpattern:
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
// Or if you need bytes:
byte[] pdfBytes = renderer.RenderHtmlAsPdf(html).BinaryData;
//PDFBoltpattern:
var pdfBytes = await response.Content.ReadAsByteArrayAsync();
await File.WriteAllBytesAsync("output.pdf", pdfBytes);
//IronPDFpattern:
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
// Or if you need bytes:
byte[] pdfBytes = renderer.RenderHtmlAsPdf(html).BinaryData;
Imports System.IO
'PDFBoltpattern:
Dim pdfBytes = Await response.Content.ReadAsByteArrayAsync()
Await File.WriteAllBytesAsync("output.pdf", pdfBytes)
'IronPDFpattern:
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("output.pdf")
' Or if you need bytes:
Dim pdfBytes As Byte() = renderer.RenderHtmlAsPdf(html).BinaryData
集成模式更改
集成形状从REST客户端更改为进程内库:
// 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()
配置模式更改
PDFBolt配置在请求体上为JSON字段;IronPDF使用 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 关键字
PDFBolt 每个请求都需要一个 API-KEY 头;IronPDF 使用一次性许可证密钥:
// 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()
删除网络错误处理
本地处理意味着无需处理网络错误:
// 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
可用的新功能
迁移到IronPDF后,您将获得PDFBolt不提供的功能:
// 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")
故障排除
问题 1:NuGet 上没有 PDFBolt 包
问题:在IronPDF中寻找 using PDFBolt; / new HtmlToPdfConverter()。
解决方案:PDFBolt 没有 .NET SDK——其集成是 HttpClient 针对 https://api.pdfbolt.com/v1/direct。IronPDF完全替代该包装器,使用 ChromePdfRenderer:
// IronPDF
var renderer = new ChromePdfRenderer();
// IronPDF
var renderer = new ChromePdfRenderer();
' IronPDF
Dim renderer As New ChromePdfRenderer()
问题 2:ConvertHtmlString 去哪了?
问题:迁移一个内部使用的PDFBolt包装器,暴露了一个 ConvertHtmlString(html) 方法。
解决方案:使用 RenderHtmlAsPdf():
// IronPDF
var pdf = renderer.RenderHtmlAsPdf(html);
// IronPDF
var pdf = renderer.RenderHtmlAsPdf(html);
问题 3:ConvertUrl 去哪了?
问题:迁移一个内部使用的PDFBolt包装器,暴露了一个 ConvertUrl(url) 方法。
解决方案:使用 RenderUrlAsPdf():
// IronPDF
var pdf = renderer.RenderUrlAsPdf(url);
// IronPDF
var pdf = renderer.RenderUrlAsPdf(url);
问题 4:format JSON 字段 → 枚举
问题:翻译PDFBolt的 "format": "A4" JSON 字段。
解决方案:使用 PdfPaperSize 从 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
问题 5:首次生成 PDF 的速度很慢
问题:初始渲染时间比预期长。
解决方案: Chromium 引擎在首次使用时进行初始化。 如有需要,可进行预热:
// 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>")
迁移清单
迁移前
- 在代码库中盘点所有PDFBoltREST 调用 (
api.pdfbolt.com) - 记录当前的 JSON 请求字段 (
format,margin,printBackground,headerTemplate等) - 识别要移除的 API 密钥管理代码
- 列出要删除的429/限额重试处理
- 获取IronPDF许可证密钥
软件包变更
- 删除手动编写的PDFBolt
HttpClient包装器和 DTO (没有需要卸载的 NuGet 包) - 安装
IronPdfNuGet 包:dotnet add package IronPdf - 添加
using IronPdf;命名空间 - 为纸张尺寸枚举添加
using IronPdf.Rendering;
代码更改
- 在启动时添加许可证密钥配置
- 用
ChromePdfRenderer替换HttpClient+API-KEY集成 - 用
RenderHtmlAsPdf()/RenderUrlAsPdf()替换POST /v1/direct - 将
await response.Content.ReadAsByteArrayAsync()+File.WriteAllBytes()替换为pdf.SaveAs()(或者如果仍需字节则使用pdf.BinaryData) - 将
"format"/"margin"JSON 字段映射到RenderingOptions.PaperSize/RenderingOptions.MarginTop等 - 移除 API 密钥管理代码
- 移除429/速率限制处理
- 移除网络错误处理
后迁移
- 从配置文件中删除 API 密钥
- 从密钥管理器中移除 API 密钥
- 运行所有测试,比较 PDF 输出
- 验证页面尺寸和边距是否正确显示。
- 考虑添加新功能(水印、安全、合并)

