跳至页脚内容
迁移指南

如何用 C# 从 PDFBolt 迁移到 IronPDF

从PDFBolt迁移到IronPDF可将您的 .NET PDF 工作流程从仅支持云的外部文档处理 SaaS 服务迁移到具有完全数据隐私和无限本地生成功能的自托管库。 本指南提供了一个全面、逐步的迁移路径,可消除网络依赖性、使用限制和外部数据传输,同时获得PDFBolt无法提供的 PDF 操作功能。

为什么要从PDFBolt迁移到 IronPDF.

仅限云的问题

PDFBolt 是一个纯云 SaaS 平台,可在外部服务器上处理您的文档。 这种架构虽然方便快速制作原型,但却给生产应用带来了巨大挑战:

1.仅云端处理:每个文档都通过外部服务器处理——没有自托管选项,这可能会阻碍那些需要更多控制其数据和流程的企业。

2.数据隐私风险:敏感文件(合同、医疗记录、财务数据)必须向外传输。 处理敏感信息的公司会有合理的顾虑。

3.使用限制:免费套餐每月最多只能处理 100 个文档,这对于规模较大的企业来说可能不够用。 按文档付费的价格对于生产工作量来说会很快增加。

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

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

6.合规性问题: GDPR、HIPAA 和 SOC2 审计因外部文档处理而变得复杂。

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

8.供应商锁定:如果PDFBolt更改条款或关闭,您的应用程序将无法运行。

PDFBolt与IronPDF对比

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

对于计划在 2025 年和 2026 年之前采用 .NET 10 和 C# 14 的团队,IronPDF 提供了一个自托管基础,可确保完全的数据隐私并消除对外部云服务的依赖。


开始之前

前提条件

  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 软件包变更

# Remove PDFBolt
dotnet remove package PDFBolt

# Install IronPDF
dotnet add package IronPdf
# Remove PDFBolt
dotnet remove package PDFBolt

# Install IronPDF
dotnet add package IronPdf
SHELL

许可配置

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

确定PDFBolt的用法

# Find allPDFBoltreferences
grep -r "PDFBolt\|HtmlToPdfConverter\|ConvertHtmlString\|ConvertUrl" --include="*.cs" .

# Find API key references
grep -r "PDFBOLT\|ApiKey" --include="*.cs" --include="*.json" --include="*.config" .
# Find allPDFBoltreferences
grep -r "PDFBolt\|HtmlToPdfConverter\|ConvertHtmlString\|ConvertUrl" --include="*.cs" .

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

完整的 API 参考

核心类映射

PDFBolt IronPDF 备注
new HtmlToPdfConverter() new ChromePdfRenderer() 主呈现器
页面大小 PdfPaperSize 纸张尺寸枚举
(返回字节[]) PDF 文档 丰富的文档对象

转换方法映射

PDFBolt IronPDF 备注
converter.ConvertHtmlString(html) renderer.RenderHtmlAsPdf(html) 返回 PdfDocument
converter.ConvertUrl(url) renderer.RenderUrlAsPdf(url) 返回 PdfDocument

输出方法映射

PDFBolt IronPDF 备注
File.WriteAllBytes(path,pdf) pdf.SaveAs(路径) 直接保存法
(pdf是字节[]) pdf.BinaryData 获取字节数组
(手动流) pdf.Stream 流属性

页面配置映射

PDFBolt IronPDF 备注
converter.PageSize = PageSize.A4 renderer.RenderingOptions.PaperSize = PdfPaperSize.A4 纸张尺寸枚举
converter.MarginTop = 20 renderer.RenderingOptions.MarginTop = 20 单位:毫米
converter.MarginBottom = 20 renderer.RenderingOptions.MarginBottom = 20 单位:毫米
converter.MarginLeft = 15 renderer.RenderingOptions.MarginLeft = 15 单位:毫米
converter.MarginRight = 15 renderer.RenderingOptions.MarginRight = 15 单位:毫米

页眉/页脚占位符映射

PDFBolt IronPDF 备注
{页码} {page} 当前页面
{总页数} {总页数} 总页数
{日期} {日期} 相同
{标题} {html-title} 文件标题

代码迁移示例

示例 1:将基本 HTML 转换为 PDF.

之前 (PDFBolt):

// NuGet: Install-Package PDFBolt
using PDFBolt;
using System.IO;

class Program
{
    static void Main()
    {
        var converter = new HtmlToPdfConverter();
        var html = "<html><body><h1>Hello World</h1></body></html>";
        var pdf = converter.ConvertHtmlString(html);
        File.WriteAllBytes("output.pdf", pdf);
    }
}
// NuGet: Install-Package PDFBolt
using PDFBolt;
using System.IO;

class Program
{
    static void Main()
    {
        var converter = new HtmlToPdfConverter();
        var html = "<html><body><h1>Hello World</h1></body></html>";
        var pdf = converter.ConvertHtmlString(html);
        File.WriteAllBytes("output.pdf", pdf);
    }
}
$vbLabelText   $csharpLabel

