C#でPrinceXMLからIronPDFに移行する方法
PrinceXMLからIronPDFに移行することで、PDF生成のワークフローが外部のコマンドラインプロセスから.NETネイティブライブラリに変わります。 このガイドは、プロセス管理のオーバーヘッドを排除し、デプロイを簡素化し、生成にとどまらない広範なPDF操作機能を提供する、完全でステップバイステップの移行パスを提供します。
なぜPrinceXMLからIronPDFに移行するのか
PrinceXMLを理解する
PrinceXMLは、CSS Paged Media仕様の専用サポートにより、HTMLコンテンツを印刷に最適なPDF文書に変換することを得意とする洗練されたツールです。 PrinceXMLは、このような専門性に特化しているため、意図した印刷デザインに忠実なドキュメントを作成することができます。
ただし、PrinceXMLは.NETライブラリではなく、独立したコマンドラインツールとして動作するため、純粋な.NETソリューションを好む環境にとっては統合が複雑になる可能性があります。 別のサーバープロセスに依存するため、システムリソースの管理が追加され、プロジェクトの展開が複雑になる可能性があります。
外部プロセスの問題
PrinceXMLは独立したコマンドライン実行ファイルとして動作するため、.NETアプリケーションではアーキテクチャ上の大きな課題が生じます:
1.プロセス管理のオーバーヘッド:外部プロセスを生成、監視、終了する必要があります。
2.ネイティブ .NET 統合なし: stdin/stdout または一時ファイルを介して通信します。
3.展開の複雑さ:すべてのサーバーに Prince をインストールする必要があります。
4.サーバーごとのライセンス:展開ごとに個別のライセンスが必要です (495 ドル以上)。
5.エラー処理の難易度:エラー検出のためにテキスト出力を解析します。
- Async/Await なし:ブロッキング呼び出しや複雑な非同期ラッパーは必要ありません。
7.パスの依存関係: Prince 実行可能ファイルを PATH または絶対パスで見つける必要があります。
PrinceXMLとIronPDFの比較
| アスペクト | PrinceXML | IronPDF |
|---|---|---|
| アーキテクチャ | 外部プロセス | .NETネイティブライブラリ |
| 統合。 | コマンドライン | ダイレクトAPI |
| デプロイメント | すべてのサーバーにインストール | 単一のNuGetパッケージ |
| エラー処理。 | テキスト出力の解析 | .NET の例外 |
| 非同期サポートについて | マニュアルラッパー | ネイティブasync/await |
| PDF操作 | 生成のみ | 完全な操作(マージ、分割、編集) |
| ライセンスについて | サーバーあたり(495ドル以上) | 開発者1人あたり |
| 更新情報 | 手動再インストール | NuGetアップデート |
| デバッグ。 | 難易度 | 完全なデバッガサポート |
| デジタル署名。 | なし | はい |
| フォーム。 | なし | はい |
| Dockerサポート。 | 複雑 | 単純 |
| クラウドファンクション | 難易度 | 簡単 |
IronPdfは、単なるHTMLからPDFへの変換にとどまらず、編集、マージ、電子署名などの高度なPDF操作タスクも含む、.NETネイティブ機能で代替手段を提供します。 IronPdfのAPIはシンプルで使いやすいように設計されており、開発者は最小限の定型コードで変換や操作を行うことができます。
2025年と2026年まで.NET 10とC# 14の導入を計画しているチームにとって、IronPDFのシームレスな導入は外部依存やサーバープロセスを必要としないため、.NETフレームワークへの統合の負担を軽減します。
始める前に
前提条件
- .NET 環境: .NET Framework 4.6.2+ または .NET Core 3.1+ / .NET 5/6/7/8/9+
- NuGetアクセス: NuGetパッケージをインストールする機能
- 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ライセンス構成
// Add at application startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";// 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" .# 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" .完全な 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;コマンドラインからメソッドへのマッピング
| プリンスコマンド | 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<//code>. |
CSSの@pageからRenderingOptionsへのマッピング
| CSS @ページプロパティ | IronPDF 同等物 |
|---|---|
サイズ:A4 | PaperSize = PdfPaperSize.A4. |
| <コード>サイズレター | PaperSize = PdfPaperSize.Letter. |
サイズ:A4横 | PaperSize = PdfPaperSize.A4 + PaperOrientation = Landscape です。 |
| <コード>マージン:2cm</コード | マージントップ/ボトム/レフト/ライト = 56 |
| <コード>マージントップ:1インチ</コード | マージントップ = 72 |
@top-center { content:"..." }<//code> | HtmlHeaderと中央揃えdiv |
@bottom-right { content: counter(page) }<//code> | {page}プレースホルダを持つHtmlFooter。 |
ページ サイズの変換
| サイズ | ポイント | ミリメートル |
|---|---|---|
| レター | 612 x 792 | 216 x 279 |
| A4 | 595 x 842 | 210 x 297 |
| リーガル | 612 x 1008 | 216 x 356 |
| 1インチ | 72 | 25.4 |
| 1cm | 28.35 | 10 |
コード移行の例
例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");
}
}翻訳後(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");
}
}この例は、基本的なアーキテクチャの違いを示しています。 PrinceXMLでは、実行ファイルへのフルパス("C:³³Program Files³³Prince³³³³³.exe")を指定してPrinceオブジェクトをインスタンス化し、入力パスと出力パスを指定してConvert()を呼び出す必要があります。
IronPDFはパスの依存性を完全に排除します: ChromePdfRendererを作成し、RenderHtmlFileAsPdf()をHTMLファイルのパスで呼び出し、SaveAs()で結果を書き込みます。 実行可能パス、プロセス管理、パス依存性はありません。 包括的な例については、HTML to PDF documentationを参照してください。
例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");
}
}翻訳後(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");
}
}この例では、PrinceXMLのオプションとIronPDFのプロパティの対応を示しています。 PrinceXMLでは、変換前にセッターメソッド(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");
}
}翻訳後(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");
}
}この例では、決定的な違いが浮き彫りになっています:PrinceXMLではファイル入力が必要なので、変換前に一時ファイル(File.WriteAllText("temp.html", html))を作成する必要があります。 IronPDFのRenderHtmlAsPdf()はHTML文字列を直接受け取ります-テンポラリファイル、クリーンアップコード、ディスクI/Oオーバーヘッドはありません。
CSSページングされたメディアを移行する
PrinceXMLのCSS Paged Mediaのサポートは強力ですが、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
};よくある CSS 移行の問題
課題1: CSSの@ページが動作しない。
IronPDFはChromiumを使用しており、@ページのサポートに制限があります。 CSSルールをRenderingOptionsに変換する。
課題2:ページの余白ボックスが見つからない
CSSのマージンボックス(@top-center, @bottom-right)は、プリンス特有のものです。 代わりにHtmlHeader/HtmlFooterを使用してください。
問題3: 文字列セット/コンテンツが動作しない。
string-set CSS プロパティは、Prince 固有のものです。 <title>タグの{html-title}プレースホルダを使用してください:
<title>Chapter 1: Introduction</title><title>Chapter 1: Introduction</title>renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
{
HtmlFragment = "<div>{html-title}</div>"
};renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
{
HtmlFragment = "<div>{html-title}</div>"
};課題4:カウンター(ページ)が間違っている。
CSSカウンターの代わりにIronPDFの{total-pages}プレースホルダーを使用してください。
パフォーマンス比較
| 手術 | PrinceXML | IronPDF | ノート |
|---|---|---|---|
| シンプルなHTML | ~400ms | ~300ms | IronPDF インプロセス |
| 複雑な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");ウォーターマーク
pdf.ApplyWatermark("<h1 style='color:red; opacity:0.3;'>DRAFT</h1>");pdf.ApplyWatermark("<h1 style='color:red; opacity:0.3;'>DRAFT</h1>");デジタル署名
var signature = new PdfSignature("certificate.pfx", "password");
pdf.Sign(signature);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");var pdf = PdfDocument.FromFile("form.pdf");
pdf.Form.GetFieldByName("Name").Value = "John Doe";
pdf.SaveAs("filled_form.pdf");機能比較の概要
| フィーチャー | PrinceXML | IronPDF |
|---|---|---|
| .NET ネイティブ | なし | はい |
| 外部プロセス | 必須 | なし |
| 非同期サポート | マニュアルラッピング | ネイティブasync/await |
| CSSページングメディア | フルサポート | レンダリングオプション経由 |
| CSSグリッド | はい | はい |
| フレックスボックス | はい | はい |
| JavaScript | 制限的 | フルES2024 |
| 世代 | はい | はい |
| マージ | なし | はい |
| 分割 | なし | はい |
| 編集 | なし | はい |
| 透かし | CSSのみ | HTML/CSS + API |
| デジタル署名 | なし | はい |
| PDF/A | はい | はい |
| 暗号化 | はい | はい |
| フォーム | なし | はい |
| NuGetパッケージ | なし | はい |
| サーバーインストール | 必須 | なし |
移行チェックリスト
移行前
- すべてのPrinceコマンドライン呼び出しを識別する
- 使用されるドキュメント CSS @page ルール
- Prince固有のCSSプロパティ(
prince-*、string-set)を一覧表示します。 - PrinceのJavaScript関数をメモする
- 使用されているPDF機能(暗号化、メタデータ)を特定する
- ironpdf.comからIronPDFライセンスキーを取得します
コードの変更
PrinceXMLWrapperNuGet パッケージを削除するIronPdfNuGetパッケージをインストールする- 名前空間のインポートを更新する
Princeインスタンス化をChromePdfRendererに置き換えるprince.Convert()をRenderHtmlFileAsPdf()またはRenderHtmlAsPdf()に置き換えます- セッターメソッドを
RenderingOptionsプロパティに変換する - @page CSS を
RenderingOptionsに移行する - マージンボックスを
HtmlHeader/HtmlFooterに置き換える - CSS カウンターを
{page}/{total-pages}プレースホルダーに変換する - HTML文字列の一時ファイル処理を削除
- アプリケーションの起動時にライセンスの初期化を追加
移行後
- HTMLファイルの変換をテストする
- HTML文字列の変換をテストする
- URL変換をテストする
- ページサイズが一致していることを確認する
- 余白が一致していることを確認する
- ヘッダーとフッターをテストする
- ページ番号を確認する
- 暗号化/セキュリティのテスト
- サーバーからPrinceのインストールを削除する
- デプロイメントスクリプトを更新する






