如何用 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对比
| 关注 | 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许可配置
// 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确定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" .完整的 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);
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comAfter (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这里的根本区别在于返回类型和保存模式。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.comAfter (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.comPDFBolt 的 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.comAfter (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本示例展示了页面配置差异。PDFBolt可直接在转换器对象上设置属性(converter.PageSize、converter.MarginTop)。IronPDF在渲染器上使用 RenderingOptions 对象(renderer.RenderingOptions.PaperSize, renderer.RenderingOptions.MarginTop )。
关键映射:
PageSize.A4→PdfPaperSize.A4(枚举名称不同)MarginTop = 20→RenderingOptions.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类命名更改
主类名称从以转换器为中心改为以呈现器为中心:
// 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配置模式更改
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消除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删除网络错误处理
本地处理意味着无需处理网络错误:
// 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 entirelyIRON VB CONVERTER ERROR developers@ironsoftware.com可用的新功能
迁移到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故障排除
问题 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问题 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问题 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问题 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问题 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迁移清单
迁移前
- [清点代码库中所有PDFBolt的使用情况
- [ ] 记录当前页面配置设置(页面大小、页边距)
- [ ] 确定要删除的 API 密钥管理代码
- [ ] 列出要删除的任何速率限制或网络错误处理
- [ ] 获取 IronPdf 许可证密钥
软件包变更
- [ ] 删除
PDFBoltNuGet 软件包 - [ ] 安装
IronPDFNuGet 软件包:<代码>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 密钥 → 启动时使用一次许可证密钥






