跳過到頁腳內容
遷移指南

如何使用 C# 從 PrinceXML 遷移到 IronPDF

從PrinceXML遷移到 IronPdf:完整的 C# 遷移指南。

從PrinceXML轉換到IronPDF可將您的 PDF 生成工作流程從外部命令行流程轉換為本地 .NET 函式庫。 本指南提供完整的逐步遷移路徑,可消除流程管理的開銷、簡化部署,並提供生成以外的廣泛 PDF 操作功能。

為什麼要從PrinceXML轉移到 IronPDF?

瞭解 PrinceXML

PrinceXML 是一款精密的工具,透過其對CSS 分頁媒體規格的專用支援,可將 HTML 內容轉換成完美印刷的 PDF 文件。 這項專長讓PrinceXML能夠高保真地呈現與預期印刷設計相符的文件 - 這對於需要詳細印刷樣式的產業(如出版或法律文件)來說,是非常有價值的特質。

然而,PrinceXML 並非 .NET 函式庫,而是以獨立的指令列工具運作,對於偏好純 .NET 解決方案的環境而言,這可能會使整合變得複雜。 其對獨立伺服器程序的依賴涉及額外的系統資源管理,並可能增加專案部署的複雜性。

外部流程問題

PrinceXML 以獨立的命令列可執行方式運作,對 .NET 應用程式造成重大的架構挑戰:

1.程序管理開銷:必須產生、監控及終止外部程序。

2.沒有原生的 .NET 整合:透過 stdin/stdout 或暫存檔案進行溝通。

3.部署複雜性:需要在每台伺服器上安裝 Prince。

4.每台伺服器授權:每個部署都需要單獨的授權(495 美元以上)。

5.錯誤處理難度:解析文字輸出以偵測錯誤。

6.No Async/Await:需要阻塞呼叫或複雜的 async wrappers。

7.路徑相依性:必須在 PATH 或絕對路徑上找到 Prince 可執行檔。

PrinceXMLvsIronPDF比較。

範疇PrinceXMLIronPDF
架構外部流程原生 .NET 函式庫
整合指令行直接 API
部署安裝在每台伺服器上單一 NuGet 套件
錯誤處理解析文字輸出.NET 例外
Async 支援手冊包裝原生 async/await
PDF 操作僅產生完整的操作(合併、分割、編輯)
授權每台伺服器 ($495+)每位開發人員
更新手動重新安裝NuGet 更新
除錯難度完整的除錯器支援
數位簽名
表格
Docker 支援複雜的簡單的
雲端功能難度簡易

IronPDF for .NET 以其 .NET 原生功能提供了另一種選擇,不僅僅是 HTML 到 PDF 的轉換,還包括進階的 PDF 操作任務,例如編輯、合併和數位簽署。 IronPdf 的 API 設計簡單易用,讓開發人員只需使用最少的模板程式碼即可執行轉換和操作。

對於計劃在 2025 年和 2026 年之前採用 .NET 10 和 C# 14 的團隊而言,IronPDF 的無縫部署不需要外部依賴或伺服器程序,因此可以減輕整合到 .NET Framework 的負擔。


開始之前

先決條件

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 套件變更

# Install IronPDF
dotnet add package IronPdf

# Remove Prince wrapper if using one
dotnet remove package PrinceXMLWrapper
# Install IronPDF
dotnet add package IronPdf

# Remove Prince wrapper if using one
dotnet remove package PrinceXMLWrapper
SHELL

授權組態

// Add at application startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
// Add at application startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

搜尋PrinceXML使用方式

# Find Prince process calls
grep -r "prince" --include="*.cs" .
grep -r "Process.Start" --include="*.cs" . | grep -i prince
grep -r "@page" --include="*.css" .
grep -r "prince-" --include="*.css" .
# Find Prince process calls
grep -r "prince" --include="*.cs" .
grep -r "Process.Start" --include="*.cs" . | grep -i prince
grep -r "@page" --include="*.css" .
grep -r "prince-" --include="*.css" .
SHELL

完整的 API 參考資料

命名空間變更

// Before: PrinceXML
using PrinceXMLWrapper;
using System.Diagnostics;
using System.IO;