After (IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;
using System.IO;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var html = "<html><body><h1>Hello World</h1></body></html>";
        var pdf = renderer.RenderHtmlAsPdf(html);
        pdf.SaveAs("output.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System.IO;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var html = "<html><body><h1>Hello World</h1></body></html>";
        var pdf = renderer.RenderHtmlAsPdf(html);
        pdf.SaveAs("output.pdf");
    }
}
$vbLabelText   $csharpLabel

这里的根本区别在于返回类型和保存模式。PDFBolt的 HtmlToPdfConverter.ConvertHtmlString() 返回一个 byte[] ,您必须使用 File.WriteAllBytes() 手动将其写入磁盘。 这需要导入 System.IO 并自行处理文件操作。

IronPDF 的 ChromePdfRenderer.RenderHtmlAsPdf() 返回一个带有内置 SaveAs() 方法的PDF 文档对象。 这种面向对象的方法还有其他好处:您可以在保存之前对 PDF 进行操作(添加水印、合并文档、添加安全性)。 如果您需要原始字节以便与现有代码兼容,请使用 pdf.BinaryData. 有关其他渲染选项,请参阅 HTML to PDF 文档

示例 2:URL 到 PDF 的转换

之前 (PDFBolt):

// NuGet: Install-Package PDFBolt
using PDFBolt;
using System.IO;

class Program
{
    static void Main()
    {
        var converter = new HtmlToPdfConverter();
        var pdf = converter.ConvertUrl("https://www.example.com");
        File.WriteAllBytes("webpage.pdf", pdf);
    }
}
// NuGet: Install-Package PDFBolt
using PDFBolt;
using System.IO;

class Program
{
    static void Main()
    {
        var converter = new HtmlToPdfConverter();
        var pdf = converter.ConvertUrl("https://www.example.com");
        File.WriteAllBytes("webpage.pdf", pdf);
    }
}
$vbLabelText   $csharpLabel

After (IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderUrlAsPdf("https://www.example.com");
        pdf.SaveAs("webpage.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderUrlAsPdf("https://www.example.com");
        pdf.SaveAs("webpage.pdf");
    }
}
$vbLabelText   $csharpLabel

PDFBolt 的 URL 转换模式采用与 HTML 转换相同的方法:ConvertUrl() 返回 byte[] ,需要 File.WriteAllBytes() 进行保存。 请注意,即使您已经从 URL 获取数据,PDFBolt 仍然需要通过网络往返其服务器。

IronPDF 的 RenderUrlAsPdf() 方法使用内置的 SaveAs() 方法返回一个PDF 文档。 这里的关键优势在于IronPDF在本地执行 URL 抓取和 PDF 渲染--数据不会离开您的基础架构。 请注意,IronPDF 版本甚至不需要 using System.IO;这个简单的案例。 了解有关 URL 至 PDF 转换的更多信息。

示例 3:带有自定义页面设置的 HTML 文件

之前 (PDFBolt):

// NuGet: Install-Package PDFBolt
using PDFBolt;
using System.IO;

class Program
{
    static void Main()
    {
        var converter = new HtmlToPdfConverter();
        converter.PageSize = PageSize.A4;
        converter.MarginTop = 20;
        converter.MarginBottom = 20;
        var html = File.ReadAllText("input.html");
        var pdf = converter.ConvertHtmlString(html);
        File.WriteAllBytes("output.pdf", pdf);
    }
}
// NuGet: Install-Package PDFBolt
using PDFBolt;
using System.IO;

class Program
{
    static void Main()
    {
        var converter = new HtmlToPdfConverter();
        converter.PageSize = PageSize.A4;
        converter.MarginTop = 20;
        converter.MarginBottom = 20;
        var html = File.ReadAllText("input.html");
        var pdf = converter.ConvertHtmlString(html);
        File.WriteAllBytes("output.pdf", pdf);
    }
}
$vbLabelText   $csharpLabel

After (IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;
using System.IO;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
        renderer.RenderingOptions.MarginTop = 20;
        renderer.RenderingOptions.MarginBottom = 20;
        var html = File.ReadAllText("input.html");
        var pdf = renderer.RenderHtmlAsPdf(html);
        pdf.SaveAs("output.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;
using System.IO;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
        renderer.RenderingOptions.MarginTop = 20;
        renderer.RenderingOptions.MarginBottom = 20;
        var html = File.ReadAllText("input.html");
        var pdf = renderer.RenderHtmlAsPdf(html);
        pdf.SaveAs("output.pdf");
    }
}
$vbLabelText   $csharpLabel

本示例展示了页面配置差异。PDFBolt可直接在转换器对象上设置属性(converter.PageSizeconverter.MarginTop)。IronPDF在渲染器上使用 RenderingOptions 对象(renderer.RenderingOptions.PaperSize, renderer.RenderingOptions.MarginTop )。

关键映射:

  • PageSize.A4PdfPaperSize.A4 (枚举名称不同)
  • MarginTop = 20RenderingOptions.MarginTop = 20 (通过 RenderingOptions)

