跳至页脚内容
迁移指南

如何用 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.无异步/等待:需要阻塞调用或复杂的异步封装。

7.路径依赖:必须在 PATH 或绝对路径上定位 Prince 可执行文件。

PrinceXML与IronPDF对比

方面PrinceXMLIronPDF
架构外部流程本地 .NET 库
集成命令行直接应用程序接口
部署在每台服务器上安装单个 NuGet 软件包
错误处理解析文本输出.NET 例外情况
支持同步手册包装本地 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.pdf</ 代码<代码>renderer.RenderHtmlFileAsPdf("input.html").SaveAs("output.pdf")</代码
prince --style=custom.css input.html</ 代码在 HTML 中包含 CSS 或使用 RenderingOptions
<代码>PRINCE --javascript</ 代码renderer.RenderingOptions.EnableJavaScript=true
<代码>PRINCE --NO-Javascript</ 代码<代码>renderer.RenderingOptions.EnableJavaScript=false</代码
<代码>prince --page-size=Letter</ 代码<代码>renderer.RenderingOptions.PaperSize = PdfPaperSize.Letter</ 代码
<代码>prince --page-margin=1in</ 代码renderer.RenderingOptions.MarginTop = 72 (72 点 = 1 英寸)
<代码>PRINCE --encrypt</ 代码<代码>pdf.SecuritySettings.OwnerPassword = "..."</ 代码
<代码>prince --user-password=pw</ 代码<代码>pdf.SecuritySettings.UserPassword = "pw"</ 代码
<代码>prince --disallow-print</ 代码<代码>pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.NoPrint</ 代码
<代码>prince --disallow-copy</ 代码<代码>pdf.SecuritySettings.AllowUserCopyPasteContent = false</代码
<代码>prince --baseurl=http://...</ 代码renderer.RenderingOptions.BaseUrl = new Uri("http://...")
<代码>prince --media=print</ 代码renderer.RenderingOptions.CssMediaType=PdfCssMediaType.Print
<代码>prince --media=screen</ 代码renderer.RenderingOptions.CssMediaType=PdfCssMediaType.Screen

CSS @page 到 RenderingOptions 映射

CSS @page 属性IronPdf 同等产品
<代码>大小:A4<代码>PaperSize = PdfPaperSize.A4</ 代码
<代码>大小:字母</代码<代码>PaperSize = PdfPaperSize.Letter</ 代码
<代码>大小:A4 横向PaperSize = PdfPaperSize.A4 + PaperOrientation = Landscape (纸张大小)
<代码>边距:2 厘米</代码<代码>边距上/下/左/右 = 56</ 代码
<代码>margin-top: 1in</ 代码<代码>边距顶 = 72</ 代码
@top-center { content:"..." }HtmlHeader 带居中 div
@bottom-right { content: counter(page) }带有 {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 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要求使用可执行文件的完整路径("C:\\Program Files\Prince\engine\\bin\prince.exe" )实例化 Prince 对象,然后使用输入和输出路径调用 Convert()

IronPDF 完全消除了路径依赖:创建一个 ChromePdfRenderer, 使用 HTML 文件路径调用 RenderHtmlFileAsPdf(), 然后调用 SaveAs() 来写入结果。 无执行路径、无流程管理、无路径依赖。 请参阅 HTML 转 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 使用设置器方法(SetJavaScript(), SetEncrypt(), SetPDFTitle())。IronPDF使用 RenderingOptions 属性进行渲染前设置,并在 PdfDocument 对象上使用 Encrypt() 等渲染后方法。

关键映射:

  • prince.SetJavaScript(true)renderer.RenderingOptions.EnableJavaScript=trueprince.SetJavaScript(true) = 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 上,而这些 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 @页面不起作用

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

问题 2:页面边框缺失

CSS 边距框(@top-center, @bottom-right)是 Prince 专用的。 请使用 HtmlHeader/HtmlFooter 代替。

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

string-set CSS 属性是 Prince 特有的。 使用 <title> 标记中的 {html-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 @ 页面规则
  • [ ] 列出 Prince 特有的 CSS 属性(<代码>prince-*</代码>,<代码>字符串集</代码)
  • [ ] 注意任何JavaScript王子函数
  • [确定使用的 PDF 功能(加密、元数据)
  • [ ] 从 ironpdf.com 获取IronPDF许可证密钥

代码更改

  • [ ] 删除 PrinceXMLWrapper NuGet 软件包
  • [ ] 安装 IronPdf NuGet 软件包
  • [更新命名空间导入
  • [ ] 将 Prince 实例替换为 ChromePdfRenderer
  • [ ] 将 prince.Convert() 替换为 RenderHtmlFileAsPdf()RenderHtmlAsPdf()
  • [ ] 将设置器方法转换为 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</code) 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 对物联网 (IoT) 有浓厚的兴趣,探索将硬件和软件集成的新方法。在空闲时间,他喜欢玩游戏和构建 Discord 机器人,将他对技术的热爱与创造力相结合。