// After: IronPDF
using IronPdf;
// Before: PrinceXML
using PrinceXMLWrapper;
using System.Diagnostics;
using System.IO;

// After: IronPDF
using IronPdf;
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

指令行至方法映射

王子指令IronPdf 同等級產品
prince input.html -o output.pdfrenderer.RenderHtmlFileAsPdf("input.html").SaveAs("output.pdf")
prince --style=custom.css input.html在 HTML 中包含 CSS 或使用 RenderingOptions
prince --javascriptrenderer.RenderingOptions.EnableJavaScript=true
prince --o-javascriptrenderer.RenderingOptions.EnableJavaScript = false
prince --page-size=Letterrenderer.RenderingOptions.PaperSize=PdfPaperSize.Letter
prince --page-margin=1inrenderer.RenderingOptions.MarginTop = 72 (72 點 = 1 英吋)
prince --encryptpdf.SecuritySettings.OwnerPassword="..."
<代碼>prince --user-password=pw</ 代碼pdf.SecuritySettings.UserPassword="pw"
prince --disallow-printpdf.SecuritySettings.AllowUserPrinting=PdfPrintSecurity.NoPrint
prince --disallow-copypdf.SecuritySettings.AllowUserCopyPasteContent=false
prince --baseurl=http://...renderer.RenderingOptions.BaseUrl = new Uri("http://...")
prince --media=print</編碼renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print
prince --media=screenrenderer.RenderingOptions.CssMediaType=PdfCssMediaType.Screen

CSS @page 至 RenderingOptions 對應。

CSS @page 屬性IronPdf 同等級產品
大小:A4PaperSize = PdfPaperSize.A4 紙張尺寸
大小:字母</編碼PaperSize=PdfPaperSize.Letter
大小:A4 橫排PaperSize=PdfPaperSize.A4+PaperOrientation=Landscape
邊距:2 公分MarginTop/Bottom/Left/Right = 56
margin-top:1inMarginTop = 72
@top-center { content:"..." }HtmlHeader 與居中的 div
@bottom-right { content: counter(page) }HtmlFooter{page} 占位符

頁面大小轉換

大小要點毫米
信件612 x 792216 x 279
A4595 x 842210 x 297
法律條款612 x 1008216 x 356
1 英吋7225.4
1 cm28.3510

程式碼遷移範例

範例 1:HTML 檔案轉換為 PDF 檔案

之前 (PrinceXML):

// NuGet: Install-Package PrinceXMLWrapper
using PrinceXMLWrapper;
using System;

class Program
{
    static void Main()
    {
        Prince prince = new Prince("C:\\Program Files\\Prince\\engine\\bin\\prince.exe");
        prince.Convert("input.html", "output.pdf");
        Console.WriteLine("PDF created successfully");
    }
}
// NuGet: Install-Package PrinceXMLWrapper
using PrinceXMLWrapper;
using System;

