
如何在 C# 中為 PDF 新增印章和水印
將PDFBolt遷移到IronPDF,將您的.NET PDF工作流程從僅限雲端的SaaS REST服務轉移到自我托管的程式庫中,進行本地文件處理並且不受每個文件的配額限制。 本指南提供了一個逐步遷移路徑,消除網路依賴、每月使用上限和外部資料傳輸,同時增加PDFBolt未提供的PDF操作功能。
為何從PDFBolt遷移到IronPDF
僅限雲端的問題
PDFBolt是一個僅限雲端的SaaS平台,作為REST API來提供服務; 沒有官方的.NET SDK,沒有PDFBolt NuGet包。 整合是手工製作的,針對https://api.pdfbolt.com/v1/direct進行。 雖然方便於快速的原型設計,但這種架構在生產應用中會帶來挑戰:
-
僅限雲端處理: 每個文件都必須通過PDFBolt的伺服器 - 沒有自我托管的選項,這可能會阻礙需要更高資料流控制的團隊。
-
資料隱私考量: 高度機密的文件(例如合同,醫療記錄,財務資料)會被外部傳輸。 處理受監管資料的公司將有合理的審查疑慮。
-
使用限制: 免費層級每月限制為100個文件,20個請求/分鐘,1個並發請求,這可能無法滿足生產工作負載。 付費層級(根據pdfbolt.com/pricing)從每月19美元到每月249美元不等。
-
網路依賴: 互聯網中斷或PDFBolt停機意味著您的PDF生成將完全停止。
-
延遲: 與本地處理相比,網路往返會為每次轉換增加幾秒鐘。
-
合規性審查: GDPR,HIPAA和SOC2審核通常需要在涉及外部文件處理時附加文件。
-
API密鑰安全: API密鑰泄露可能導致未授權的使用被計費至您的帳戶。
-
供應商綁定: 如果PDFBolt更改條款或關閉,您的應用程式將停止運作。
PDFBolt與IronPDF的比較
| 關注事項 | PDFBolt | IronPDF |
|---|---|---|
| 資料位置 | 外部伺服器 | 僅限您的伺服器 |
| 使用限制 | 每月100個免費/然後分級訂閱 | 無限制 |
| 需要互聯網 | 是的,總是需要 | 否 |
| 延遲 | 網路往返 | 本地 |
| 合規性 | 複雜(外部處理) | 簡單(本地處理) |
| 成本模型 | 每月訂閱層級(19至249美元/月) | 一次性或年度 |
| 離線操作 | 不可能 | 全面支持 |
| API密鑰風險 | 洩露=計費 | 授權密鑰,無計費風險 |
IronPDF在現代.NET上提供自我托管的基礎,保持文件處理在本地,消除了對外部雲服務的依賴。
開始之前
前提條件
- .NET環境:.NET Framework 4.6.2+ 或.NET Core 3.1+ / .NET 5/6/7/8/9+
- NuGet存取: 有能力安裝NuGet套件
- IronPDF授權: 從ironpdf.com獲取您的授權金鑰
NuGet包變更
PDFBolt沒有官方的.NET SDK和PDFBolt NuGet包,因此無需解除安裝。 PDFBolt端的清理是刪除手工製作的HttpClient包裝器和請求/響應DTOs。 然後安裝IronPDF:
# InstallIronPDF(replaces the hand-rolled HttpClient wrapper)
dotnet add package IronPdf
授權配置
// Add at application startup (Program.cs or Startup.cs)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";' Add at application startup (Program.vb or Startup.vb)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"' Add at application startup (Program.vb or Startup.vb)
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" .
完整API參考
核心概念映射
| PDFBolt(REST) | IronPDF |
|---|---|
HttpClient + API-KEY 標頭 | new ChromePdfRenderer() |
| JSON請求主體 | renderer.RenderingOptions |
POST https://api.pdfbolt.com/v1/direct | renderer.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.WriteAllBytes | pdf.SaveAs(path) |
await response.Content.ReadAsByteArrayAsync() | pdf.BinaryData |
頁面配置映射
| PDFBolt JSON | IronPDF |
|---|---|
"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);
}
}// 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);
}
}Imports System
Imports System.IO
Imports System.Net.Http
Imports System.Text
Imports System.Text.Json
Imports System.Threading.Tasks
Module Program
Async Function Main() As Task
Dim html As String = "<html><body><h1>Hello World</h1></body></html>"
Dim payload As String = JsonSerializer.Serialize(New With {
.html = Convert.ToBase64String(Encoding.UTF8.GetBytes(html))
})
Using http As New HttpClient()
http.DefaultRequestHeaders.Add("API-KEY", "YOUR-PDFBOLT-API-KEY")
Using content As New StringContent(payload, Encoding.UTF8, "application/json")
Using response As HttpResponseMessage = Await http.PostAsync("https://api.pdfbolt.com/v1/direct", content)
response.EnsureSuccessStatusCode()
Dim pdfBytes As Byte() = Await response.Content.ReadAsByteArrayAsync()
Await File.WriteAllBytesAsync("output.pdf", pdfBytes)
End Using
End Using
End Using
End Function
End ModuleImports System
Imports System.IO
Imports System.Net.Http
Imports System.Text
Imports System.Text.Json
Imports System.Threading.Tasks
Module Program
Async Function Main() As Task
Dim html As String = "<html><body><h1>Hello World</h1></body></html>"
Dim payload As String = JsonSerializer.Serialize(New With {
.html = Convert.ToBase64String(Encoding.UTF8.GetBytes(html))
})
Using http As New HttpClient()
http.DefaultRequestHeaders.Add("API-KEY", "YOUR-PDFBOLT-API-KEY")
Using content As New StringContent(payload, Encoding.UTF8, "application/json")
Using response As HttpResponseMessage = Await http.PostAsync("https://api.pdfbolt.com/v1/direct", content)
response.EnsureSuccessStatusCode()
Dim pdfBytes As Byte() = Await response.Content.ReadAsByteArrayAsync()
Await File.WriteAllBytesAsync("output.pdf", pdfBytes)
End Using
End Using
End Using
End Function
End Module之後(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");
}
}Imports IronPdf
Imports System.IO
Class Program
Shared Sub Main()
Dim renderer = New ChromePdfRenderer()
Dim html = "<html><body><h1>Hello World</h1></body></html>"
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("output.pdf")
End Sub
End ClassImports IronPdf
Imports System.IO
Class Program
Shared Sub Main()
Dim renderer = New ChromePdfRenderer()
Dim html = "<html><body><h1>Hello World</h1></body></html>"
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("output.pdf")
End Sub
End Class結構差異是整合模型。 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);
}
}// 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);
}
}Imports System.IO
Imports System.Net.Http
Imports System.Text
Imports System.Text.Json
Imports System.Threading.Tasks
Module Program
Async Function Main() As Task
Dim payload = JsonSerializer.Serialize(New With {.url = "https://www.example.com"})
Using http As New HttpClient()
http.DefaultRequestHeaders.Add("API-KEY", "YOUR-PDFBOLT-API-KEY")
Using content As New StringContent(payload, Encoding.UTF8, "application/json")
Using response As HttpResponseMessage = Await http.PostAsync("https://api.pdfbolt.com/v1/direct", content)
response.EnsureSuccessStatusCode()
Dim pdfBytes As Byte() = Await response.Content.ReadAsByteArrayAsync()
Await File.WriteAllBytesAsync("webpage.pdf", pdfBytes)
End Using
End Using
End Using
End Function
End ModuleImports System.IO
Imports System.Net.Http
Imports System.Text
Imports System.Text.Json
Imports System.Threading.Tasks
Module Program
Async Function Main() As Task
Dim payload = JsonSerializer.Serialize(New With {.url = "https://www.example.com"})
Using http As New HttpClient()
http.DefaultRequestHeaders.Add("API-KEY", "YOUR-PDFBOLT-API-KEY")
Using content As New StringContent(payload, Encoding.UTF8, "application/json")
Using response As HttpResponseMessage = Await http.PostAsync("https://api.pdfbolt.com/v1/direct", content)
response.EnsureSuccessStatusCode()
Dim pdfBytes As Byte() = Await response.Content.ReadAsByteArrayAsync()
Await File.WriteAllBytesAsync("webpage.pdf", pdfBytes)
End Using
End Using
End Using
End Function
End Module之後(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");
}
}Imports IronPdf
Class Program
Shared Sub Main()
Dim renderer As New ChromePdfRenderer()
Dim pdf = renderer.RenderUrlAsPdf("https://www.example.com")
pdf.SaveAs("webpage.pdf")
End Sub
End ClassImports IronPdf
Class Program
Shared Sub Main()
Dim renderer As New ChromePdfRenderer()
Dim pdf = renderer.RenderUrlAsPdf("https://www.example.com")
pdf.SaveAs("webpage.pdf")
End Sub
End Class在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);
}
}// 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);
}
}Imports System
Imports System.IO
Imports System.Net.Http
Imports System.Text
Imports System.Text.Json
Imports System.Threading.Tasks
Module Program
Async Function Main() As Task
Dim html = Await File.ReadAllTextAsync("input.html")
Dim payload = JsonSerializer.Serialize(New With {
.html = Convert.ToBase64String(Encoding.UTF8.GetBytes(html)),
.format = "A4",
.margin = New With {.top = "20mm", .bottom = "20mm"},
.printBackground = True
})
Using http As New HttpClient()
http.DefaultRequestHeaders.Add("API-KEY", "YOUR-PDFBOLT-API-KEY")
Using content As New StringContent(payload, Encoding.UTF8, "application/json")
Using response As HttpResponseMessage = Await http.PostAsync("https://api.pdfbolt.com/v1/direct", content)
response.EnsureSuccessStatusCode()
Dim pdfBytes = Await response.Content.ReadAsByteArrayAsync()
Await File.WriteAllBytesAsync("output.pdf", pdfBytes)
End Using
End Using
End Using
End Function
End ModuleImports System
Imports System.IO
Imports System.Net.Http
Imports System.Text
Imports System.Text.Json
Imports System.Threading.Tasks
Module Program
Async Function Main() As Task
Dim html = Await File.ReadAllTextAsync("input.html")
Dim payload = JsonSerializer.Serialize(New With {
.html = Convert.ToBase64String(Encoding.UTF8.GetBytes(html)),
.format = "A4",
.margin = New With {.top = "20mm", .bottom = "20mm"},
.printBackground = True
})
Using http As New HttpClient()
http.DefaultRequestHeaders.Add("API-KEY", "YOUR-PDFBOLT-API-KEY")
Using content As New StringContent(payload, Encoding.UTF8, "application/json")
Using response As HttpResponseMessage = Await http.PostAsync("https://api.pdfbolt.com/v1/direct", content)
response.EnsureSuccessStatusCode()
Dim pdfBytes = Await response.Content.ReadAsByteArrayAsync()
Await File.WriteAllBytesAsync("output.pdf", pdfBytes)
End Using
End Using
End Using
End Function
End Module之後(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");
}
}Imports IronPdf
Imports IronPdf.Rendering
Imports System.IO
Class Program
Shared Sub Main()
Dim renderer = New ChromePdfRenderer()
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4
renderer.RenderingOptions.MarginTop = 20
renderer.RenderingOptions.MarginBottom = 20
Dim html = File.ReadAllText("input.html")
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("output.pdf")
End Sub
End ClassImports IronPdf
Imports IronPdf.Rendering
Imports System.IO
Class Program
Shared Sub Main()
Dim renderer = New ChromePdfRenderer()
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4
renderer.RenderingOptions.MarginTop = 20
renderer.RenderingOptions.MarginBottom = 20
Dim html = File.ReadAllText("input.html")
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("output.pdf")
End Sub
End Class此範例展示了頁面配置映射。 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;// 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;' PDFBolt pattern:
Dim pdfBytes = Await response.Content.ReadAsByteArrayAsync()
Await File.WriteAllBytesAsync("output.pdf", pdfBytes)
'IronPDF pattern:
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("output.pdf")
' Or if you need bytes:
Dim pdfBytes() As Byte = renderer.RenderHtmlAsPdf(html).BinaryData' PDFBolt pattern:
Dim pdfBytes = Await response.Content.ReadAsByteArrayAsync()
Await File.WriteAllBytesAsync("output.pdf", pdfBytes)
'IronPDF pattern:
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("output.pdf")
' Or if you need bytes:
Dim pdfBytes() As Byte = renderer.RenderHtmlAsPdf(html).BinaryData整合模型變更
整合形狀從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
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();Imports System.Net.Http
' PDFBolt
Using http As New HttpClient()
http.DefaultRequestHeaders.Add("API-KEY", "YOUR-PDFBOLT-API-KEY")
' ... build JSON, POST to https://api.pdfbolt.com/v1/direct
End Using
' IronPDF
Dim renderer As New ChromePdfRenderer()Imports System.Net.Http
' PDFBolt
Using http As New HttpClient()
http.DefaultRequestHeaders.Add("API-KEY", "YOUR-PDFBOLT-API-KEY")
' ... build JSON, POST to https://api.pdfbolt.com/v1/direct
End Using
' IronPDF
Dim renderer As 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;// PDFBolt: JSON request fields
new { format = "A4", margin = new { top = "20mm" } }
// IronPDF: RenderingOptions properties
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.MarginTop = 20;' PDFBolt: JSON request fields
New With {Key .format = "A4", Key .margin = New With {Key .top = "20mm"}}
' IronPDF: RenderingOptions properties
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4
renderer.RenderingOptions.MarginTop = 20' PDFBolt: JSON request fields
New With {Key .format = "A4", Key .margin = New With {Key .top = "20mm"}}
' IronPDF: RenderingOptions properties
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4
renderer.RenderingOptions.MarginTop = 20API密鑰消除
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: 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: 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"
Dim renderer As New ChromePdfRenderer()' 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"
Dim renderer As 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 entirelynetnet可用的新能力
遷移到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");' PDF Merging (not available in PDFBolt)
Dim 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)
Dim text As String = pdf.ExtractAllText()
' PDF to Images (not available in PDFBolt)
pdf.RasterizeToImageFiles("page_*.png")' PDF Merging (not available in PDFBolt)
Dim 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)
Dim text As String = 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();// IronPDF
var renderer = new ChromePdfRenderer();' IronPDF
Dim renderer As New ChromePdfRenderer()' IronPDF
Dim renderer As New ChromePdfRenderer()問題2:ConvertHtmlString到哪去了?
問題: 遷移一個內部PDFBolt包裝器,暴露一個ConvertHtmlString(html)方法。
解決方案: 使用RenderHtmlAsPdf():
// IronPDF
var pdf = renderer.RenderHtmlAsPdf(html);// IronPDF
var pdf = renderer.RenderHtmlAsPdf(html);netnet問題3:ConvertUrl到哪去了?
問題: 遷移一個內部PDFBolt包裝器,暴露一個ConvertUrl(url)方法。
解決方案: 使用RenderUrlAsPdf():
// IronPDF
var pdf = renderer.RenderUrlAsPdf(url);// IronPDF
var pdf = renderer.RenderUrlAsPdf(url);netnet問題4:format JSON字段 → 枚舉
問題: 轉換PDFBolt的"format": "A4" JSON字段。
解決方案: 使用IronPdf.Rendering:
// IronPDF
using IronPdf.Rendering;
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;// IronPDF
using IronPdf.Rendering;
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;Imports IronPdf.Rendering
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4Imports 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>");' Warm up during application startup
Dim renderer As New ChromePdfRenderer()
renderer.RenderHtmlAsPdf("<html><body></body></html>")' Warm up during application startup
Dim renderer As New ChromePdfRenderer()
renderer.RenderHtmlAsPdf("<html><body></body></html>")遷移檢查表
遷移前
- 清點程式碼庫中的所有PDFBolt REST調用(
api.pdfbolt.com) - 文件當前的JSON請求字段(
headerTemplate,等。) - 確定需要移除的API密鑰管理程式碼
- 列出要刪除的429 / 配額重試處理
- 獲得IronPDF授權金鑰
套件變更
- 刪除手工製作的PDFBolt
HttpClient包裝器和DTOs(沒有需要解除安裝的NuGet包) - 安裝
IronPdfNuGet包: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輸出的測試
- 驗證頁面尺寸和邊距正確渲染
- 考慮新增新的功能(水印,安全性,合併)
Curtis Chau擁有Carleton大學的電腦科學學士學位,專精於前端開發,擁有Node.js、TypeScript、JavaScript和React的專業知識。Curtis熱衷於建立直觀且美觀的使用者介面,喜愛使用現代框架並建立結構良好、視覺吸引力的手冊。
相關文章


