跳至页脚内容
迁移指南

如何用 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。 尽管对于快速原型来说很方便,但这种架构为生产应用程序带来了挑战:

  1. 仅限云处理:每个文档都通过PDFBolt的服务器——没有自托管选项,这对需要更多对数据流控制的团队来说可能是一个障碍。

  2. 数据隐私考虑:敏感文档(合同、医疗记录、财务数据)会外部传输。 处理受监管数据的公司会有正当的审核顾虑。

  3. 使用限制:免费层的数量限制为每月100个文档,每分钟20请求,1个并发请求,这可能不足以应付生产工作负载。 付费层(见pdfbolt.com/pricing)从$19/月到$249/月不等。

  4. 网络依赖:互联网中断或PDFBolt停机意味着您的PDF生成将完全停止。

5.延迟:与本地处理相比,网络往返会使每次转换增加几秒钟。

  1. 合规审查:当涉及外部文档处理时,GDPR、HIPAA和SOC2审计通常需要额外的文档。

  2. API 密钥安全:泄露的 API 密钥可能导致未经授权的使用,并被计入您的帐户。

  3. 供应商锁定:如果PDFBolt更改条款或关闭,您的应用程序将停止工作。

PDFBolt与IronPDF对比

关注 PDFBolt IronPDF
数据位置 外部服务器 仅限您的服务器
使用限制 每月100个免费/然后是分级订阅 无限制
需要互联网 是的,始终
延迟 网络往返 当地的
合规性 复杂(外部处理) 简单(本地处理)
成本模式 每月订阅层($19–$249/月) 一次性或年度
离线操作 不可能 完全支持
API 关键风险 泄露 = 计费 许可证密钥,无计费风险

IronPDF提供了一个基于现代.NET的自托管基础,保持文档处理本地化并消除了对外部云服务的依赖。


开始之前

前提条件

  1. .NET 环境: .NET Framework 4.6.2+ 或 .NET Core 3.1+ / .NET 5/6/7/8/9+
  2. NuGet 访问权限:能够安装 NuGet 包
  3. 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
SHELL

许可配置

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

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

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

结构性差异是集成模式。PDFBolt要求您将 HTML 进行 base64 编码,构建 JSON 负载,设置 API-KEY 头,将 POSThttps://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
$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");
    }
}
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
$vbLabelText   $csharpLabel

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

该示例显示了页面配置映射。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
$vbLabelText   $csharpLabel

集成模式更改

集成形状从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()
$vbLabelText   $csharpLabel

配置模式更改

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

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

删除网络错误处理

本地处理意味着无需处理网络错误:

// 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

可用的新功能

迁移到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")
$vbLabelText   $csharpLabel

故障排除

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

问题 2:ConvertHtmlString 去哪了?

问题:迁移一个内部使用的PDFBolt包装器,暴露了一个 ConvertHtmlString(html) 方法。

解决方案:使用 RenderHtmlAsPdf()

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

问题 3:ConvertUrl 去哪了?

问题:迁移一个内部使用的PDFBolt包装器,暴露了一个 ConvertUrl(url) 方法。

解决方案:使用 RenderUrlAsPdf()

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

问题 4:format JSON 字段 → 枚举

问题:翻译PDFBolt的 "format": "A4" JSON 字段。

解决方案:使用 PdfPaperSizeIronPdf.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
$vbLabelText   $csharpLabel

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

迁移清单

迁移前

  • 在代码库中盘点所有PDFBoltREST 调用 (api.pdfbolt.com)
  • 记录当前的 JSON 请求字段 (format, margin, printBackground, headerTemplate 等)
  • 识别要移除的 API 密钥管理代码
  • 列出要删除的429/限额重试处理
  • 获取IronPDF许可证密钥

软件包变更

  • 删除手动编写的PDFBoltHttpClient 包装器和 DTO (没有需要卸载的 NuGet 包)
  • 安装 IronPdf NuGet 包: 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 输出
  • 验证页面尺寸和边距是否正确显示。
  • 考虑添加新功能(水印、安全、合并)

请注意PDFBolt是其各自所有者的注册商标。 本网站与PDFBolt没有附属关系,未得到其认可或赞助。 所有产品名称、徽标和品牌均为各自所有者的财产。 比较仅供参考,反映撰写时公开可用的信息。

Curtis Chau
技术作家

Curtis Chau 拥有卡尔顿大学的计算机科学学士学位,专注于前端开发,精通 Node.js、TypeScript、JavaScript 和 React。他热衷于打造直观且美观的用户界面,喜欢使用现代框架并创建结构良好、视觉吸引力强的手册。

除了开发之外,Curtis 对物联网 (IoT) 有浓厚的兴趣,探索将硬件和软件集成的新方法。在空闲时间,他喜欢玩游戏和构建 Discord 机器人,将他对技术的热爱与创造力相结合。

钢铁支援团队

我们每周 5 天,每天 24 小时在线。
聊天
电子邮件
打电话给我