IRONSOFTWAREHOME
视频

如何在 C# 中给 PDF 添加印章和水印

Curtis Chau
Curtis Chau
Updated: 2026年7月19日

从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对比

关注PDFBoltIronPDF
数据位置外部服务器仅限您的服务器
使用限制每月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
SHELL

许可配置

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

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

完整的 API 参考

核心概念映射

PDFBolt(REST)IronPDF
HttpClient + API-KEY headernew ChromePdfRenderer()
JSON请求体renderer.RenderingOptions
POST https://api.pdfbolt.com/v1/directrenderer.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.WriteAllBytespdf.SaveAs(path)
await response.Content.ReadAsByteArrayAsync()pdf.BinaryData

页面配置映射

PDFBolt JSONIronPDF
"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);
    }
}

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");
    }
}

结构性差异是集成模式。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);
    }
}

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");
    }
}

在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);
    }
}

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");
    }
}

该示例显示了页面配置映射。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;
C#

集成模式更改

集成形状从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配置在请求体上为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;

消除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: 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");

故障排除

问题 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();

问题 2:ConvertHtmlString 去哪了?

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

**解决方案:**使用 RenderHtmlAsPdf()

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

问题 3:ConvertUrl 去哪了?

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

**解决方案:**使用 RenderUrlAsPdf()

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

问题 4:format JSON 字段 → 枚举

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

**解决方案:**使用 PdfPaperSizeIronPdf.Rendering

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

迁移清单

迁移前

  • 在代码库中盘点所有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。他热衷于打造直观且美观的用户界面,喜欢使用现代框架并创建结构良好、视觉吸引力强的手册。

...
阅读更多

相关文章

Key in blue circle

立即获取免费的 30 天试用版密钥

Your trial license will be sent to your email address

无任何限制。100% 解锁。无需信用卡。

bullet_checked无需信用卡或创建账户无任何限制。100% 解锁。无需信用卡。
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
预约您的免费现场演示
Booking Badge

深受全球数百万工程师信赖

Iron Software 的客户徽标
获取您的无义务咨询
填写下面的表格或通过sales@ironsoftware.com
您的资料将始终保密。
深受全球数百万工程师信赖
Iron Software 的客户徽标
立即获取您的免费30 天试用密钥
无需信用卡或创建账户