Rotativa vs IronPDF:技術比較ガイド
RotativaとIronPDFの比較:.NET PDF生成比較ガイド
.NET開発者がPDF生成ソリューションを評価するとき、RotativaとIronPDFはアーキテクチャの基礎とメンテナンスの軌跡が異なる根本的に異なるアプローチです。 RotativaはASP.NET MVCアプリケーション内でHTMLコンテンツをPDFフォーマットに変換するwkhtmltopdfツールを活用し、IronPDFは全ての.NETプロジェクトタイプと互換性のある最新のChromiumベースのレンダリングエンジンを提供します。この技術比較では、2025年以降に.NETアプリケーションのPDF生成を決定するプロの開発者やアーキテクトにとって最も重要な次元にわたって、両ライブラリを検証します。
Rotativaについて
Rotativaは、ASP.NET MVCアプリケーションのために特別に設計されたオープンソースのライブラリです。 HTMLコンテンツをPDFフォーマットに変換するwkhtmltopdfコマンドラインツールをラップしています。 このライブラリは、ViewAsPdfやUrlAsPdfのようなMVC特有のアクション結果型を提供し、MVCコントローラパターンと直接統合します。
Rotativaの中核には、wkhtmltopdfの2012年のQt WebKit 4.8レンダリングエンジンを使用しています。つまり、このライブラリはFlexboxやCSS Gridのような最新のCSS機能をレンダリングすることができず、JavaScriptの実行はES6+をサポートしていないため信頼できません。
重要な考慮事項:Rotativaは何年もアップデートやメンテナンスを受けていません。 基礎となるwkhtmltopdfは2022年12月に正式に放棄され、メンテナはセキュリティの脆弱性を修正しないと明言している。 これには、深刻度レーティングが 9.8/10 の重大な Server-Side Request Forgery (SSRF) 脆弱性である CVE-2022-35583 が含まれます。
IronPDFの理解
IronPDFは、.NETアプリケーションにChromiumベースの最新のPDF生成ソリューションを提供します。 このライブラリは、ASP.NET MVC、Razor Pages、Blazor、最小限のAPI、コンソールアプリケーション、デスクトッププロジェクトなど、あらゆる.NETプロジェクトタイプで動作します。
IronPDFのアーキテクチャはHTMLレンダリングとPDF生成を分離し、開発者がアプリケーションをどのように構成するかをより柔軟にします。 ChromePdfRendererクラスは、最新のCSS3、JavaScript ES6+、非同期/待機パターンを完全にサポートし、すべての変換処理を処理します。
セキュリティの比較
これらのライブラリのセキュリティ態勢は劇的に異なります:
| リスク | ロータティバ | IronPDF |
|---|---|---|
| CVE-2022-35583 (SSRF) | 脆弱性 | 保護対象 |
| ローカルファイルアクセス | 脆弱性 | サンドボックス |
| 内部ネットワークアクセス | 脆弱性 | 制限事項 |
| セキュリティパッチ | 決して(放棄) | 定期的な更新 |
| 積極的な開発 | 中止 | 毎月のリリース |
CVE-2022-35583の脆弱性は、攻撃者が細工したHTMLコンテンツを通じて、内部ネットワークリソース、クラウドメタデータエンドポイント、および機密設定にアクセスすることを可能にします。 wkhtmltopdfにパッチが適用されることはないため、Rotativaを使用するすべてのアプリケーションは、この重大な脆弱性に永久にさらされたままとなります。
プロジェクトの互換性
Rotativaの最も重要な制限は、ASP.NET MVCに特化していることです:
| フィーチャー | ロータティバ | IronPDF |
|---|---|---|
| ASP.NETのMVC。 | はい | はい |
| レイザーページ | サポートされていません | フルサポート |
| Blazor。 | サポートされていません | フルサポート |
| 最小限のAPI。 | サポートされていません | フルサポート |
| コンソールアプリケーション | サポートされていません | フルサポート |
| デスクトップアプリケーション | サポートされていません | フルサポート |
Rotativaは、ASP.NET MVC 5以前向けに設計されており、コントローラのアクション結果パターンに依存しています。 このアーキテクチャのため、Razor Pages、Blazor、または最小限のAPIを使用する最新の.NET Coreアプリケーションには適していません。
HTMLからPDFへの変換
HTMLからPDFへの変換のコードパターンは、基本的なアーキテクチャの違いを明らかにしています。
RotativaのHTML変換
Rotativaは、MVCコントローラのコンテキストを必要とし、アクションの結果パターンを使用します:
// 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
};
}
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comRotativaのアプローチは、PDF生成をMVCのビューとコントローラに結びつけます。 ViewAsPdfアクションの結果は、RazorビューをレンダリングしてPDFに変換しますが、ビューなしで生のHTML文字列を直接受け入れることはできません。
IronPDFのHTML変換
IronPdfはMVCのコンテキストを必要とせず、HTMLの文字列を直接変換します:
// 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!");
}
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comRenderHtmlAsPdfメソッドは、HTMLコンテンツを直接受け入れ、コンソールアプリケーション、バックグラウンドサービス、あらゆるタイプのWebアプリケーションなど、あらゆるアプリケーションコンテキストからのPDF生成を可能にします。
URLからPDFへの変換
ライブのウェブページをPDFに変換することで、各ライブラリがナビゲーションとレンダリングをどのように処理するかを示します。
RotativaのURL変換
// 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
};
}
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comRotativaのUrlAsPdf結果タイプは、MVCコントローラのコンテキストを必要とし、アクションの結果を返します。 wkhtmltopdfによるURLレンダリングはSSRFの脆弱性を露呈し、攻撃者が内部ネットワークリソースにアクセスできる可能性があることに注意してください。
IronPDFのURL変換
// 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!");
}
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comIronPDFのRenderUrlAsPdfメソッドはどのウェブフレームワークからも独立して動作し、SSRF攻撃を防ぐセキュリティ制限が組み込まれています。
ヘッダーとフッターの実装
ドキュメントのヘッダーとフッターは、API設計の重要な違いを示しています。
Rotativaのヘッダーとフッター
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]\""
};
}
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comCustomSwitchesプロパティは、生のコマンドライン引数をwkhtmltopdfに渡します。 このアプローチには、型安全性、インテリセンスのサポート、コンパイル時のチェックが欠けています。 スイッチ構文のエラーは、実行時にのみ表示されます。
IronPDFのヘッダーとフッター
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!");
}
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comIronPDFのTextHeaderFooterクラスはインテリセンスのサポート、コンパイル時の型チェック、明確なプロパティ名を提供します。 プレースホルダーの構文は異なります:Rotativaは[page]と[toPage]を使用し、IronPDFは{page}と{total-pages}を使用します。
プレースホルダ構文リファレンス
| Rotativa プレースホルダ | IronPDF プレースホルダー |
|---|---|
| <コード>[ページ]</コード | <コード>{ページ}</コード |
| <コード>[トップページ]</コード | <コード>{総ページ数}</コード |
| <コード>[日付]</コード | {date}<//code> |
| <コード>[時間]</コード | <コード>{時間}</コード |
| <コード>[タイトル]</コード | {html-title}<//code> |
| <コード>[サイトページ]</コード | {url}<//code> |
機能比較マトリックス
| フィーチャー | ロータティバ | IronPDF |
|---|---|---|
| セキュリティ。 | 重大なCVE(パッチ未適用) | 脆弱性なし |
| HTMLレンダリング。 | 時代遅れのWebKit (2012) | モダンChromium |
| CSS3について | 一部サポート | フルサポート |
| フレックスボックス/グリッド | サポートされていません | フルサポート |
| JavaScript(ジャバスクリプト | 信頼できない | 完全なES6 |
| .NETコア。 | 限定ポート | ネイティブサポート |
| レイザーページ | サポートされていません | フルサポート |
| Blazor。 | サポートされていません | フルサポート |
| PDF操作 | 不可 | フルサポート |
| デジタル署名。 | 不可 | フルサポート。 |
| PDF/Aコンプライアンス | 不可 | フルサポート |
| 非同期/待機 | 同期のみ | 完全な非同期 |
| アクティブなメンテナンス。 | 中止 | 毎週更新 |
APIマッピングリファレンス
RotativaからIronPdfへの移行を検討しているチームは、このマッピングを参考にしてください:
| Rotativa クラス | IronPDF 同等物 | ノート |
|---|---|---|
| <コード>ViewAsPdf</コード | <コード>ChromePdfRenderer</コード | HTMLのレンダリング |
| <コード>ActionAsPdf</コード | ChromePdfRenderer.RenderUrlAsPdf()のようにします。 | レンダリングURL |
| <コード>UrlAsPdf</コード | ChromePdfRenderer.RenderUrlAsPdf()のようにします。 | レンダリングURL |
オリエンテーション enum | PdfPaperOrientation列挙型 | オリエンテーション |
サイズ列挙型 | PdfPaperSize列挙型 | 用紙サイズ |
| <コード>マージン</コード | レンダリングオプション.マージン* | 個々のプロパティ |
| <コード>カスタムスイッチ</コード | <コード>RenderingOptions.*</コード | 型付きプロパティ |
スレッドの問題
Rotativaはwkhtmltopdfのスレッド制限を継承しています:
//ロータティバ- Blocks the thread
public ActionResult GeneratePdf()
{
return new ViewAsPdf("Report");
// This blocks the request thread until PDF is complete
// Poor scalability under load
}//ロータティバ- Blocks the thread
public ActionResult GeneratePdf()
{
return new ViewAsPdf("Report");
// This blocks the request thread until PDF is complete
// Poor scalability under load
}IRON VB CONVERTER ERROR developers@ironsoftware.comIronPDFは完全な非同期サポートを提供します:
//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
}//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
}IRON VB CONVERTER ERROR developers@ironsoftware.comRotativaのシンクロナス・オンリー・パターンは、リクエスト・スレッドをブロックし、負荷がかかるとアプリケーションのスケーラビリティを低下させます。 IronPDFの非同期サポートにより、高スループットシナリオでリソースの有効活用が可能になります。
展開の考慮事項
Rotativaは、デプロイ環境全体でwkhtmltopdfバイナリを管理する必要があります:
- x86/x64/Linux/Macプラットフォーム用の異なるバイナリ
- 手動PATH環境設定
- すべてのバイナリバージョンにおけるセキュリティ脆弱性
- Dockerイメージにはwkhtmltopdfのインストールが含まれている必要があります。
IronPdfは外部のバイナリ管理なしにNuGetパッケージングによってデプロイを簡素化します。
チームがRotativaの移行を検討するとき
開発チームは、Rotativaに代わる選択肢を検討する必要があります:
セキュリティ要件は、脆弱性スキャナがCVE-2022-35583にフラグを立てたときに重要になります。wkhtmltopdfにパッチが適用されることはないため、セキュリティ監査やコンプライアンス要件の対象となる組織は、Rotativaから移行しなければなりません。
最新の.NETの採用により、チームがBlazor Pages、Blazor、または最小限のAPIに移行する際に互換性がなくなります。RotativaのMVCのみのアーキテクチャでは、これらの最新のパターンをサポートすることはできません。
CSSレンダリングの制限は、デザインがFlexboxやCSS Gridを使用している場合、ドキュメントの品質に影響を与えます。 Rotativaの2012年製の古いWebKitエンジンでは、これらのレイアウトを正しくレンダリングできません。
JavaScriptの信頼性は、動的コンテンツのレンダリングに影響します。 ブラウザで動作する複雑なJavaScriptは、wkhtmltopdfの限られたJavaScriptサポートでは、しばしば失敗したり、正しくレンダリングされません。
非同期スケーラビリティは、高スループットのアプリケーションにとって重要です。 Rotativaのsynchronous-onlyパターンはスレッドをブロックしますが、IronPdfはリソースの有効活用のために完全なasync/awaitをサポートします。
長所とトレードオフ
Rotativaの強み
- 基本的なユースケースのためのシンプルなMVC統合
- オープンソース(MITライセンス)
- レガシーMVCアプリケーションでおなじみのパターン
- 商用ライセンス費用なし
Rotativaの制限事項
- ASP.NET MVCのみ。Blazor Pages、Blazor、最小限のAPIは不可。
- 放置-更新やメンテナンスなし
- パッチが適用されない重大なセキュリティ脆弱性
- 時代遅れのWebKitレンダリングエンジン(2012年)
- FlexboxまたはCSS Gridをサポートしていません。
- 信頼できないJavaScriptの実行
- 同期のみ-拡張性に乏しい
- PDF操作機能なし
- デジタル署名またはPDF/Aコンプライアンスなし
IronPDFの強み
IronPDFについての考察
- 商用ライセンスモデル
- ライセンスキーの初期化が必要
結論
Rotativaは、ASP.NET MVCアプリケーションでPDFを生成するための簡単なソリューションを提供しました。 しかし、このライブラリが放棄され、wkhtmltopdf基盤にパッチが適用されていない重大なセキュリティ脆弱性があるため、本番アプリケーションには重大なリスクが生じます。
現在Rotativaを使用しているチームにとって、セキュリティの脆弱性、MVCのみのアーキテクチャー、時代遅れのレンダリング機能の組み合わせは、代替案を評価する説得力のある理由となります。 2026年に.NET 10とC# 14をターゲットとする新しいプロジェクトでは、Rotativaのアーキテクチャは、Razor Pages、Blazor、最小限のAPIなどの最新のパターンをサポートすることはできません。
IronPDFは最新のChromiumレンダリングエンジン、クロスプラットフォームの.NET互換性、アクティブなメンテナンス、そしてRotativaが提供しなかった包括的なPDF操作機能により、これらの制限に対応します。 RotativaからIronPDFへの移行は、主にMVCアクションの結果を直接ChromePdfRenderer呼び出しに置き換え、ヘッダーとフッターのプレースホルダーの構文を更新します。
実装ガイダンスについては、IronPDF ASP.NET Core チュートリアルと、最新の.NETアプリケーションのためのPDF生成パターンをカバーするドキュメントをご覧ください。