C#でRotativaからIronPDFに移行する方法
RotativaからIronPDFへの移行は、PDF生成のワークフローを近代化すると同時に、重要なセキュリティの脆弱性に対処します。 このガイドは、放棄されたwkhtmltopdf依存性を排除し、最新のCSSとJavaScriptのサポートを可能にし、ASP.NET MVCを超えるクロスプラットフォームの互換性を提供する、完全で段階的な移行パスを提供します。
なぜRotativaからIronPDFへ移行するのか
Rotativaについて
Rotativaは、C#でPDFを生成するための開発者の間で長い間人気のある選択肢です。 これは、wkhtmltopdf ツールを利用して HTML コンテンツを PDF 形式に変換します。 Rotativaは、ASP.NET MVCアプリケーションのために特別に設計されたオープンソースのライブラリです。 しかし、Rotativaは多くの読者を惹きつける一方で、時代遅れの技術スタックに依存しているため、すべての開発者がすぐに理解できるとは限らないという課題があります。
Rotativa は、バックエンド機能に wkhtmltopdf を利用して、PDF 生成をASP.NET MVC プロジェクトに統合する簡単な方法を提供します。
重要なセキュリティ勧告
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" />
インパクト:
- 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(JavaScript | 信頼できない | 完全なES6 |
| Razorページ | サポートされていません | サポート対象 |
| 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からライセンスキーを取得します。
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
wkhtmltopdfバイナリの削除
プロジェクトからこれらのファイルを削除してください:
wkhtmltopdf.exewkhtmltox.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";
' Add in Program.vb or Startup.vb
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
完全な 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;
' Before: Rotativa
Imports Rotativa
Imports Rotativa.Options
Imports Rotativa.AspNetCore
' After: IronPDF
Imports IronPdf
Imports IronPdf.Rendering
コア クラス マッピング
| Rotativa クラス | IronPDF 同等物 |
|---|---|
ViewAsPdf |
ChromePdfRenderer |
ActionAsPdf |
ChromePdfRenderer.RenderUrlAsPdf() |
UrlAsPdf |
ChromePdfRenderer.RenderUrlAsPdf() |
Orientation 列挙型 |
PdfPaperOrientation 列挙型 |
Size 列挙型 |
PdfPaperSize 列挙型 |
ページのプレースホルダーの変換
| Rotativa プレースホルダ | IronPDF プレースホルダー |
|---|---|
[page] |
{page} |
[topage] |
{total-pages} |
[date] |
{date} |
[time] |
{time} |
[title] |
{html-title} |
[sitepage] |
{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
};
}
}
}
Imports Microsoft.AspNetCore.Mvc
Imports Rotativa.AspNetCore
Imports System.Threading.Tasks
Namespace RotativaExample
Public Class PdfController
Inherits Controller
Public Async Function GeneratePdf() As Task(Of IActionResult)
Dim htmlContent As String = "<h1>Hello World</h1><p>This is a PDF document.</p>"
' ロータティバ requires returning a ViewAsPdf result from MVC controller
Return New ViewAsPdf() With {
.ViewName = "PdfView",
.PageSize = Rotativa.AspNetCore.Options.Size.A4
}
End Function
End Class
End Namespace
翻訳後(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!");
}
}
}
Imports IronPdf
Imports System
Namespace IronPdfExample
Class Program
Shared Sub Main(ByVal args As String())
Dim renderer = New ChromePdfRenderer()
Dim htmlContent = "<h1>Hello World</h1><p>This is a PDF document.</p>"
Dim pdf = renderer.RenderHtmlAsPdf(htmlContent)
pdf.SaveAs("output.pdf")
Console.WriteLine("PDF generated successfully!")
End Sub
End Class
End Namespace
この例は、基本的なアーキテクチャの違いを示しています。ロータティバでは、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
};
}
}
}
Imports Microsoft.AspNetCore.Mvc
Imports Rotativa.AspNetCore
Imports System.Threading.Tasks
Namespace RotativaExample
Public Class UrlPdfController
Inherits Controller
Public Async Function ConvertUrlToPdf() As Task(Of IActionResult)
'ロータティバworks within MVC framework and returns ActionResult
Return New UrlAsPdf("https://www.example.com") With {
.FileName = "webpage.pdf",
.PageSize = Rotativa.AspNetCore.Options.Size.A4,
.PageOrientation = Rotativa.AspNetCore.Options.Orientation.Portrait
}
End Function
End Class
End Namespace
翻訳後(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!");
}
}
}
Imports IronPdf
Imports System
Namespace IronPdfExample
Class Program
Shared Sub Main(ByVal args As String())
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderUrlAsPdf("https://www.example.com")
pdf.SaveAs("webpage.pdf")
Console.WriteLine("URL converted to PDF successfully!")
End Sub
End Class
End Namespace
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]\""
};
}
}
}
Imports Microsoft.AspNetCore.Mvc
Imports Rotativa.AspNetCore
Imports Rotativa.AspNetCore.Options
Imports System.Threading.Tasks
Namespace RotativaExample
Public Class HeaderFooterController
Inherits Controller
Public Async Function GeneratePdfWithHeaderFooter() As Task(Of IActionResult)
Return New ViewAsPdf("Report") With {
.PageSize = Size.A4,
.PageMargins = New Margins(20, 10, 20, 10),
.CustomSwitches = "--header-center ""Page Header"" --footer-center ""Page [page] of [toPage]"""
}
End Function
End Class
End Namespace
翻訳後(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!");
}
}
}
Imports IronPdf
Imports IronPdf.Rendering
Imports System
Namespace IronPdfExample
Class Program
Shared Sub Main(ByVal args As String())
Dim renderer = New ChromePdfRenderer()
renderer.RenderingOptions.TextHeader = New TextHeaderFooter() With {
.CenterText = "Page Header",
.DrawDividerLine = True
}
renderer.RenderingOptions.TextFooter = New TextHeaderFooter() With {
.CenterText = "Page {page} of {total-pages}",
.DrawDividerLine = True
}
Dim htmlContent = "<h1>Report Title</h1><p>Report content goes here.</p>"
Dim pdf = renderer.RenderHtmlAsPdf(htmlContent)
pdf.SaveAs("report.pdf")
Console.WriteLine("PDF with headers and footers created successfully!")
End Sub
End Class
End Namespace
Rotativa は、CustomSwitches を使用して、[page] や [toPage] などのプレースホルダーを使用したヘッダーとフッターの構成を含むコマンドライン引数を 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
Imports System.Web.Mvc
Public Class InvoiceController
Inherits Controller
Public Function InvoicePdf(id As Integer) As ActionResult
Dim model = GetInvoice(id)
Return New ViewAsPdf("Invoice", model) ' Tied to MVC Views
End Function
End Class
' Problems:
' - No Razor Pages support
' - No Blazor support
' - No minimal APIs support
' - No ASP.NET Core native integration
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
}
' ❌ロータティバ- Blocks the thread
Public Function GeneratePdf() As ActionResult
Return New ViewAsPdf("Report")
' This blocks the request thread until PDF is complete
' Poor scalability under load
End Function
' ✅IronPDF-完全な非同期support
Public Async Function GeneratePdf() As Task(Of IActionResult)
Dim renderer As New ChromePdfRenderer()
Dim pdf = Await renderer.RenderHtmlAsPdfAsync(html)
Return File(pdf.BinaryData, "application/pdf")
' Non-blocking, better scalability
End Function
移行後の新機能
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");
Dim merged = PdfDocument.Merge(pdf1, pdf2, pdf3)
merged.SaveAs("complete.pdf")
デジタル署名
var signature = new PdfSignature("certificate.pfx", "password");
pdf.Sign(signature);
var signature = new PdfSignature("certificate.pfx", "password");
pdf.Sign(signature);
Dim signature = New PdfSignature("certificate.pfx", "password")
pdf.Sign(signature)
パスワード保護
pdf.SecuritySettings.UserPassword = "secret";
pdf.SecuritySettings.UserPassword = "secret";
pdf.SecuritySettings.UserPassword = "secret"
ウォーターマーク
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
PDF/Aアーカイブ準拠
pdf.SaveAsPdfA("archive.pdf", PdfAVersions.PdfA3b);
pdf.SaveAsPdfA("archive.pdf", PdfAVersions.PdfA3b);
pdf.SaveAsPdfA("archive.pdf", PdfAVersions.PdfA3b)
最新の 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!
' This now works (broke in Rotativa)
Dim html As String = "
<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>"
Dim pdf = renderer.RenderHtmlAsPdf(html) ' Works!
移行チェックリスト
移行前
- コードベースでロータティバの使用箇所をすべて特定する
- RenderingOptions への変換に使用されるドキュメント CustomSwitches
- 変換のためのヘッダー/フッターのプレースホルダー構文に注意してください (
[page]→{page}) - IronPDFからIronPDFライセンスキーを取得します
パッケージの変更
RotativaおよびRotativa.AspNetCoreNuGetパッケージを削除します- wkhtmltopdf バイナリを削除します (
wkhtmltox.dll) IronPdfNuGetパッケージをインストールします
コードの変更
- 名前空間のインポートを更新します (
using Rotativa;→using IronPdf;) ViewAsPdfをChromePdfRenderer+RenderHtmlAsPdf()に置き換えますUrlAsPdfをRenderUrlAsPdf()に置き換えますCustomSwitchesをRenderingOptionsプロパティに変換します- プレースホルダー構文を更新します (
[page]→[topage]→{total-pages}) PageMarginsを個々のMarginRightに置き換えます。- 必要に応じて非同期パターンに変更する
- アプリケーションの起動時にライセンスの初期化を追加
移行後
- すべてのPDF生成が正しく機能することを確認する
- PDF出力品質の比較(Chromiumの方が正確にレンダリングされる)
- CSS レンダリングの改善を検証 (Flexbox/Grid が動作するようになりました)
- JavaScript実行をテストする (Chromium で信頼性が向上)
- セキュリティスキャンのパスを検証する(CVE-2022-35583フラグはなくなりました)
- Docker構成を更新してwkhtmltopdfのインストールを削除します

