如何用 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 审计因外部文档处理而变得复杂。
- API 密钥安全:泄露的 API 密钥可能导致未经授权的使用,并被计入您的帐户。
8.供应商锁定:如果PDFBolt更改条款或关闭,您的应用程序将无法运行。
PDFBolt与IronPDF对比
| 关注 | PDFBolt | IronPDF |
|---|---|---|
| 数据位置 | 外部服务器 | 仅限您的服务器 |
| 使用限制 | 100 次免费,然后按文档收费 | 无限制 |
| 需要互联网 | 是的,始终 | 否 |
| 延迟 | 网络往返 | 毫秒 |
| 合规性 | 复杂(外部处理) | 简单(本地处理) |
| 成本模式 | 按文档 | 一次性或年度 |
| 离线操作 | 不可能 | 完全支持 |
| API 关键风险 | 泄露 = 计费 | 许可证密钥,无计费风险 |
对于计划在 2025 年和 2026 年之前采用 .NET 10 和 C# 14 的团队,IronPDF 提供了一个自托管基础,可确保完全的数据隐私并消除对外部云服务的依赖。
开始之前
前提条件
- .NET 环境: .NET Framework 4.6.2+ 或 .NET Core 3.1+ / .NET 5/6/7/8/9+
- NuGet 访问权限:能够安装 NuGet 包
- 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";确定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);
}
}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");
}
}这里的根本区别在于返回类型和保存模式。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);
}
}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");
}
}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);
}
}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");
}
}本示例展示了页面配置差异。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;类命名更改
主类名称从以转换器为中心改为以呈现器为中心:
// PDFBolt
var converter = new HtmlToPdfConverter();
// IronPDF
var renderer = new ChromePdfRenderer();// PDFBolt
var converter = new HtmlToPdfConverter();
// IronPDF
var renderer = new ChromePdfRenderer();配置模式更改
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;消除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();删除网络错误处理
本地处理意味着无需处理网络错误:
// 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");故障排除
问题 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();问题 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);问题 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);问题 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;问题 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>");迁移清单
迁移前
- 清点代码库中所有PDFBolt的使用情况
- 记录当前页面配置设置(页面大小、边距)
- 识别要移除的 API 密钥管理代码
- 列出任何要删除的速率限制或网络错误处理程序
- 获取IronPDF许可证密钥
软件包变更
- 移除
PDFBoltNuGet 包 安装IronPdfNuGet 包: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 输出
- 验证页面尺寸和边距是否正确显示。
- 考虑添加新功能(水印、安全、合并)