两者都使用毫米作为边距值,因此您现有的边距值应该可以直接转换。 访问PdfPaperSize枚举需要 IronPdf.Rendering 命名空间。 有关其他页面配置选项,请参阅 渲染选项文档


关键迁移说明

返回类型更改

PDFBolt 可直接返回 byte[] ;IronPDF返回 PdfDocument

//PDFBoltpattern:
byte[] pdf = converter.ConvertHtmlString(html);
File.WriteAllBytes("output.pdf", pdf);

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

// Or if you need bytes:
byte[] pdfBytes = renderer.RenderHtmlAsPdf(html).BinaryData;
//PDFBoltpattern:
byte[] pdf = converter.ConvertHtmlString(html);
File.WriteAllBytes("output.pdf", pdf);

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

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

类命名更改

主类名称从以转换器为中心改为以呈现器为中心:

// PDFBolt
var converter = new HtmlToPdfConverter();

// IronPDF
var renderer = new ChromePdfRenderer();
// PDFBolt
var converter = new HtmlToPdfConverter();

// IronPDF
var renderer = new ChromePdfRenderer();
$vbLabelText   $csharpLabel

配置模式更改

PDFBolt 使用直接属性;IronPDF使用 RenderingOptions

// PDFBolt: Direct properties
converter.PageSize = PageSize.A4;
converter.MarginTop = 20;

// IronPDF: Via RenderingOptions
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.MarginTop = 20;
// PDFBolt: Direct properties
converter.PageSize = PageSize.A4;
converter.MarginTop = 20;

// IronPDF: Via RenderingOptions
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.MarginTop = 20;
$vbLabelText   $csharpLabel

消除API 关键字

PDFBolt 需要按请求进行 API 密钥管理; IronPdf 使用一次性许可证密钥:

// PDFBolt: API key per client (security risk if leaked)
var apiKey = config["PDFBolt:ApiKey"];
var client = new Client(apiKey);

// IronPDF: License key once at startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
var renderer = new ChromePdfRenderer();
// PDFBolt: API key per client (security risk if leaked)
var apiKey = config["PDFBolt:ApiKey"];
var client = new Client(apiKey);

// IronPDF: License key once at startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
var renderer = new ChromePdfRenderer();
$vbLabelText   $csharpLabel

删除网络错误处理

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

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

故障排除

问题 1:HtmlToPdfConverter 未找到

问题:IronPDF中不存在HtmlToPdfConverter类。

解决方案:使用ChromePdfRenderer

// PDFBolt
var converter = new HtmlToPdfConverter();

// IronPDF
var renderer = new ChromePdfRenderer();
// PDFBolt
var converter = new HtmlToPdfConverter();

// IronPDF
var renderer = new ChromePdfRenderer();
$vbLabelText   $csharpLabel

问题 2:未找到 ConvertHtmlString

问题: ConvertHtmlString()方法不存在。

解决方案:使用RenderHtmlAsPdf()

// PDFBolt
var pdf = converter.ConvertHtmlString(html);

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

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

问题 3:未找到 ConvertUrl

问题: ConvertUrl()方法不存在。

解决方案:使用RenderUrlAsPdf()

// PDFBolt
var pdf = converter.ConvertUrl(url);

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

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

问题 4:未找到 PageSize 枚举

问题: PageSize枚举不存在。

解决方案:使用IronPdf.Rendering中的PdfPaperSize

// PDFBolt
converter.PageSize = PageSize.A4;

// IronPDF
using IronPdf.Rendering;
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
// PDFBolt
converter.PageSize = PageSize.A4;

// IronPDF
using IronPdf.Rendering;
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
$vbLabelText   $csharpLabel

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

迁移清单

迁移前

  • 清点代码库中所有PDFBolt的使用情况
  • 记录当前页面配置设置(页面大小、边距)
  • 识别要移除的 API 密钥管理代码
  • 列出任何要删除的速率限制或网络错误处理程序
  • 获取IronPDF许可证密钥

软件包变更

  • 移除PDFBolt NuGet 包 安装IronPdf NuGet 包: dotnet add package IronPdf
  • 添加using IronPdf;命名空间
  • 添加using IronPdf.Rendering;用于纸张尺寸枚举

代码更改

  • 在启动时添加许可证密钥配置
  • HtmlToPdfConverter替换为ChromePdfRenderer
  • ConvertHtmlString()替换为RenderHtmlAsPdf()
  • ConvertUrl()替换为RenderUrlAsPdf()
  • File.WriteAllBytes()替换为pdf.SaveAs()
  • PageSize更新为RenderingOptions.PaperSize
  • 将边距属性更新为RenderingOptions.MarginTop等。
  • 移除 API 密钥管理代码
  • 移除速率限制处理代码
  • 移除网络错误处理

后迁移

  • 从配置文件中删除 API 密钥
  • 从密钥管理器中移除 API 密钥
  • 运行所有测试,比较 PDF 输出
  • 验证页面尺寸和边距是否正确显示。
  • 考虑添加新功能(水印、安全、合并)

Curtis Chau
技术作家

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

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