如何在 C# 中從 pdforge 遷移到 IronPDF
為什麼要從pdforge移轉到 IronPDF
瞭解 pdforge
pdforge 是基於雲端的 PDF 生成 API,透過 API 呼叫與您的應用程式整合,提供直接生成 PDF 檔案的方式。 透過將 PDF 建立的任務卸給外部 API,開發人員可以簡化開發流程。 不過,pdforge 也有一些缺點,例如外部依賴性、有限的客製化選項,以及開發人員應該注意的持續訂閱成本。
雲 API 的依賴性問題
pdforge 在外部雲端伺服器上處理所有文件。 此架構對於生產應用程式造成重大的疑慮:
1.外部伺服器處理:您產生的每個 PDF 都需要將您的 HTML/資料傳送到pdforge的伺服器-您的文件將離開您的基礎架構。
2.隱私和合規風險:敏感資料透過網路傳輸到第三方伺服器。 使用pdforge時,開發人員需要顧及與資料傳送至外部 API 相關的安全問題。 如果 PDF 內容包含敏感資訊,這可能是一個重要的考慮因素。
3.持續訂閱成本:每月費用無限期累積,且不涉及資產所有權。pdforge的 SaaS 模式引入了持續的營運支出,這些支出會隨著時間的推移而累積。
4.網路依賴性:網路不可用時無法產生 PDF 檔案。
5.速率限制: API 使用上限可能會限制高流量應用程式。
6.網路延遲:往返時間會使每次 PDF 產生增加幾秒鐘。
pdforge與IronPDF的比較
| 特點 | pdforge | IronPDF |
|---|---|---|
| 部署類型 | 雲端 API | 本地圖書館 |
| 依賴性 | 需要網際網路和 API 認證 | 無外部依賴 |
| 客製化 | 對 PDF 生成的控制有限 | 完全控制自訂 |
| 成本結構 | 持續訂閱 | 一次性購買選項 |
| 安全性 | 透過網路傳送資料的潛在疑慮 | 讓資料處理完全在本機環境中進行 |
| 設定複雜度 | 因外部處理而更容易進行初始設定 | 需要較多的初始設定與組態 |
IronPDF 的與眾不同之處在於它提供了一個完全本地化的函式庫,讓開發人員可以完全控制 PDF 的製作過程。 這對於偏好內部處理檔案的應用程式,或外部 API 呼叫引入安全疑慮的應用程式尤其有利。IronPDF在本地處理所有內容,將這類風險降到最低。
對於計劃在 2025 年和 2026 年之前採用 .NET 10 和 C# 14 的團隊而言,IronPDF 提供了一個本地處理基礎,消除了對雲的依賴,同時增加了全面的 PDF 操作功能。
開始之前
先決條件
- .NET環境: .NET Framework 4.6.2+ 或.NET Core 3.1+ / .NET 5/6/7/8/9+
- NuGet存取權限:能夠安裝NuGet套件
- IronPDF許可證:請從IronPDF取得您的許可證密鑰。
NuGet 套件變更
# Removepdforgepackages
dotnet remove package pdforge
dotnet remove package PdfForge
# Install IronPDF
dotnet add package IronPdf
# Removepdforgepackages
dotnet remove package pdforge
dotnet remove package PdfForge
# 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";
' Add at application startup (Program.vb or Startup.vb)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
辨識pdforge使用方式
# Findpdforgeusage
grep -r "PdForge\|PdfClient\|HtmlToPdfRequest\|HtmlToPdfConverter" --include="*.cs" .
# Find placeholder patterns to migrate
grep -r "{totalPages}" --include="*.cs" .
# Findpdforgeusage
grep -r "PdForge\|PdfClient\|HtmlToPdfRequest\|HtmlToPdfConverter" --include="*.cs" .
# Find placeholder patterns to migrate
grep -r "{totalPages}" --include="*.cs" .
完整的 API 參考資料
命名空間變更
// Before: pdforge
using PdfForge;
using System.IO;
// After: IronPDF
using IronPdf;
using IronPdf.Rendering;
// Before: pdforge
using PdfForge;
using System.IO;
// After: IronPDF
using IronPdf;
using IronPdf.Rendering;
' Before: pdforge
Imports PdfForge
Imports System.IO
' After: IronPDF
Imports IronPdf
Imports IronPdf.Rendering
核心類對應
| pdforge | IronPDF |
|---|---|
HtmlToPdfConverter |
ChromePdfRenderer |
PdfClient |
ChromePdfRenderer |
PageSize.A4 |
PdfPaperSize.A4 |
PageOrientation.Landscape |
PdfPaperOrientation.Landscape |
回傳類型:byte[] |
PdfDocument |
方法對應
| pdforge | IronPDF |
|---|---|
converter.ConvertHtmlString(html) |
renderer.RenderHtmlAsPdf(html) |
converter.ConvertUrl(url) |
renderer.RenderUrlAsPdf(url) |
File.WriteAllBytes(path, bytes) |
pdf.SaveAs(path) |
回傳類型:byte[] |
pdf.BinaryData |
設定對應
| pdforge | IronPDF (RenderingOptions) |
|---|---|
converter.PageSize = PageSize.A4 |
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4 |
converter.Orientation = PageOrientation.Landscape |
renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape |
Footer = "Page {page} of {totalPages}" |
TextFooter = new TextHeaderFooter { CenterText = "Page {page} of {total-pages}" } |
pdforge中不提供的新功能
| IronPDF 特點 | 說明 |
|---|---|
PdfDocument.Merge() |
結合多個 PDF |
pdf.ExtractAllText() |
從 PDF 擷取文字 |
pdf.ApplyWatermark() |
加入水印 |
pdf.SecuritySettings |
密碼保護 |
pdf.Form |
表格填寫 |
pdf.SignWithDigitalSignature() |
數位簽名 |
程式碼遷移範例
範例 1:HTML 字串至 PDF 的轉換
之前 (pdforge):
// NuGet: Install-Package PdfForge
using PdfForge;
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 PdfForge
using PdfForge;
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);
}
}
Imports PdfForge
Imports System.IO
Class Program
Shared Sub Main()
Dim converter = New HtmlToPdfConverter()
Dim html = "<html><body><h1>Hello World</h1></body></html>"
Dim pdf = converter.ConvertHtmlString(html)
File.WriteAllBytes("output.pdf", pdf)
End Sub
End Class
After (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
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;
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
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
這裡的根本差異在於處理模型和回傳類型。pdforge使用 HtmlToPdfConverter 和 ConvertHtmlString(),傳回一個 byte[] 陣列-然後你必須使用 File.WriteAllBytes() 來儲存結果。
IronPDF 使用 ChromePdfRenderer 和 RenderHtmlAsPdf(),傳回一個 PdfDocument 物件。 可以直接使用 SaveAs() 儲存此對象,或者如果您需要原始位元組,可以存取 pdf.BinaryData。 PdfDocument 也允許在儲存之前進行操作(新增浮水印、與其他 PDF 合併、新增安全措施)。 請參閱 HTML to PDF 文件,以瞭解全面的範例。
範例 2:URL 到 PDF 的轉換
之前 (pdforge):
// NuGet: Install-Package PdfForge
using PdfForge;
using System.IO;
class Program
{
static void Main()
{
var converter = new HtmlToPdfConverter();
var pdf = converter.ConvertUrl("https://example.com");
File.WriteAllBytes("webpage.pdf", pdf);
}
}
// NuGet: Install-Package PdfForge
using PdfForge;
using System.IO;
class Program
{
static void Main()
{
var converter = new HtmlToPdfConverter();
var pdf = converter.ConvertUrl("https://example.com");
File.WriteAllBytes("webpage.pdf", pdf);
}
}
Imports PdfForge
Imports System.IO
Class Program
Shared Sub Main()
Dim converter = New HtmlToPdfConverter()
Dim pdf = converter.ConvertUrl("https://example.com")
File.WriteAllBytes("webpage.pdf", pdf)
End Sub
End Class
After (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderUrlAsPdf("https://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://example.com");
pdf.SaveAs("webpage.pdf");
}
}
Imports IronPdf
Class Program
Shared Sub Main()
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderUrlAsPdf("https://example.com")
pdf.SaveAs("webpage.pdf")
End Sub
End Class
pdforge 在 ConvertUrl() 類別上使用 HtmlToPdfConverter 類,傳回您使用 File.WriteAllBytes() 寫入的位元組。IronPDF使用 RenderUrlAsPdf() 在 ChromePdfRenderer 上,傳回一個 PdfDocument,並具有內建的 SaveAs() 方法。
IronPDF 的主要優勢在於使用 Chromium 引擎在本機擷取和渲染 URL,而不會將資料傳送至外部伺服器。IronPDF作為一個本地程式庫,可能會提供更好的效能,因為網路請求不涉及往返時間。 進一步了解 URL 至 PDF 轉換。
範例 3:使用自訂設定將 HTML 檔案轉換為 PDF
之前 (pdforge):
// NuGet: Install-Package PdfForge
using PdfForge;
using System.IO;
class Program
{
static void Main()
{
var converter = new HtmlToPdfConverter();
converter.PageSize = PageSize.A4;
converter.Orientation = PageOrientation.Landscape;
var htmlContent = File.ReadAllText("input.html");
var pdf = converter.ConvertHtmlString(htmlContent);
File.WriteAllBytes("output.pdf", pdf);
}
}
// NuGet: Install-Package PdfForge
using PdfForge;
using System.IO;
class Program
{
static void Main()
{
var converter = new HtmlToPdfConverter();
converter.PageSize = PageSize.A4;
converter.Orientation = PageOrientation.Landscape;
var htmlContent = File.ReadAllText("input.html");
var pdf = converter.ConvertHtmlString(htmlContent);
File.WriteAllBytes("output.pdf", pdf);
}
}
Imports PdfForge
Imports System.IO
Class Program
Shared Sub Main()
Dim converter As New HtmlToPdfConverter()
converter.PageSize = PageSize.A4
converter.Orientation = PageOrientation.Landscape
Dim htmlContent As String = File.ReadAllText("input.html")
Dim pdf As Byte() = converter.ConvertHtmlString(htmlContent)
File.WriteAllBytes("output.pdf", pdf)
End Sub
End Class
After (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape;
var htmlContent = System.IO.File.ReadAllText("input.html");
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.SaveAs("output.pdf");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape;
var htmlContent = System.IO.File.ReadAllText("input.html");
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.SaveAs("output.pdf");
}
}
Imports IronPdf
Imports IronPdf.Rendering
Class Program
Shared Sub Main()
Dim renderer = New ChromePdfRenderer()
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4
renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape
Dim htmlContent = System.IO.File.ReadAllText("input.html")
Dim pdf = renderer.RenderHtmlAsPdf(htmlContent)
pdf.SaveAs("output.pdf")
End Sub
End Class
此範例顯示配置模式的差異。pdforge直接在轉換器物件上設定屬性(converter.PageSize = PageSize.A4,converter.Orientation = PageOrientation.Landscape)。
IronPDF 使用 RenderingOptions 屬性,以及強型別枚舉:renderer.RenderingOptions.PaperSize = PdfPaperSize.A4 和 renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape。 這提供 IntelliSense 支援和編譯時的類型安全。 請注意,IronPDF 需要匯入 IronPdf.Rendering 命名空間來取得紙張尺寸和方向枚舉。 請參閱 tutorials 以取得更多設定範例。
關鍵遷移注意事項
返回類型變更
pdforge 返回 byte[];IronPDF返回 PdfDocument:
// pdforge: Returns byte[]
byte[] pdfBytes = converter.ConvertHtmlString(html);
File.WriteAllBytes("output.pdf", pdfBytes);
// IronPDF: Returns PdfDocument
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf"); // Direct save
byte[] bytes = pdf.BinaryData; // Get bytes if needed
// pdforge: Returns byte[]
byte[] pdfBytes = converter.ConvertHtmlString(html);
File.WriteAllBytes("output.pdf", pdfBytes);
// IronPDF: Returns PdfDocument
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf"); // Direct save
byte[] bytes = pdf.BinaryData; // Get bytes if needed
' pdforge: Returns byte()
Dim pdfBytes As Byte() = converter.ConvertHtmlString(html)
File.WriteAllBytes("output.pdf", pdfBytes)
' IronPDF: Returns PdfDocument
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("output.pdf") ' Direct save
Dim bytes As Byte() = pdf.BinaryData ' Get bytes if needed
轉換器類別變更
// pdforge: HtmlToPdfConverter
var converter = new HtmlToPdfConverter();
// IronPDF: ChromePdfRenderer
var renderer = new ChromePdfRenderer();
// pdforge: HtmlToPdfConverter
var converter = new HtmlToPdfConverter();
// IronPDF: ChromePdfRenderer
var renderer = new ChromePdfRenderer();
' pdforge: HtmlToPdfConverter
Dim converter As New HtmlToPdfConverter()
' IronPDF: ChromePdfRenderer
Dim renderer As New ChromePdfRenderer()
方法名稱變更
//pdforgemethods
converter.ConvertHtmlString(html)
converter.ConvertUrl(url)
//IronPDFmethods
renderer.RenderHtmlAsPdf(html)
renderer.RenderUrlAsPdf(url)
//pdforgemethods
converter.ConvertHtmlString(html)
converter.ConvertUrl(url)
//IronPDFmethods
renderer.RenderHtmlAsPdf(html)
renderer.RenderUrlAsPdf(url)
'pdforgemethods
converter.ConvertHtmlString(html)
converter.ConvertUrl(url)
'IronPDFmethods
renderer.RenderHtmlAsPdf(html)
renderer.RenderUrlAsPdf(url)
儲存方法變更
// pdforge: Manual file write
File.WriteAllBytes("output.pdf", pdfBytes);
// IronPDF: Built-in save method
pdf.SaveAs("output.pdf");
// pdforge: Manual file write
File.WriteAllBytes("output.pdf", pdfBytes);
// IronPDF: Built-in save method
pdf.SaveAs("output.pdf");
' pdforge: Manual file write
File.WriteAllBytes("output.pdf", pdfBytes)
' IronPDF: Built-in save method
pdf.SaveAs("output.pdf")
設定位置變更
pdforge 使用轉換器上的屬性;IronPDF使用 RenderingOptions:
// pdforge: Properties on converter
converter.PageSize = PageSize.A4;
converter.Orientation = PageOrientation.Landscape;
// IronPDF: Properties on RenderingOptions
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape;
// pdforge: Properties on converter
converter.PageSize = PageSize.A4;
converter.Orientation = PageOrientation.Landscape;
// IronPDF: Properties on RenderingOptions
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape;
' pdforge: Properties on converter
converter.PageSize = PageSize.A4
converter.Orientation = PageOrientation.Landscape
' IronPDF: Properties on RenderingOptions
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4
renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape
頁首/頁尾占位符語法
如果您在頁首或頁尾使用頁碼,佔位符的語法會有所不同:
//pdforgeplaceholders
"Page {page} of {totalPages}"
//IronPDFplaceholders
"Page {page} of {total-pages}" // Note: hyphen in total-pages
//pdforgeplaceholders
"Page {page} of {totalPages}"
//IronPDFplaceholders
"Page {page} of {total-pages}" // Note: hyphen in total-pages
'pdforgeplaceholders
"Page {page} of {totalPages}"
'IronPDFplaceholders
"Page {page} of {total-pages}" ' Note: hyphen in total-pages
遷移後的新功能
轉移到IronPDF之後,您將獲得pdforge無法提供的功能:
PDF 合併
var pdf1 = PdfDocument.FromFile("document1.pdf");
var pdf2 = PdfDocument.FromFile("document2.pdf");
var merged = PdfDocument.Merge(pdf1, pdf2);
merged.SaveAs("merged.pdf");
var pdf1 = PdfDocument.FromFile("document1.pdf");
var pdf2 = PdfDocument.FromFile("document2.pdf");
var merged = PdfDocument.Merge(pdf1, pdf2);
merged.SaveAs("merged.pdf");
Dim pdf1 = PdfDocument.FromFile("document1.pdf")
Dim pdf2 = PdfDocument.FromFile("document2.pdf")
Dim merged = PdfDocument.Merge(pdf1, pdf2)
merged.SaveAs("merged.pdf")
文字萃取
var pdf = PdfDocument.FromFile("document.pdf");
string allText = pdf.ExtractAllText();
var pdf = PdfDocument.FromFile("document.pdf");
string allText = pdf.ExtractAllText();
Dim pdf = PdfDocument.FromFile("document.pdf")
Dim allText As String = pdf.ExtractAllText()
水印。
pdf.ApplyWatermark("<h2 style='color:red;'>CONFIDENTIAL</h2>");
pdf.ApplyWatermark("<h2 style='color:red;'>CONFIDENTIAL</h2>");
pdf.ApplyWatermark("<h2 style='color:red;'>CONFIDENTIAL</h2>")
密碼保護
pdf.SecuritySettings.UserPassword = "userpassword";
pdf.SecuritySettings.OwnerPassword = "ownerpassword";
pdf.SecuritySettings.UserPassword = "userpassword";
pdf.SecuritySettings.OwnerPassword = "ownerpassword";
pdf.SecuritySettings.UserPassword = "userpassword"
pdf.SecuritySettings.OwnerPassword = "ownerpassword"
功能比較摘要
| 特點 | pdforge | IronPDF |
|---|---|---|
| HTML 至 PDF | ✓ | ✓ |
| URL 至 PDF | ✓ | ✓ |
| 頁面設定 | ✓ | ✓ |
| 離線能力 | ✗ | ✓ |
| 本地處理 | ✗ | ✓ |
| 合併 PDF | ✗ | ✓ |
| 分割 PDF | ✗ | ✓ |
| 擷取文字 | ✗ | ✓ |
| 水印 | ✗ | ✓ |
| 表格填寫 | ✗ | ✓ |
| 數位簽名 | ✗ | ✓ |
| 密碼保護 | ✗ | ✓ |
| 無費率限制 | ✗ | ✓ |
| 一次性授權 | ✗ | ✓ |
遷移清單
預遷移
- 清點程式碼庫中所有pdforgeAPI 呼叫
- 記錄目前使用的設定選項(頁面大小、方向)
- 決定要更新的頁首/頁尾佔位符(
{totalPages}→{total-pages}) - 規劃IronPDF許可證密鑰儲存(建議使用環境變數)
- 先使用IronPDF試用許可證進行測試
套件變更
- 刪除
pdforgeNuGet 套件 - 刪除
PdfForgeNuGet 套件 安裝IronPdfNuGet 套件:dotnet add package IronPdf
程式碼變更
- 更新所有命名空間導入(
using PdfForge;→using IronPdf;) - 新增
using IronPdf.Rendering;以設定紙張尺寸和方向枚舉 - 將
HtmlToPdfConverter替換為ChromePdfRenderer - 將
ConvertHtmlString()替換為RenderHtmlAsPdf() - 將
ConvertUrl()替換為RenderUrlAsPdf() - 將
File.WriteAllBytes()替換為pdf.SaveAs() - 將
PageSize屬性移到RenderingOptions.PaperSize - 將
Orientation屬性移到RenderingOptions.PaperOrientation - 更新枚舉名稱(
PageSize.A4→PdfPaperSize.A4) - 更新枚舉名稱(
PageOrientation.Landscape→PdfPaperOrientation.Landscape) - 更新頁首/頁尾中的佔位符語法
後遷移
- 測試 PDF 輸出品質是否符合預期
- 驗證離線操作是否正常
- 從設定中移除 API 憑證
- 根據需要新增功能(合併、浮水印、安全)。

