Wie man von Rotativa zu IronPDF in C# migriert
Die Migration von Rotativa zu IronPDF behebt kritische Sicherheitslücken und modernisiert gleichzeitig Ihren PDF-Erzeugungsworkflow. Dieses Handbuch bietet einen vollständigen, schrittweisen Migrationspfad, der die verlassene wkhtmltopdf-Abhängigkeit beseitigt, Unterstützung für modernes CSS und JavaScript ermöglicht und plattformübergreifende Kompatibilität über ASP.NET MVC hinaus bietet.
Warum von Rotativa zu IronPDF migrieren
Rotativa verstehen
Rotativa ist seit langem eine beliebte Wahl unter Entwicklern für die Erstellung von PDFs in C#. Es nutzt das Tool wkhtmltopdf, um HTML-Inhalte in das PDF-Format zu konvertieren. Rotativa ist eine Open-Source-Bibliothek, die speziell für ASP.NET MVC-Anwendungen entwickelt wurde. Obwohl Rotativa ein großes Publikum angezogen hat, stellt die Tatsache, dass es sich auf eine veraltete Technologie stützt, eine Herausforderung dar, die vielleicht nicht jedem Entwickler sofort klar ist.
Im Kern bietet Rotativa eine einfache Möglichkeit, die PDF-Generierung in ASP.NET MVC-Projekte zu integrieren und nutzt dabei wkhtmltopdf für seine Backend-Funktionalitäten.
Kritischer Sicherheitshinweis
Rotativa umhüllt wkhtmltopdf, das KRITISCHE UNGESCHÜTZTE SICHERHEITSMÄNGEL aufweist.
| Attribut | Wert |
|---|---|
| CVE ID | CVE-2022-35583 |
| Schweregrad | KRITISCH (9.8/10) |
| Attack Vector | Netzwerk |
| Status | WIRD NIE GEPATCHT WERDEN |
| Betroffen | ALLE Rotativa-Versionen |
wkhtmltopdf wurde im Dezember 2022 offiziell aufgegeben. Die Betreuer haben ausdrücklich erklärt, dass sie keine Sicherheitslücken beheben werden. Jede Anwendung, die Rotativa verwendet, wird permanent offengelegt.
Wie die Attacke funktioniert
<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" />
Auswirkung:
- Zugang zu AWS/Azure/GCP-Cloud-Metadaten-Endpunkten
- Stehlen von internen API-Daten und Anmeldeinformationen
- Port-Scan interner Netzwerke
- Exfiltrieren sensibler Konfiguration
Die Technologie-Krise
Rotativa umhüllt wkhtmltopdf, das verwendet:
- Qt WebKit 4.8 (ab 2012)
- Keine Flexbox-Unterstützung
- Keine CSS-Grid-Unterstützung
- Defekte JavaScript-Ausführung
- Keine ES6+-Unterstützung
Vergleich zwischen Rotativa und IronPDF
| Feature | Rotativa | IronPDF |
|---|---|---|
| Projektkompatibilität | Nur ASP.NET MVC | Jeder .NET-Projekttyp (MVC, Razor Pages, Blazor, etc.) |
| Wartung | Aufgegeben | Aktiv gewartet |
| Sicherheit | Anfällig aufgrund von wkhtmltopdf-Abhängigkeiten (CVE-2022-35583) | Regelmäßige Updates und Sicherheitspatches |
| HTML-Rendering | Veraltetes WebKit | Modernes Chromium |
| CSS3 | Teilweise | Unterstützt |
| Flexbox/Grid | Nicht unterstützt | Unterstützt |
| JavaScript | Unzuverlässig | Vollständig ES6+ |
| Razor-Seiten | Nicht unterstützt | Unterstützt |
| Blazor | Nicht unterstützt | Unterstützt |
| PDF-Bearbeitung | Nicht verfügbar | Voll |
| Digitale Signaturen | Nicht verfügbar | Voll |
| PDF/A-Konformität | Nicht verfügbar | Voll |
| Async/Await | Nur synchron | Vollständig asynchron |
| Open Source | Ja, MIT-Lizenz | Nein, kommerzielle Lizenz |
Für Teams, die die Einführung von .NET 10 und C# 14 bis 2025 und 2026 planen, bietet IronPDF modernes Chromium-Rendering und plattformübergreifende Unterstützung, die Rotativa nicht bieten kann.
Bevor Sie beginnen
Voraussetzungen
- .NET -Umgebung: .NET Framework 4.6.2+ oder .NET Core 3.1+ / .NET 5/6/7/8/9+
- NuGet -Zugriff: Möglichkeit zur Installation von NuGet -Paketen
- IronPDF -Lizenz: Ihren Lizenzschlüssel erhalten Sie unter IronPDF.
NuGet-Paketänderungen
# 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
Entferne wkhtmltopdf-Binärdateien
Löschen Sie diese Dateien aus Ihrem Projekt:
wkhtmltopdf.exewkhtmltox.dll- Beliebige
Rotativa/Ordner
Diese sind die Quelle von CVE-2022-35583.IronPDF benötigt keine nativen Binärdateien.
Lizenz-Konfiguration
// 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"
Komplette API-Referenz
Namensraumänderungen
// 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
Kernklassen-Zuordnungen
| Rotativa-Klasse | IronPDF-Äquivalent |
|---|---|
ViewAsPdf |
ChromePdfRenderer |
ActionAsPdf |
ChromePdfRenderer.RenderUrlAsPdf() |
UrlAsPdf |
ChromePdfRenderer.RenderUrlAsPdf() |
Orientation enum |
PdfPaperOrientation enum |
Size enum |
PdfPaperSize enum |
Seitenplatzhalter-Konvertierung
| Rotativa Platzhalter | IronPDF Platzhalter |
|---|---|
[page] |
{page} |
[topage] |
{total-pages} |
[date] |
{date} |
[time] |
{time} |
[title] |
{html-title} |
[sitepage] |
{url} |
Beispiele für die Code-Migration
Beispiel 1: Konvertierung von HTML in PDF
Vor (Rotativa):
// NuGet: Install-Package Rotativa.Core
using Microsoft.AspNetCore.Mvc;
using Rotativa.AspNetCore;
using System.Threading.Tasks;
namespace Rotativa Example
{
public class PdfController : Controller
{
public async Task<IActionResult> GeneratePdf()
{
var htmlContent = "<h1>Hello World</h1><p>This is a PDF document.</p>";
// Rotativarequires 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 Rotativa Example
{
public class PdfController : Controller
{
public async Task<IActionResult> GeneratePdf()
{
var htmlContent = "<h1>Hello World</h1><p>This is a PDF document.</p>";
// Rotativarequires 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>"
' Rotativa 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
Nach (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
Dieses Beispiel verdeutlicht den grundlegenden architektonischen Unterschied. Rotativa erfordert die Rückgabe eines ViewAsPdf Ergebnisses von einer MVC-Controller-Aktion, wodurch Sie an das ASP.NET MVC-Framework gebunden sind. Das Muster funktioniert nur innerhalb der MVC-Anfrage-Pipeline und erfordert eine Razor-Ansicht zum Rendern.
IronPDF funktioniert überall: Konsolenanwendungen, Web-APIs, Blazor, Razor Pages oder jede Art von .NET-Projekt. Sie rufen RenderHtmlAsPdf() mit einer HTML-Zeichenkette auf und speichern das Ergebnis. Kein MVC-Controller erforderlich, keine View-Abhängigkeit. Umfassende Beispiele finden Sie in der HTML to PDF Dokumentation.
Beispiel 2: Konvertierung von URL in PDF
Vor (Rotativa):
// NuGet: Install-Package Rotativa.Core
using Microsoft.AspNetCore.Mvc;
using Rotativa.AspNetCore;
using System.Threading.Tasks;
namespace Rotativa Example
{
public class UrlPdfController : Controller
{
public async Task<IActionResult> ConvertUrlToPdf()
{
// Rotativaworks 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 Rotativa Example
{
public class UrlPdfController : Controller
{
public async Task<IActionResult> ConvertUrlToPdf()
{
// Rotativaworks 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)
' Rotativa 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
Nach (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
Die Klasse UrlAsPdf von Rotativa erfordert die Rückgabe eines ActionResult von einem MVC-Controller. Die Methode RenderUrlAsPdf() von IronPDF kann aus jedem Kontext aufgerufen werden und gibt direkt ein PdfDocument-Objekt zurück. Das URL-Rendering verwendet modernes Chromium anstelle der anfälligen und veralteten WebKit-Engine von wkhtmltopdf. Erfahren Sie mehr in unseren Tutorials.
Beispiel 3: Kopf- und Fußzeilen mit Seitenzahlen
Vor (Rotativa):
// NuGet: Install-Package Rotativa.Core
using Microsoft.AspNetCore.Mvc;
using Rotativa.AspNetCore;
using Rotativa.AspNetCore.Options;
using System.Threading.Tasks;
namespace Rotativa Example
{
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 Rotativa Example
{
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
Nach (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 verwendet CustomSwitches, um Kommandozeilenargumente an wkhtmltopdf zu übergeben, einschließlich der Konfiguration von Kopf- und Fußzeilen mit Platzhaltern wie [page] und [toPage]. Dieser auf Zeichenketten basierende Ansatz ist fehleranfällig und bei der Kompilierung schwer zu validieren.
IronPDF verwendet stark typisierte TextHeaderFooter Objekte mit Eigenschaften wie CenterText und DrawDividerLine. Die Platzhaltersyntax ändert sich von [page] zu {page} und von [toPage] zu {total-pages}. Typisierte Eigenschaften bieten IntelliSense, Kompilierbarkeitsprüfung und kein Risiko von Tippfehlern.
Das Problem der MVC-Architektur
Rotativa wurde für ASP.NET MVC 5 und früher entwickelt:
// ❌ Rotativa- 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
// ❌ Rotativa- 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 trennt das Rendering von Ansichten von der PDF-Generierung, was tatsächlich flexibler ist - Sie können jede HTML-Datei rendern, nicht nur MVC-Ansichten.
Async-Muster-Migration
Rotativa blockiert das Thema;IronPDF unterstützt vollständig async/await:
// ❌ Rotativa- Blocks the thread
public ActionResult GeneratePdf()
{
return new ViewAsPdf("Report");
// This blocks the request thread until PDF is complete
// Poor scalability under load
}
// ✅IronPDF- Full async 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
}
// ❌ Rotativa- Blocks the thread
public ActionResult GeneratePdf()
{
return new ViewAsPdf("Report");
// This blocks the request thread until PDF is complete
// Poor scalability under load
}
// ✅IronPDF- Full async 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
}
' ❌ Rotativa- 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- Full async 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
Neue Funktionen nach der Migration
Nach der Umstellung auf IronPDF erhalten Sie Funktionen, die Rotativa nicht bieten kann:
PDF-Zusammenführung
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")
Digitale Signaturen
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)
Passwortschutz
pdf.SecuritySettings.UserPassword = "secret";
pdf.SecuritySettings.UserPassword = "secret";
pdf.SecuritySettings.UserPassword = "secret"
Wasserzeichen
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 Archivierungskonformität
pdf.SaveAsPdfA("archive.pdf", PdfAVersions.PdfA3b);
pdf.SaveAsPdfA("archive.pdf", PdfAVersions.PdfA3b);
pdf.SaveAsPdfA("archive.pdf", PdfAVersions.PdfA3b)
Moderne CSS-Unterstützung
// 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!
Migrations-Checkliste
Vor der Migration
- Alle Rotativa-Verwendungen im Quellcode identifizieren
- Dokument CustomSwitches, die für die Konvertierung in RenderingOptions verwendet werden
- Beachten Sie die Syntax für Kopf-/Fußzeilenplatzhalter zur Konvertierung (
[page]→{page}) - Den IronPDF Lizenzschlüssel erhalten Sie unter IronPDF
Paketänderungen
- Entfernen Sie die NuGet Pakete
RotativaundRotativa.AspNetCore - Löschen der wkhtmltopdf-Binärdateien (
wkhtmltopdf.exe,wkhtmltox.dll) - Installieren Sie das NuGet Paket
IronPdf
Code-Änderungen
- Namespace-Importe aktualisieren (
using Rotativa;→using IronPdf;) - Ersetzen Sie
ViewAsPdfdurchChromePdfRenderer+RenderHtmlAsPdf() - Ersetzen Sie
UrlAsPdfdurchRenderUrlAsPdf() - Konvertiere
CustomSwitchesinRenderingOptionsEigenschaften - Aktualisierung der Platzhaltersyntax (
[page]→{page},[topage]→{total-pages}) - Ersetzen Sie
PageMarginsdurch die einzelnen CodesMarginRight - Bei Bedarf auf das asynchrone Muster umstellen
- Lizenzinitialisierung beim Anwendungsstart hinzufügen
Nach der Migration
- Überprüfen Sie, ob die PDF-Generierung korrekt funktioniert.
- Vergleich der PDF-Ausgabequalität (Chromium rendert genauer)
- Überprüfung der Verbesserungen beim CSS-Rendering (Flexbox/Grid funktionieren jetzt)
- Test der JavaScript Ausführung (jetzt zuverlässig mit Chromium)
- Überprüfung, ob der Sicherheitsscan erfolgreich war (keine CVE-2022-35583-Flags mehr)
- Docker-Konfigurationen aktualisieren, um die Installation von wkhtmltopdf zu entfernen

