IRONSOFTWAREHOME
视频

如何在 C# 中将 HTML 字符串渲染为 PDF

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

从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。

  1. **每台服务器的许可:**每个部署需要单独的许可证。

5.**错误处理难度:**解析文本输出以进行错误检测。

6.**无需 Async/await:**无需阻塞调用或复杂的异步包装器。

7.**路径依赖:**必须在 PATH 或绝对路径中找到 Prince 可执行文件。

###PrinceXML与IronPDF对比

方面PrinceXMLIronPDF
架构外部流程本地 .NET 库
集成命令行直接应用程序接口
部署在每台服务器上安装单个 NuGet 软件包
错误处理解析文本输出.NET 例外情况
支持同步手册包装本地 async/await
PDF 操作仅生成全面操作(合并、拆分、编辑)
许可桌面 $495 / 服务器 $3,800; free non-commercial use with logo watermark每位开发人员
更新手动重新安装NuGet 更新
调试难点完全支持调试器
数字签名
表格
Docker 支持复杂简单的
云函数难点简易

IronPDF for .NET 凭借其 .NET 原生功能提供了另一种选择,它不仅仅是 HTML 到 PDF 的转换,还包括高级 PDF 操作任务,如编辑、合并和数字签名。IronPDF的 API 设计简单易用,开发人员只需使用最少的模板代码即可执行转换和操作。

对于采用现代 .NET 的团队,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
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;

命令行到方法映射

王子命令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 --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:A4landscapePaperSize = PdfPaperSize.A4 + PaperOrientation = Landscape
margin: 2cmMarginTop/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 厘米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");
    }
}

After (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");
    }
}

After (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通过JavaScript, Encrypt, 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");
    }
}

After (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 @页面不起作用

IronPDF 使用 Chromium,对 @page 的支持有限。 将 CSS 规则转换为 RenderingOptions。

问题 2:页面边框缺失

CSS 边距框 (@top-center, @bottom-right) 是Prince特有的。 改用HtmlFooter

问题 3:字符串集/内容无法正常工作

string-set CSS属性是Prince特有的。 使用<title>标签:

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

问题 4:计数器(页数)不正确

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


性能比较

手术PrinceXMLIronPDF
简单的 HTML~400ms~300ms
复杂 CSS~600ms~400ms
JavaScript 页面有限的~500ms
大型文档~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");

水印

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 分页媒体支持通过 RenderingOptions
CSS 网格
Flexbox
JavaScript有限的完整的 ES2024
生成
合并
拆分
编辑
水印仅限 CSSHTML/CSS + API
数字签名
PDF/A
加密
格式
NuGet 软件包
服务器安装要求

迁移清单

迁移前

  • 识别所有 Prince 命令行调用
  • 使用的文档 CSS @page 规则
  • 列出Prince特有的CSS属性 (prince-*, string-set)
  • 注意任何 PrinceJavaScript函数
  • 识别所使用的PDF功能(加密、元数据)
  • ironpdf.com获取IronPDF许可证密钥

代码更改

  • 移除PrinceXMLWrapper NuGet包
  • 安装IronPdf NuGet包
  • 更新命名空间导入
  • Prince实例化
  • prince.Convert()
  • 将设置器方法转换为RenderingOptions属性
  • 将@page CSS迁移到RenderingOptions
  • 将边距框替换为HtmlFooter
  • 将CSS计数器转换为{total-pages}占位符
  • 移除 HTML 字符串的临时文件处理。
  • 在应用程序启动时添加许可证初始化

后迁移

  • 测试 HTML 文件转换
  • 测试 HTML 字符串转换
  • 测试 URL 转换
  • 核实页面大小是否匹配
  • 核对边距是否匹配
  • 测试页眉和页脚
  • 核对页码
  • 测试加密/安全性
  • 从服务器上移除 Prince 安装
  • 更新部署脚本

(PríncipeXML是其各自所有者的注册商标。) 该网站未与YesLogic Pty. 有关联,未被认可或赞助。 Ltd. 所有产品名称、徽标和品牌均为各自所有者的财产。 比较仅供参考,反映撰写时公开可用的信息。)}]

Curtis Chau
技术作家

Curtis Chau 拥有卡尔顿大学的计算机科学学士学位,专注于前端开发,精通 Node.js、TypeScript、JavaScript 和 React。他热衷于打造直观且美观的用户界面,喜欢使用现代框架并创建结构良好、视觉吸引力强的手册。

...
阅读更多

相关文章

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 天试用密钥
无需信用卡或创建账户