跳至页脚内容
迁移指南

如何用 C# 从 PDFBolt 迁移到 IronPDF

从PDFBolt迁移到 IronPDF:完整的 C# 迁移指南

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

为什么要从PDFBolt迁移到 IronPDF.

仅限云的问题

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

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

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

3.使用限制:免费层的上限为每月 100 个文档,这可能无法满足大型企业的需求。 按文档付费的价格对于生产工作量来说会很快增加。

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

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

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

7.API 密钥安全性:泄漏的 API 密钥可能导致未经授权的使用,并将费用计入您的账户。

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

PDFBolt与IronPDF对比

关注PDFBoltIronPDF
数据位置外部服务器仅限您的服务器
使用限制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";
IRON VB CONVERTER ERROR developers@ironsoftware.com
$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 参考

核心类映射

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

转换方法映射

PDFBoltIronPDF备注
<代码>converter.ConvertHtmlString(html)</代码<代码>renderer.RenderHtmlAsPdf(html)</代码返回 PdfDocument
<代码>converter.ConvertUrl(url)</代码<代码>renderer.RenderUrlAsPdf(url)</代码返回 PdfDocument

输出方法映射

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

页面配置映射

PDFBoltIronPDF备注
<代码>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</代码单位:毫米

页眉/页脚占位符映射

PDFBoltIronPDF备注
<代码>{页码}</代码{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);
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$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");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$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);
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$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");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$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);
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$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");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$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;
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

类命名更改

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

// PDFBolt
var converter = new HtmlToPdfConverter();

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

// IronPDF
var renderer = new ChromePdfRenderer();
IRON VB CONVERTER ERROR developers@ironsoftware.com
$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;
IRON VB CONVERTER ERROR developers@ironsoftware.com
$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();
IRON VB CONVERTER ERROR developers@ironsoftware.com
$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
IRON VB CONVERTER ERROR developers@ironsoftware.com
$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");
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

故障排除

问题 1:HtmlToPdfConverter 未找到

问题HtmlToPdfConverter 类在IronPDF中不存在。

解决方案:使用 ChromePdfRenderer

// PDFBolt
var converter = new HtmlToPdfConverter();

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

// IronPDF
var renderer = new ChromePdfRenderer();
IRON VB CONVERTER ERROR developers@ironsoftware.com
$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);
IRON VB CONVERTER ERROR developers@ironsoftware.com
$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);
IRON VB CONVERTER ERROR developers@ironsoftware.com
$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;
IRON VB CONVERTER ERROR developers@ironsoftware.com
$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>");
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

迁移清单

迁移前

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

软件包变更

  • [ ] 删除 PDFBolt NuGet 软件包
  • [ ] 安装 IronPDF NuGet 软件包:<代码>dotnet 添加软件包 IronPdf
  • [ ] 添加 using IronPdf; 名称空间
  • [ ] 为纸张尺寸枚举添加 using IronPdf.Rendering;

代码更改

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

后迁移

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

结论

从PDFBolt迁移到IronPDF将您的 PDF 生成从外部云服务转移到本地处理,消除了数据隐私问题、使用限制和网络依赖性。 迁移以无限制的本地生成取代了按文档付费的模式,同时增加了PDFBolt无法提供的 PDF 操作功能。

本次迁移的主要变化有 1.数据位置:外部服务器 → 仅限于您的服务器 2.使用:每文档限制 → 无限制 3.:<代码>HtmlToPdfConverter</代码> → <代码>ChromePdfRenderer</代码 4.方法ConvertHtmlString()/ConvertUrl()RenderHtmlAsPdf()/RenderUrlAsPdf()。 5.输出byte[] + File.WriteAllBytes()PdfDocument.SaveAs() 6.配置:直接属性 → RenderingOptions 属性 7.身份验证:每次请求使用 API 密钥 → 启动时使用一次许可证密钥

探索完整的IronPDF文档教程API参考,加速您的PDFBolt迁移。

Curtis Chau
技术作家

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

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