移行ガイド C#でRotativaからIronPDFに移行する方法 カーティス・チャウ 公開日:2026年2月1日 IronPDF をダウンロード NuGet ダウンロード DLL ダウンロード Windows 版 無料トライアル LLM向けのコピー LLM向けのコピー LLM 用の Markdown としてページをコピーする ChatGPTで開く このページについてChatGPTに質問する ジェミニで開く このページについてGeminiに問い合わせる Grokで開く このページについてGrokに質問する 困惑の中で開く このページについてPerplexityに問い合わせる 共有する Facebook で共有 Xでシェア(Twitter) LinkedIn で共有 URLをコピー 記事をメールで送る RotativaからIronPDFへの移行は、PDF生成のワークフローを近代化すると同時に、重要なセキュリティの脆弱性に対処します。 このガイドは、放棄されたwkhtmltopdf依存性を排除し、最新のCSSとJavaScriptのサポートを可能にし、ASP.NET MVCを超えるクロスプラットフォームの互換性を提供する、完全で段階的な移行パスを提供します。 なぜRotativaからIronPDFへ移行するのか Rotativaについて Rotativaは、C#でPDFを生成するための開発者の間で長い間人気のある選択肢です。 wkhtmltopdfツールを活用し、HTMLコンテンツをPDF形式に変換します。 Rotativaは、ASP.NET MVCアプリケーションのために特別に設計されたオープンソースのライブラリです。 しかし、Rotativaは多くの読者を惹きつける一方で、時代遅れの技術スタックに依存しているため、すべての開発者がすぐに理解できるとは限らないという課題があります。 Rotativaは、ASP.NET MVCプロジェクトにPDF生成を統合する簡単な方法を提供し、そのバックエンド機能にはwkhtmltopdfを利用しています。 重要なセキュリティ勧告 Rotativaはwkhtmltopdfをラップしていますが、これはCRITICAL UNPATCHED SECURITY VULNERABILITIES.を持っています。 属性 価値 CVE ID CVE-2022-35583 厳しさ クリティカル (9.8/10) アタックベクター ネットワーク <ステータス パッチが適用されることはありません 影響を受ける言語 すべてのRotativaバージョン wkhtmltopdfは、2022年12月に正式に放棄されました。メンテナンス担当者は、セキュリティの脆弱性を修正しないと明言しています。 Rotativaを使用するすべてのアプリケーションは、永久に公開されます。 攻撃の仕組み <iframe src="http://169.254.169.254/latest/meta-data/iam/security-credentials/"></iframe> <img src="http://internal-database:5432/admin" /> <iframe src="http://169.254.169.254/latest/meta-data/iam/security-credentials/"></iframe> <img src="http://internal-database:5432/admin" /> HTML インパクト: AWS/Azure/GCPクラウドメタデータエンドポイントへのアクセス 内部APIデータと認証情報を盗む 内部ネットワークのポートスキャン 機密設定の流出 テクノロジーの危機 Rotativaは、wkhtmltopdfをラップしています: Qt WebKit 4.8 (2012年から) Flexboxをサポートしていません CSSグリッドのサポートなし 壊れたJavaScriptの実行 ES6+はサポートしません。 RotativaとIronPDFの比較 フィーチャー ロータティバ IronPDF プロジェクトの互換性 ASP.NET MVCのみ あらゆる.NETプロジェクトタイプ(MVC、Blazor Pages、Blazorなど) メンテナンス 中止 積極的にメンテナンス セキュリティ。 wkhtmltopdfの依存関係による脆弱性 (CVE-2022-35583) 定期的なアップデートとセキュリティパッチ HTMLレンダリング。 時代遅れのWebKit モダンChromium CSS3について 部分的 フルサポート フレックスボックス/グリッド サポートされていません フルサポート JavaScript(ジャバスクリプト 信頼できない 完全なES6 レイザーページ サポートされていません フルサポート Blazor。 サポートされていません フルサポート PDF操作 不可 フル デジタル署名。 不可 フル PDF/Aコンプライアンス 不可 フル 非同期/待機 同期のみ 完全な非同期 オープンソース。 はい、MITライセンス いいえ、商用ライセンス 2025年と2026年まで.NET 10とC# 14の採用を計画しているチームにとって、IronPDFはRotativaでは提供できない最新のChromiumレンダリングとクロスプラットフォームのサポートを提供します。 始める前に 前提条件 .NET 環境: .NET Framework 4.6.2+ または .NET Core 3.1+ / .NET 5/6/7/8/9+ NuGetアクセス: NuGetパッケージをインストールする機能 IronPDFライセンス: ironpdf.comからライセンスキーを取得します。 NuGetパッケージの変更 # Remove Rotativa dotnet remove package Rotativa dotnet remove package Rotativa.AspNetCore # Install IronPDF dotnet add package IronPdf # Remove Rotativa dotnet remove package Rotativa dotnet remove package Rotativa.AspNetCore # Install IronPDF dotnet add package IronPdf SHELL wkhtmltopdfバイナリの削除 プロジェクトからこれらのファイルを削除してください: wkhtmltopdf.exe wkhtmltox.dll すべての `Rotativa/ フォルダー これらはCVE-2022-35583のソースです。IronPDFはネイティブバイナリを必要としません。 ライセンス構成 // Add in Program.cs or Startup.cs IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"; // Add in Program.cs or Startup.cs IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"; $vbLabelText $csharpLabel 完全な API リファレンス 名前空間の変更 // Before: Rotativa using Rotativa; using Rotativa.Options; using Rotativa.AspNetCore; // After: IronPDF using IronPdf; using IronPdf.Rendering; // Before: Rotativa using Rotativa; using Rotativa.Options; using Rotativa.AspNetCore; // After: IronPDF using IronPdf; using IronPdf.Rendering; $vbLabelText $csharpLabel コア クラス マッピング Rotativa クラス IronPDF 同等物 ノート ViewAsPdf ChromePdfRenderer HTMLのレンダリング ActionAsPdf ChromePdfRenderer.RenderUrlAsPdf()のようにします。 レンダリングURL UrlAsPdf ChromePdfRenderer.RenderUrlAsPdf()のようにします。 レンダリングURL オリエンテーション enum PdfPaperOrientation列挙型 オリエンテーション サイズ列挙型 PdfPaperSize列挙型 用紙サイズ ページのプレースホルダーの変換 Rotativa プレースホルダ IronPDF プレースホルダー [ページ] {ページ} [トップページ] {総ページ数} [日付] `{date} [時間]|{時間}` [タイトル] `{html-title} [サイトページ]` {url} コード移行の例 例1: HTMLからPDFへの変換 翻訳前(Rotativa): // NuGet: Install-Package Rotativa.Core using Microsoft.AspNetCore.Mvc; using Rotativa.AspNetCore; using System.Threading.Tasks; namespace RotativaExample { public class PdfController : Controller { public async Task<IActionResult> GeneratePdf() { var htmlContent = "<h1>Hello World</h1><p>This is a PDF document.</p>"; //ロータティバrequires returning a ViewAsPdf result from MVC controller return new ViewAsPdf() { ViewName = "PdfView", PageSize = Rotativa.AspNetCore.Options.Size.A4 }; } } } // NuGet: Install-Package Rotativa.Core using Microsoft.AspNetCore.Mvc; using Rotativa.AspNetCore; using System.Threading.Tasks; namespace RotativaExample { public class PdfController : Controller { public async Task<IActionResult> GeneratePdf() { var htmlContent = "<h1>Hello World</h1><p>This is a PDF document.</p>"; //ロータティバrequires returning a ViewAsPdf result from MVC controller return new ViewAsPdf() { ViewName = "PdfView", PageSize = Rotativa.AspNetCore.Options.Size.A4 }; } } } $vbLabelText $csharpLabel 翻訳後(IronPDF):。 // NuGet: Install-Package IronPdf using IronPdf; using System; namespace IronPdfExample { class Program { static void Main(string[] args) { var renderer = new ChromePdfRenderer(); var htmlContent = "<h1>Hello World</h1><p>This is a PDF document.</p>"; var pdf = renderer.RenderHtmlAsPdf(htmlContent); pdf.SaveAs("output.pdf"); Console.WriteLine("PDF generated successfully!"); } } } // NuGet: Install-Package IronPdf using IronPdf; using System; namespace IronPdfExample { class Program { static void Main(string[] args) { var renderer = new ChromePdfRenderer(); var htmlContent = "<h1>Hello World</h1><p>This is a PDF document.</p>"; var pdf = renderer.RenderHtmlAsPdf(htmlContent); pdf.SaveAs("output.pdf"); Console.WriteLine("PDF generated successfully!"); } } } $vbLabelText $csharpLabel この例は、基本的なアーキテクチャの違いを示しています。 Rotativaは、MVCコントローラのアクションからViewAsPdfの結果を返す必要があり、ASP.NET MVCフレームワークと結びついています。 このパターンはMVCリクエストパイプライン内でのみ動作し、レンダリングにはRazorビューが必要です。 IronPDFはコンソールアプリケーション、ウェブAPI、Blazor、Razor Pages、.NETプロジェクトのどのタイプでも動作します。 HTML文字列でRenderHtmlAsPdf()を呼び出し、結果を保存します。 MVCコントローラ不要、ビュー依存なし。 包括的な例については、HTML to PDF documentationを参照してください。 例2: URLからPDFへの変換 翻訳前(Rotativa): // NuGet: Install-Package Rotativa.Core using Microsoft.AspNetCore.Mvc; using Rotativa.AspNetCore; using System.Threading.Tasks; namespace RotativaExample { public class UrlPdfController : Controller { public async Task<IActionResult> ConvertUrlToPdf() { //ロータティバworks within MVC framework and returns ActionResult return new UrlAsPdf("https://www.example.com") { FileName = "webpage.pdf", PageSize = Rotativa.AspNetCore.Options.Size.A4, PageOrientation = Rotativa.AspNetCore.Options.Orientation.Portrait }; } } } // NuGet: Install-Package Rotativa.Core using Microsoft.AspNetCore.Mvc; using Rotativa.AspNetCore; using System.Threading.Tasks; namespace RotativaExample { public class UrlPdfController : Controller { public async Task<IActionResult> ConvertUrlToPdf() { //ロータティバworks within MVC framework and returns ActionResult return new UrlAsPdf("https://www.example.com") { FileName = "webpage.pdf", PageSize = Rotativa.AspNetCore.Options.Size.A4, PageOrientation = Rotativa.AspNetCore.Options.Orientation.Portrait }; } } } $vbLabelText $csharpLabel 翻訳後(IronPDF):。 // NuGet: Install-Package IronPdf using IronPdf; using System; namespace IronPdfExample { class Program { static void Main(string[] args) { var renderer = new ChromePdfRenderer(); var pdf = renderer.RenderUrlAsPdf("https://www.example.com"); pdf.SaveAs("webpage.pdf"); Console.WriteLine("URL converted to PDF successfully!"); } } } // NuGet: Install-Package IronPdf using IronPdf; using System; namespace IronPdfExample { class Program { static void Main(string[] args) { var renderer = new ChromePdfRenderer(); var pdf = renderer.RenderUrlAsPdf("https://www.example.com"); pdf.SaveAs("webpage.pdf"); Console.WriteLine("URL converted to PDF successfully!"); } } } $vbLabelText $csharpLabel RotativaのUrlAsPdfクラスは、MVCコントローラからActionResultを返す必要があります。 IronPDFのRenderUrlAsPdf()メソッドはどのようなコンテキストからでも呼び出すことができ、PdfDocumentオブジェクトを直接返します。 URLレンダリングには、wkhtmltopdfの脆弱で時代遅れのWebKitエンジンではなく、最新のChromiumを使用しています。詳しくはチュートリアルをご覧ください。 例3:ページ番号を含むヘッダーとフッター 翻訳前(Rotativa): // NuGet: Install-Package Rotativa.Core using Microsoft.AspNetCore.Mvc; using Rotativa.AspNetCore; using Rotativa.AspNetCore.Options; using System.Threading.Tasks; namespace RotativaExample { public class HeaderFooterController : Controller { public async Task<IActionResult> GeneratePdfWithHeaderFooter() { return new ViewAsPdf("Report") { PageSize = Size.A4, PageMargins = new Margins(20, 10, 20, 10), CustomSwitches = "--header-center \"Page Header\" --footer-center \"Page [page] of [toPage]\"" }; } } } // NuGet: Install-Package Rotativa.Core using Microsoft.AspNetCore.Mvc; using Rotativa.AspNetCore; using Rotativa.AspNetCore.Options; using System.Threading.Tasks; namespace RotativaExample { public class HeaderFooterController : Controller { public async Task<IActionResult> GeneratePdfWithHeaderFooter() { return new ViewAsPdf("Report") { PageSize = Size.A4, PageMargins = new Margins(20, 10, 20, 10), CustomSwitches = "--header-center \"Page Header\" --footer-center \"Page [page] of [toPage]\"" }; } } } $vbLabelText $csharpLabel 翻訳後(IronPDF):。 // NuGet: Install-Package IronPdf using IronPdf; using IronPdf.Rendering; using System; namespace IronPdfExample { class Program { static void Main(string[] args) { var renderer = new ChromePdfRenderer(); renderer.RenderingOptions.TextHeader = new TextHeaderFooter() { CenterText = "Page Header", DrawDividerLine = true }; renderer.RenderingOptions.TextFooter = new TextHeaderFooter() { CenterText = "Page {page} of {total-pages}", DrawDividerLine = true }; var htmlContent = "<h1>Report Title</h1><p>Report content goes here.</p>"; var pdf = renderer.RenderHtmlAsPdf(htmlContent); pdf.SaveAs("report.pdf"); Console.WriteLine("PDF with headers and footers created successfully!"); } } } // NuGet: Install-Package IronPdf using IronPdf; using IronPdf.Rendering; using System; namespace IronPdfExample { class Program { static void Main(string[] args) { var renderer = new ChromePdfRenderer(); renderer.RenderingOptions.TextHeader = new TextHeaderFooter() { CenterText = "Page Header", DrawDividerLine = true }; renderer.RenderingOptions.TextFooter = new TextHeaderFooter() { CenterText = "Page {page} of {total-pages}", DrawDividerLine = true }; var htmlContent = "<h1>Report Title</h1><p>Report content goes here.</p>"; var pdf = renderer.RenderHtmlAsPdf(htmlContent); pdf.SaveAs("report.pdf"); Console.WriteLine("PDF with headers and footers created successfully!"); } } } $vbLabelText $csharpLabel Rotativaは、[page]や[toPage]のようなプレースホルダーによるヘッダーやフッターの設定を含め、CustomSwitchesを使ってコマンドライン引数をwkhtmltopdfに渡します。 この文字列ベースのアプローチは、エラーが発生しやすく、コンパイル時に検証するのが困難です。 IronPDFはCenterTextやDrawDividerLineのようなプロパティを持つ強い型付けのTextHeaderFooterオブジェクトを使用します。 プレースホルダの構文は、[page]から{page}に、[toPage]から{total-pages}に変更されます。 型付きプロパティはインテリセンス、コンパイル時チェックを提供し、タイプミスのリスクはありません。 MVCのみのアーキテクチャ問題 Rotativaは、ASP.NET MVC 5以前向けに設計されています: // ❌ロータティバ- Only works with classic MVC pattern public class InvoiceController : Controller { public ActionResult InvoicePdf(int id) { var model = GetInvoice(id); return new ViewAsPdf("Invoice", model); // Tied to MVC Views } } // Problems: // - No Razor Pages support // - No Blazor support // - No minimal APIs support // - No ASP.NET Core native integration // ❌ロータティバ- Only works with classic MVC pattern public class InvoiceController : Controller { public ActionResult InvoicePdf(int id) { var model = GetInvoice(id); return new ViewAsPdf("Invoice", model); // Tied to MVC Views } } // Problems: // - No Razor Pages support // - No Blazor support // - No minimal APIs support // - No ASP.NET Core native integration $vbLabelText $csharpLabel IronPdfはビューのレンダリングとPDFの生成を分離しており、MVCビューだけでなくあらゆるHTMLをレンダリングすることができます。 非同期パターンの移行 Rotativa はスレッドをブロックします; IronPdfは完全なasync/awaitをサポートしています: // ❌ロータティバ- Blocks the thread public ActionResult GeneratePdf() { return new ViewAsPdf("Report"); // This blocks the request thread until PDF is complete // Poor scalability under load } // ✅IronPDF-完全な非同期support public async Task<IActionResult> GeneratePdf() { var renderer = new ChromePdfRenderer(); var pdf = await renderer.RenderHtmlAsPdfAsync(html); return File(pdf.BinaryData, "application/pdf"); // Non-blocking, better scalability } // ❌ロータティバ- Blocks the thread public ActionResult GeneratePdf() { return new ViewAsPdf("Report"); // This blocks the request thread until PDF is complete // Poor scalability under load } // ✅IronPDF-完全な非同期support public async Task<IActionResult> GeneratePdf() { var renderer = new ChromePdfRenderer(); var pdf = await renderer.RenderHtmlAsPdfAsync(html); return File(pdf.BinaryData, "application/pdf"); // Non-blocking, better scalability } $vbLabelText $csharpLabel 移行後の新機能 IronPDFに移行した後、Rotativaでは提供できない機能を得ることができます: PDFマージ var merged = PdfDocument.Merge(pdf1, pdf2, pdf3); merged.SaveAs("complete.pdf"); var merged = PdfDocument.Merge(pdf1, pdf2, pdf3); merged.SaveAs("complete.pdf"); $vbLabelText $csharpLabel デジタル署名 var signature = new PdfSignature("certificate.pfx", "password"); pdf.Sign(signature); var signature = new PdfSignature("certificate.pfx", "password"); pdf.Sign(signature); $vbLabelText $csharpLabel パスワード保護 pdf.SecuritySettings.UserPassword = "secret"; pdf.SecuritySettings.UserPassword = "secret"; $vbLabelText $csharpLabel ウォーターマーク pdf.ApplyWatermark("<h1 style='color:red; opacity:0.3;'>DRAFT</h1>"); pdf.ApplyWatermark("<h1 style='color:red; opacity:0.3;'>DRAFT</h1>"); $vbLabelText $csharpLabel PDF/Aアーカイブ準拠 pdf.SaveAsPdfA("archive.pdf", PdfAVersions.PdfA3b); pdf.SaveAsPdfA("archive.pdf", PdfAVersions.PdfA3b); $vbLabelText $csharpLabel 最新の CSS サポート // This now works (broke in Rotativa) var html = @" <div style='display: flex; justify-content: space-between;'> <div>Left</div> <div>Right</div> </div> <div style='display: grid; grid-template-columns: 1fr 1fr 1fr;'> <div>Col 1</div><div>Col 2</div><div>Col 3</div> </div>"; var pdf = renderer.RenderHtmlAsPdf(html); // Works! // This now works (broke in Rotativa) var html = @" <div style='display: flex; justify-content: space-between;'> <div>Left</div> <div>Right</div> </div> <div style='display: grid; grid-template-columns: 1fr 1fr 1fr;'> <div>Col 1</div><div>Col 2</div><div>Col 3</div> </div>"; var pdf = renderer.RenderHtmlAsPdf(html); // Works! $vbLabelText $csharpLabel 移行チェックリスト 移行前 コードベースでロータティバの使用箇所をすべて特定する RenderingOptions への変換に使用されるドキュメント CustomSwitches 変換のためのヘッダー/フッターのプレースホルダー構文に注意してください([ページ]→{ページ}`) ironpdf.comからIronPDFライセンスキーを取得します パッケージの変更 RotativaおよびRotativa.AspNetCore NuGet パッケージを削除します wkhtmltopdf バイナリ ( wkhtmltopdf.exe 、 wkhtmltox.dll ) を削除します IronPdf NuGetパッケージをインストールする コードの変更 名前空間のインポートを更新します ( using Rotativa; → using IronPdf; ) ViewAsPdf``ChromePdfRenderer+ RenderHtmlAsPdf()に置き換えます -UrlAsPdf``RenderUrlAsPdf()に置き換えます CustomSwitchesをRenderingOptionsプロパティに変換する プレースホルダー構文を更新([ページ]→{ページ}、[トップページ]→{総ページ数}) PageMargins個別のMarginTop / MarginBottom / MarginLeft / MarginRightに置き換えます 必要に応じて非同期パターンに変更する アプリケーションの起動時にライセンスの初期化を追加 移行後 すべてのPDF生成が正しく機能することを確認する PDF出力品質の比較(Chromiumの方が正確にレンダリングされる) CSS レンダリングの改善を検証 (Flexbox/Grid が動作するようになりました) JavaScript 実行をテストする (Chromium で信頼性が向上) セキュリティスキャンのパスを検証する(CVE-2022-35583フラグはなくなりました) Docker構成を更新してwkhtmltopdfのインストールを削除します カーティス・チャウ 今すぐエンジニアリングチームとチャット テクニカルライター Curtis Chauは、カールトン大学でコンピュータサイエンスの学士号を取得し、Node.js、TypeScript、JavaScript、およびReactに精通したフロントエンド開発を専門としています。直感的で美しいユーザーインターフェースを作成することに情熱を持ち、Curtisは現代のフレームワークを用いた開発や、構造の良い視覚的に魅力的なマニュアルの作成を楽しんでいます。開発以外にも、CurtisはIoT(Internet of Things)への強い関心を持ち、ハードウェアとソフトウェアの統合方法を模索しています。余暇には、ゲームをしたりDiscordボットを作成したりして、技術に対する愛情と創造性を組み合わせています。 関連する記事 公開日 2026年2月1日 C#でZetPDFからIronPDFに移行する方法 この完全なC#ガイドでZetPDFからIronPDFへの移行をマスターしてください。座標ベースのライブラリから最新のHTML-to-PDFソリューションに切り替えます。HTML変換、PDFのマージ、PDFSharpの依存関係の削除のコード例が含まれています。 詳しく読む 公開日 2026年2月1日 C#でScryber.CoreからIronPDFに移行する方法 この完全なC#ガイドでScryber.CoreからIronPDFへの移行をマスターしてください。カスタムXML/HTMLパースから最新のChromiumレンダラーに切り替えます。HTML変換、URLレンダリング、独自のバインディングを置き換えるコード例を含みます。 詳しく読む 公開日 2026年2月1日 C#でXFINIUM.PDFからIronPdfへ移行する方法 この完全なC#ガイドでXFINIUM.PDFからIronPDFへの移行をマスターしてください。座標ベースの手動ポジショニングから宣言的なHTML/CSSレンダリングに切り替えます。グラフィックスプリミティブの置き換えと自動レイアウトのコード例を含みます。 詳しく読む C#でSAP Crystal ReportsからIronPDFに移行する方法C#でRawPrintからIronPDFに移行...
公開日 2026年2月1日 C#でZetPDFからIronPDFに移行する方法 この完全なC#ガイドでZetPDFからIronPDFへの移行をマスターしてください。座標ベースのライブラリから最新のHTML-to-PDFソリューションに切り替えます。HTML変換、PDFのマージ、PDFSharpの依存関係の削除のコード例が含まれています。 詳しく読む
公開日 2026年2月1日 C#でScryber.CoreからIronPDFに移行する方法 この完全なC#ガイドでScryber.CoreからIronPDFへの移行をマスターしてください。カスタムXML/HTMLパースから最新のChromiumレンダラーに切り替えます。HTML変換、URLレンダリング、独自のバインディングを置き換えるコード例を含みます。 詳しく読む
公開日 2026年2月1日 C#でXFINIUM.PDFからIronPdfへ移行する方法 この完全なC#ガイドでXFINIUM.PDFからIronPDFへの移行をマスターしてください。座標ベースの手動ポジショニングから宣言的なHTML/CSSレンダリングに切り替えます。グラフィックスプリミティブの置き換えと自動レイアウトのコード例を含みます。 詳しく読む