class Program
{
    static void Main()
    {
        Prince prince = new Prince("C:\\Program Files\\Prince\\engine\\bin\\prince.exe");
        prince.Convert("input.html", "output.pdf");
        Console.WriteLine("PDF created successfully");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

After (IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlFileAsPdf("input.html");
        pdf.SaveAs("output.pdf");
        Console.WriteLine("PDF created successfully");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlFileAsPdf("input.html");
        pdf.SaveAs("output.pdf");
        Console.WriteLine("PDF created successfully");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

本範例展示了基本的架構差異。PrinceXML需要使用可執行檔的完整路徑實體化 Prince 物件 ("C:\\Program Files\Prince\engine\\bin\prince.exe") ,然後使用輸入和輸出路徑呼叫 Convert()

IronPDF 完全消除了路徑依賴性:創建一個 ChromePdfRenderer, 使用 HTML 檔案路徑呼叫 RenderHtmlFileAsPdf(), 以及 SaveAs() 來寫入結果。 無可執行路徑、無流程管理、無路徑依賴。 請參閱 HTML to PDF 文件,以瞭解全面的範例。

範例 2:URL 至 PDF 轉換選項

之前 (PrinceXML):

// NuGet: Install-Package PrinceXMLWrapper
using PrinceXMLWrapper;
using System;

class Program
{
    static void Main()
    {
        Prince prince = new Prince("C:\\Program Files\\Prince\\engine\\bin\\prince.exe");
        prince.SetJavaScript(true);
        prince.SetEncrypt(true);
        prince.SetPDFTitle("Website Export");
        prince.Convert("https://example.com", "webpage.pdf");
        Console.WriteLine("URL converted to PDF");
    }
}
// NuGet: Install-Package PrinceXMLWrapper
using PrinceXMLWrapper;
using System;

class Program
{
    static void Main()
    {
        Prince prince = new Prince("C:\\Program Files\\Prince\\engine\\bin\\prince.exe");
        prince.SetJavaScript(true);
        prince.SetEncrypt(true);
        prince.SetPDFTitle("Website Export");
        prince.Convert("https://example.com", "webpage.pdf");
        Console.WriteLine("URL converted to PDF");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

After (IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        renderer.RenderingOptions.EnableJavaScript = true;
        renderer.RenderingOptions.PdfTitle = "Website Export";

        var pdf = renderer.RenderUrlAsPdf("https://example.com");
        pdf.Encrypt("password");
        pdf.SaveAs("webpage.pdf");
        Console.WriteLine("URL converted to PDF");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        renderer.RenderingOptions.EnableJavaScript = true;
        renderer.RenderingOptions.PdfTitle = "Website Export";

        var pdf = renderer.RenderUrlAsPdf("https://example.com");
        pdf.Encrypt("password");
        pdf.SaveAs("webpage.pdf");
        Console.WriteLine("URL converted to PDF");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

本範例展示了PrinceXML選項如何映射到IronPDF屬性。PrinceXML在轉換前使用 setter 方法 (SetJavaScript()SetEncrypt()SetPDFTitle())。IronPDF使用 RenderingOptions 屬性進行渲染前的設定,並使用 PdfDocument 物件上的 Encrypt() 等渲染後的方法。

關鍵對應:

  • prince.SetJavaScript(true)renderer.RenderingOptions.EnableJavaScript = true
  • prince.SetPDFTitle("...")renderer.RenderingOptions.PdfTitle = "..."
  • prince.SetEncrypt(true)pdf.Encrypt("password") (IronPDF 需要密碼)

請參閱我們的 教學,瞭解更多資訊。

範例 3:HTML 字串至 PDF 的轉換

之前 (PrinceXML):

// NuGet: Install-Package PrinceXMLWrapper
using PrinceXMLWrapper;
using System;
using System.IO;

class Program
{
    static void Main()
    {
        string html = "<html><head><style>body { font-family: Arial; color: blue; }</style></head><body><h1>Hello World</h1></body></html>";
        File.WriteAllText("temp.html", html);

        Prince prince = new Prince("C:\\Program Files\\Prince\\engine\\bin\\prince.exe");
        prince.Convert("temp.html", "styled-output.pdf");
        Console.WriteLine("Styled PDF created");
    }
}
// NuGet: Install-Package PrinceXMLWrapper
using PrinceXMLWrapper;
using System;
using System.IO;

class Program
{
    static void Main()
    {
        string html = "<html><head><style>body { font-family: Arial; color: blue; }</style></head><body><h1>Hello World</h1></body></html>";
        File.WriteAllText("temp.html", html);

        Prince prince = new Prince("C:\\Program Files\\Prince\\engine\\bin\\prince.exe");
        prince.Convert("temp.html", "styled-output.pdf");
        Console.WriteLine("Styled PDF created");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

After (IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Program
{
    static void Main()
    {
        string html = "<html><head><style>body { font-family: Arial; color: blue; }</style></head><body><h1>Hello World</h1></body></html>";

        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf(html);
        pdf.SaveAs("styled-output.pdf");
        Console.WriteLine("Styled PDF created");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Program
{
    static void Main()
    {
        string html = "<html><head><style>body { font-family: Arial; color: blue; }</style></head><body><h1>Hello World</h1></body></html>";

        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf(html);
        pdf.SaveAs("styled-output.pdf");
        Console.WriteLine("Styled PDF created");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

這個例子突顯了一個重要的差異:PrinceXML 需要輸入檔案,因此您必須在轉換前建立臨時檔案 (File.WriteAllText("temp.html", html))。IronPDF的 RenderHtmlAsPdf() 可直接接受 HTML 字串 - 無暫存檔案、無清理程式碼、無磁碟 I/O 開銷。


遷移 CSS 分頁媒體

雖然PrinceXML的CSS 分頁媒體支援功能強大,但卻會造成供應商鎖定 Prince 專屬的 CSS,無法在其他地方使用:

PrinceXML CSS:

@page {
    size: A4;
    margin: 2cm;
    @top-center {
        content: "Document Title";
    }
    @bottom-right {
        content: counter(page);
    }
}

/* Prince-specific extensions */
prince-pdf-page-label: "Chapter " counter(chapter);
prince-pdf-destination: attr(id);

IronPDF C#(等同):

renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.MarginTop = 56;    // ~2cm
renderer.RenderingOptions.MarginBottom = 56;
renderer.RenderingOptions.MarginLeft = 56;
renderer.RenderingOptions.MarginRight = 56;

renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
{
    HtmlFragment = "<div style='text-align:center;'>Document Title</div>",
    MaxHeight = 40
};

renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
    HtmlFragment = "<div style='text-align:right;'>Page {page} of {total-pages}</div>",
    MaxHeight = 25
};
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.MarginTop = 56;    // ~2cm
renderer.RenderingOptions.MarginBottom = 56;
renderer.RenderingOptions.MarginLeft = 56;
renderer.RenderingOptions.MarginRight = 56;

renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
{
    HtmlFragment = "<div style='text-align:center;'>Document Title</div>",
    MaxHeight = 40
};

renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
    HtmlFragment = "<div style='text-align:right;'>Page {page} of {total-pages}</div>",
    MaxHeight = 25
};
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

常見的 CSS 移轉問題

問題 1:CSS @page 無法運作

IronPDF 使用 Chromium,對 @page 的支援有限。 將 CSS 規則轉換為 RenderingOptions。

問題 2:頁邊框遺失

CSS 邊界方塊 (@top-center, @bottom-right) 是 Prince 專用的。 請使用 HtmlHeader/HtmlFooter 來取代。

問題 3:string-set/content 無法運作

string-set CSS 屬性是 Prince 特有的。 使用 {html-title} 標籤中的 <title> 占位符:

<title>Chapter 1: Introduction</title>
<title>Chapter 1: Introduction</title>
HTML
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
{
    HtmlFragment = "<div>{html-title}</div>"
};
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
{
    HtmlFragment = "<div>{html-title}</div>"
};
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

問題 4:計數器(頁面)不正確

使用IronPDF的 {total-pages} 占位符代替 CSS 計數器。


效能比較

手術PrinceXMLIronPDF筆記
簡單的 HTML~400ms~300msIronPdf 正在處理中
複雜的 CSS~600ms~400ms無製程開銷
JavaScript 頁面限額~500ms完整的 JS 支援
大型文件~1500ms~1000ms更好的記憶力
並發 (10)~4000ms~1500ms線程庫
啟動費用~200ms~50ms無製程產生

遷移後的新功能

轉移到IronPDF之後,您將獲得PrinceXML無法提供的功能:

PDF 合併

var pdf1 = PdfDocument.FromFile("chapter1.pdf");
var pdf2 = PdfDocument.FromFile("chapter2.pdf");
var merged = PdfDocument.Merge(pdf1, pdf2);
merged.SaveAs("complete_book.pdf");
var pdf1 = PdfDocument.FromFile("chapter1.pdf");
var pdf2 = PdfDocument.FromFile("chapter2.pdf");
var merged = PdfDocument.Merge(pdf1, pdf2);
merged.SaveAs("complete_book.pdf");
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

水印。

pdf.ApplyWatermark("<h1 style='color:red; opacity:0.3;'>DRAFT</h1>");
pdf.ApplyWatermark("<h1 style='color:red; opacity:0.3;'>DRAFT</h1>");
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

數位簽名

var signature = new PdfSignature("certificate.pfx", "password");
pdf.Sign(signature);
var signature = new PdfSignature("certificate.pfx", "password");
pdf.Sign(signature);
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

表格填寫

var pdf = PdfDocument.FromFile("form.pdf");
pdf.Form.GetFieldByName("Name").Value = "John Doe";
pdf.SaveAs("filled_form.pdf");
var pdf = PdfDocument.FromFile("form.pdf");
pdf.Form.GetFieldByName("Name").Value = "John Doe";
pdf.SaveAs("filled_form.pdf");
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

功能比較摘要

特點PrinceXMLIronPDF
原生 .NET
外部流程要求
同步支援手冊包裝原生 async/await
CSS 分頁媒體全面支援透過 RenderingOptions
CSS 網格
Flexbox
JavaScript限額完整的 ES2024
世代
合併
分割
編輯
水印僅限 CSSHTML/CSS + API
數位簽名
PDF/A
加密
格式
NuGet 套件
伺服器安裝要求

遷移清單

預遷移

  • [ ] 識別所有 Prince 指令行調用
  • [ ] 使用的文件 CSS @page 規則
  • [ ] 列出 Prince 特有的 CSS 屬性 (prince-*, string-set)
  • [ ] 注意任何王子JavaScript功能
  • [ ] 識別所使用的 PDF 功能(加密、元資料)
  • [ ] 從 ironpdf.com 獲得IronPDF授權金鑰

程式碼變更

  • [ ] 移除 PrinceXMLWrapper NuGet 套件
  • [ ] 安裝 IronPdf NuGet 套件
  • [ ] 更新命名空間匯入
  • [ ] 以 ChromePdfRenderer 取代 Prince 實體化
  • [ ] 將 prince.Convert() 替換為 RenderHtmlFileAsPdf()RenderHtmlAsPdf()
  • [ ] 將 setter 方法轉換為 RenderingOptions 屬性
  • [ ] 將 @page CSS 遷移到 RenderingOptions 中。
  • [ ] 以 HtmlHeader/HtmlFooter 取代頁邊方塊
  • [ ] 將 CSS 計數器轉換為 {page}/{total-pages} 占位符
  • [ ] 移除 HTML 字串的暫存檔案處理
  • [ ] 在應用程式啟動時加入授權初始化

後遷移

  • [ ] 測試 HTML 檔案轉換
  • [ ] 測試 HTML 字串轉換
  • [ ] 測試 URL 轉換
  • [驗證頁面大小是否相符
  • [ ] 確認頁邊匹配
  • [ ] 測試頁首和頁尾
  • [ ] 核實頁碼
  • [ ] 測試加密/安全性
  • [ ] 從伺服器移除 Prince 安裝
  • [ ] 更新部署腳本

結論

對於在 .NET 生態系統中工作的開發人員,IronPDF 提供了強大且全面的解決方案。 其廣泛的操作功能和簡化的整合使其在各種使用情況下都非常實用。 另一方面,如果印刷精確度是最重要的,特別是利用 CSS 分頁媒體功能,PrinceXML 仍然是有效的選擇。

本次轉換的主要變更如下 1.架構:外部指令列程序 → 原生 .NET 函式庫 2.實作new Prince("path/to/exe")new ChromePdfRenderer() 3.檔案轉換prince.Convert(input, output)renderer.RenderHtmlFileAsPdf(input).SaveAs(output) 4.HTML 字串: 需要臨時檔案 → 直接 RenderHtmlAsPdf(html) 5.選項:設定方法 (SetJavaScript()) → 屬性 (RenderingOptions.EnableJavaScript) 6.CSS @page: 原生支援 → RenderingOptions 屬性 7.頁首/頁腳:CSS 邊框 → HtmlHeader/HtmlFooter 物件 8.頁碼:CSS 計數器 → {page}{total-pages} 占位符 9.新功能:PDF 合併、分割、編輯、水印、數位簽署、表格填寫

探索完整的 IronPdf文件教學API參考,加速您的PrinceXML遷移。

Curtis Chau
技術作家

Curtis Chau 擁有卡爾頓大學計算機科學學士學位,專注於前端開發,擅長於 Node.js、TypeScript、JavaScript 和 React。Curtis 熱衷於創建直觀且美觀的用戶界面,喜歡使用現代框架並打造結構良好、視覺吸引人的手冊。

除了開發之外,Curtis 對物聯網 (IoT) 有著濃厚的興趣,探索將硬體和軟體結合的創新方式。在閒暇時間,他喜愛遊戲並構建 Discord 機器人,結合科技與創意的樂趣。