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包。 整合是手工製作的,針對https://api.pdfbolt.com/v1/direct進行。 雖然方便於快速的原型設計,但這種架構在生產應用中會帶來挑戰:

  1. 僅限雲端處理: 每個文件都必須通過PDFBolt的伺服器 — 沒有自我托管的選項,這可能會阻礙需要更高資料流控制的團隊。

  2. 資料隱私考量: 高度機密的文件(例如合同,醫療記錄,財務資料)會被外部傳輸。 處理受監管資料的公司將有合理的審查疑慮。

  3. 使用限制: 免費層級每月限制為100個文件,20個請求/分鐘,1個並發請求,這可能無法滿足生產工作負載。 付費層級(根據pdfbolt.com/pricing)從每月19美元到每月249美元不等。

  4. 網路依賴: 互聯網中斷或PDFBolt停機意味著您的PDF生成將完全停止。

  5. 延遲: 與本地處理相比,網路往返會為每次轉換增加幾秒鐘。

  6. 合規性審查: GDPR,HIPAA和SOC2審核通常需要在涉及外部文件處理時附加文件。

  7. API密鑰安全: API密鑰泄露可能導致未授權的使用被計費至您的帳戶。

  8. 供應商綁定: 如果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包裝器和請求/響應DTOs。 然後安裝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 all PDFBolt REST 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 標頭new ChromePdfRenderer()
JSON請求主體renderer.RenderingOptions
POST https://api.pdfbolt.com/v1/directrenderer.RenderHtmlAsPdf(...) / RenderUrlAsPdf(...)
響應 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 標記)
<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);
    }
}

之後(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需要您base64編碼HTML,構建JSON負載,設置API-KEY 標頭,https://api.pdfbolt.com/v1/direct,等待響應,然後將返回的字節自行寫入磁盤。

IronPDF的PdfDocument物件。 面向物件的模型讓您在保存前操作PDF(新增浮水印,合併文件,應用安全性)。 如果您需要與現有程式碼相容的原始字節,請使用pdf.BinaryData。 查看HTML到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);
    }
}

之後(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的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);
    }
}

之後(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接受頂層"20mm")。 IronPDF在渲染器中使用帶有強型別屬性的RenderingOptions物件。

關鍵映射:

  • "format": "A4"PdfPaperSize.A4(強型別枚舉)
  • "margin": { "top": "20mm" }RenderingOptions.MarginTop = 20(數值mm)

IronPDF邊距始終是數字毫米,因此像"20mm"這樣的PDFBolt CSS單位字串可以直接映射。 需要PdfPaperSize枚舉。 有關其他頁面配置,請參閱渲染選項文件


關鍵遷移注意事項

返回型別變更

PDFBolt的/v1/direct端點將原始PDF作為HTTP響應主體返回; IronPDF返回一個PdfDocument

// PDFBolt pattern:
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進行的。 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字段。

解決方案: 使用IronPdf.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>");

遷移檢查表

遷移前

  • 清點程式碼庫中的所有PDFBolt REST調用(api.pdfbolt.com
  • 文件當前的JSON請求字段(headerTemplate,等。)
  • 確定需要移除的API密鑰管理程式碼
  • 列出要刪除的429 / 配額重試處理
  • 獲得IronPDF授權金鑰

套件變更

  • 刪除手工製作的PDFBolt HttpClient包裝器和DTOs(沒有需要解除安裝的NuGet包)
  • 安裝IronPdf NuGet包:dotnet add package IronPdf
  • 新增using IronPdf;命名空間
  • 新增using IronPdf.Rendering;用於紙張尺寸枚舉

程式碼變更

  • 在啟動時加入授權金鑰配置
  • HttpClient + API-KEY整合
  • RenderHtmlAsPdf() / POST /v1/direct
  • await response.Content.ReadAsByteArrayAsync() + File.WriteAllBytes()
  • "format" / "margin" JSON字段映射到RenderingOptions.PaperSize / RenderingOptions.MarginTop等。
  • 移除API密鑰管理程式碼
  • 移除429 / 速率限制處理
  • 移除網路錯誤處理

遷移後

  • 從配置文件中刪除API密鑰
  • 從秘密管理器中移除API密鑰
  • 運行所有比較PDF輸出的測試
  • 驗證頁面尺寸和邊距正確渲染
  • 考慮新增新的功能(水印,安全性,合併)

請注意: PDFBolt 是其各自所有者的註冊商標。 本網站與PDFBolt無關,也未獲得其認可或贊助。 所有產品名稱、標誌和品牌均為其各自所有者的財產。 比較僅供參考,反映撰寫時公開可用的資訊。
Curtis Chau
技術作家

Curtis Chau擁有Carleton大學的電腦科學學士學位,專精於前端開發,擁有Node.js、TypeScript、JavaScript和React的專業知識。Curtis熱衷於建立直觀且美觀的使用者介面,喜愛使用現代框架並建立結構良好、視覺吸引力的手冊。

...
閱讀更多

相關文章

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天試用金鑰
無需信用卡或帳戶建立