IRONSOFTWAREHOME
影片

如何將 HTML 字串渲染為 C# PDF

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

從PrinceXML遷移到IronPDF將您的PDF生成工作流從外部命令行過程轉變為原生.NET程式庫。 本指南提供完整的逐步遷移路徑,消除了過程管理的負擔,簡化了部署,並提供了超越生成的廣泛PDF操作能力。

為什麼要從PrinceXML遷移到IronPDF

了解PrinceXML

PrinceXML是一個先進的工具,專為將HTML內容轉換為完美印刷的PDF文件而設計,通過其對CSS頁面媒體規範的專門支持。 這種專業化使PrinceXML能夠與預期的印刷設計高保真度地渲染文件,這對於需要詳細印刷樣式的行業來說是一個有價值的特性,比如出版或法律文件。

然而,PrinceXML不是一個.NET程式庫,它作為一個單獨的命令行工具運行,這可能會對偏好純.NET解決方案的環境造成整合上的困難。 它依賴於一個單獨的伺服器過程,涉及額外的系統資源管理,並可能增加專案部署的複雜性。

外部過程問題

PrinceXML作為一個單獨的命令行可執行文件運行,對.NET應用程式構架構成了顯著的挑戰:

  1. 過程管理負擔: 必須生成、監控和終止外部過程。

  2. 沒有原生.NET整合: 通過stdin/stdout或臨時文件進行通信。

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

  4. 每伺服器授權: 每次部署需要單獨的授權。

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

  6. 沒有異步/等待: 需要阻塞呼叫或複雜的異步包裝器。

  7. 路徑依賴性: 必須在PATH或絕對路徑中找到Prince可執行文件。

PrinceXML與IronPDF比較

方面PrinceXMLIronPDF
架構外部過程原生.NET程式庫
整合命令行直接API
部署安裝在每台伺服器上單個NuGet套件
錯誤處理解析文字輸出.NET異常
異步支援手動包裝器原生async/await
PDF 操作僅限生成全面操作(合併、拆分、編輯)
授權桌面 $495 / 伺服器 $3,800; free non-commercial use with logo watermark每位開發者
更新手動重新安裝NuGet更新
除錯困難完整除錯器支持
數位簽名
表單
Docker支持複雜簡單
雲功能困難容易

IronPDF提供了一種替代方案,它具備.NET原生功能,不僅僅是HTML到PDF轉換,而且包括如編輯、合併和數位簽名等進階PDF操作任務。 IronPDF的API設計簡單易用,讓開發者能夠以最少的樣板程式碼進行轉換和操作。

對於採用現代.NET的團隊,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包變更

# 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";

尋找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" .
SHELL

完整API參考

名稱空間變更

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

// After: IronPDF
using IronPdf;

命令行到方法映射

Prince CommandIronPDF等價
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 --no-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=pwpdf.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=printrenderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print
prince --media=screenrenderer.RenderingOptions.CssMediaType = PdfCssMediaType.Screen

CSS @page到RenderingOptions映射

CSS @page屬性IronPDF等價
size: A4PaperSize = PdfPaperSize.A4
size: LetterPaperSize = PdfPaperSize.Letter
size: A4 landscapePaperSize = PdfPaperSize.A4 + PaperOrientation = Landscape
margin: 2cmMarginTop/Bottom/Left/Right = 56
margin-top: 1inMarginTop = 72
@top-center { content: "..." }使用居中的div進行 HtmlHeader
@bottom-right { content: counter(page) }使用HtmlFooter

頁面尺寸轉換

尺寸毫米
信紙612 x 792216 x 279
A4595 x 842210 x 297
法律612 x 1008216 x 356
1英寸7225.4
1厘米28.3510

程式碼遷移範例

範例1: HTML文件到PDF轉換

之前(PrinceXML):

// NuGet: Install-Package PrinceXMLWrapper
using PrinceXML.Wrapper;
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");
    }
}

之後(IronPDF):

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

class Program
{
    static void Main()
    {
        IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlFileAsPdf("input.html");
        pdf.SaveAs("output.pdf");
        Console.WriteLine("PDF created successfully");
    }
}

此範例說明基本的架構差異。 PrinceXML需要實例化一個Convert()

IronPDF完全消除了路徑依賴性:建立一個SaveAs()寫入結果。 沒有可執行文件路徑,沒有過程管理,沒有路徑依賴性。 查看更多HTML到PDF文件以獲得完整的範例。

範例2: 有選項的URL轉換為PDF

之前(PrinceXML):

// NuGet: Install-Package PrinceXMLWrapper
using PrinceXML.Wrapper;
using System;

class Program
{
    static void Main()
    {
        Prince prince = new Prince("C:\\Program Files\\Prince\\engine\\bin\\prince.exe");
        prince.JavaScript = true;
        prince.Encrypt = true;
        prince.PdfTitle = "Website Export";
        prince.Convert("https://example.com", "webpage.pdf");
        Console.WriteLine("URL converted to PDF");
    }
}

之後(IronPDF):

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

class Program
{
    static void Main()
    {
        IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
        var renderer = new ChromePdfRenderer();
        renderer.RenderingOptions.EnableJavaScript = true;
        renderer.RenderingOptions.Title = "Website Export";

        var pdf = renderer.RenderUrlAsPdf("https://example.com");
        pdf.SecuritySettings.OwnerPassword = "owner-password";
        pdf.SecuritySettings.UserPassword = "user-password";
        pdf.SaveAs("webpage.pdf");
        Console.WriteLine("URL converted to PDF");
    }
}

此範例顯示了PrinceXML選項如何映射到IronPDF屬性。 PrinceXML在轉換之前,將配置暴露為PdfTitle)上的屬性。 IronPDF使用PdfDocument上後應用加密。

關鍵映射:

  • prince.JavaScript = truerenderer.RenderingOptions.EnableJavaScript = true
  • prince.PdfTitle = "..."renderer.RenderingOptions.Title = "..."
  • prince.Encrypt = truepdf.SecuritySettings.OwnerPassword = "..." / pdf.SecuritySettings.UserPassword = "..."

在我們的教程中了解更多。

範例3: HTML字串到PDF轉換

之前(PrinceXML):

// NuGet: Install-Package PrinceXMLWrapper
using PrinceXML.Wrapper;
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>";

        Prince prince = new Prince("C:\\Program Files\\Prince\\engine\\bin\\prince.exe");
        // ConvertString accepts a raw HTML/XML string directly
        prince.ConvertString(html, "styled-output.pdf");
        Console.WriteLine("Styled PDF created");
    }
}

之後(IronPDF):

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

class Program
{
    static void Main()
    {
        IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
        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");
    }
}

兩個程式庫都可以直接接受HTML字串:PrinceXML通過RenderHtmlAsPdf()。 架構上的差異依然存在——PrinceXML的prince二進製程式傳遞輸入,而IronPDF則在內部進行渲染,無需外部可執行文件。


遷移CSS頁面媒體

雖然PrinceXML的CSS頁面媒體支持強大,但它使用Prince專用的CSS,導致供應商鎖定,這些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);
Text

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

常見CSS遷移問題

問題1: CSS @page無法正常工作

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

問題2: 缺少頁面邊距框

CSS邊距框(@bottom-right)是Prince專用的。 使用HtmlFooter代替。

問題3: string-set/content無法正常工作

string-set CSS屬性是Prince專用的。 從{html-title}佔位符:

<title>Chapter 1: Introduction</title>
HTML
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
{
    HtmlFragment = "<div>{html-title}</div>"
};

問題4: counter(pages)不正確

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


性能比較

操作PrinceXMLIronPDF
簡單的HTML~400毫秒~300毫秒
複雜CSS~600毫秒~400毫秒
JavaScript頁面有限~500毫秒
大型文件~1500毫秒~1000毫秒
併發(10)~4000毫秒~1500毫秒
啟動開銷~200毫秒~50毫秒

遷移後的新能力

遷移到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");

水印

pdf.ApplyWatermark("<h1 style='color:red; opacity:0.3;'>DRAFT</h1>");

數位簽名

var signature = new PdfSignature("certificate.pfx", "password");
pdf.Sign(signature);

表單填寫

var pdf = PdfDocument.FromFile("form.pdf");
pdf.Form.GetFieldByName("Name").Value = "John Doe";
pdf.SaveAs("filled_form.pdf");

功能比較總結

功能PrinceXMLIronPDF
原生.NET
外部過程必需的
異步支援手動包裝原生async/await
CSS Paged Media支援通過RenderingOptions
CSS網格
Flexbox
JavaScript有限完整的ES2024
生成
合併
分割
編輯
浮水印僅CSSHTML/CSS + API
數位簽名
PDF/A
加密
表單
NuGet 套件
伺服器安裝必需的

遷移檢查表

遷移前

  • 確認所有Prince命令行調用
  • 記錄使用的CSS @page規則
  • 列出Prince專用CSS屬性(string-set
  • 記錄任何Prince JavaScript函式
  • 確認使用的PDF功能(加密,元資料)
  • 獲取IronPDF授權金鑰來自ironpdf.com

程式碼變更

  • 移除PrinceXMLWrapper NuGet套件
  • 安裝IronPdf NuGet套件
  • 更新命名空間導入
  • Prince實例化
  • prince.Convert()
  • 將設置方法轉換為RenderingOptions屬性
  • 遷移@page CSS到RenderingOptions
  • HtmlFooter替換邊距框
  • 將CSS計數器轉換為{total-pages}佔位符
  • 刪除HTML字串的臨時文件處理
  • 在應用程式啟動時新增授權初始化

遷移後

  • 測試HTML文件轉換
  • 測試HTML字串轉換
  • 測試URL轉換
  • 驗證頁面尺寸匹配
  • 驗證邊距匹配
  • 測試標頭和頁尾
  • 驗證頁碼
  • 測試加密/安全性
  • 從伺服器移除Prince安裝
  • 更新部署腳本

請注意: PrinceXML是其各自所有者的註冊商標。 本網站與YesLogic Pty無關,未獲其認可或贊助。 Ltd.. 所有產品名稱、標誌和品牌均為其各自所有者的財產。 比較僅供參考,反映撰寫時公開可用的資訊。
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天試用金鑰
無需信用卡或帳戶建立