PORóWNANIE

Rotativa vs IronPDF: Przewodnik porównania technicznego

Kiedy programiści .NET oceniają rozwiązania do generowania plików PDF,RotativaiIronPDFreprezentują zasadniczo różne podejścia, charakteryzujące się odmiennymi podstawami architektonicznymi i ścieżkami rozwoju.Rotativawykorzystuje narzędzie wkhtmltopdf do konwersji treści HTML do formatu PDF w aplikacjach ASP.NET MVC, podczas gdyIronPDFzapewnia nowoczesny silnik renderujący oparty na Chromium, kompatybilny ze wszystkimi typami projektów .NET. Niniejsze porównanie techniczne analizuje obie biblioteki pod kątem aspektów, które mają największe znaczenie dla profesjonalnych programistów i architektów podejmujących decyzje dotyczące generowania plików PDF dla aplikacji .NET w 2025 roku i później.

Zrozumienie Rotativa

Rotativa to biblioteka open source zaprojektowana specjalnie dla aplikacji ASP.NET MVC. Obejmuje narzędzie wiersza poleceń wkhtmltopdf do konwersji treści HTML do formatu PDF. Biblioteka dostarcza specyficzne dla MVC typy wyników akcji jak ViewAsPdf i UrlAsPdf, które bezpośrednio integrują się ze wzorcem kontrolera MVC.

W swej podstawowej wersjiRotativawykorzystuje silnik renderujący Qt WebKit 4.8 biblioteki wkhtmltopdf z 2012 roku. Oznacza to, że biblioteka nie może renderować nowoczesnych funkcji CSS, takich jak Flexbox czy CSS Grid, a wykonywanie kodu JavaScript jest zawodne ze względu na brak obsługi ES6+.

Ważna uwaga:Rotativaod lat nie jest aktualizowana ani utrzymywana. Podstawowy projekt wkhtmltopdf został oficjalnie porzucony w grudniu 2022 r., a osoby odpowiedziąlne za jego utrzymanie wyraźnie oświadczyły, że nie będą naprawiać luk w zabezpieczeniach. Obejmuje to CVE-2022-35583, krytyczną lukę w zabezpieczeniach typu Server-Side Request Forgery (SSRF) o poziomie zagrożenia 9,8/10.

Zrozumienie IronPDF

IronPDF zapewnia nowoczesne rozwiązanie do generowania plików PDF oparte na silniku Chromium dla aplikacji .NET. Biblioteka współpracuje z każdym typem projektu .NET, w tym z ASP.NET MVC, Razor Pages, Blazor, minimalnymi interfejsami API, aplikacjami konsolowymi i projektami desktopowymi.

ArchitekturaIronPDFoddziela renderowanie HTML od generowania plików PDF, zapewniając programistom większą elastyczność w projektowaniu struktury aplikacji. Klasa ChromePdfRenderer obsługuje wszystkie operacje konwersji z pełnym wsparciem dla współczesnego CSS3, JavaScript ES6+ oraz wzorców async/await.

Porównanie zabezpieczeń

Poziom bezpieczeństwa tych bibliotek znacznie się różni:

Ryzyko Rotativa IronPDF
CVE-2022-35583 (SSRF) Podatny na ataki Chronione
Lokalny dostęp do plików Podatny na ataki Odizolowany
Dostęp do sieci wewnętrznej Podatny na ataki Ograniczone
Poprawki bezpieczeństwa Nigdy (porzucone) Regularne aktualizacje
Aktywny rozwój Porzucony Comiesięczne wydania

Luka CVE-2022-35583 umożliwia atakującym dostęp do wewnętrznych zasobów sieciowych, punktów końcowych metadanych w chmurze oraz poufnych ustawień konfiguracyjnych za pośrednictwem spreparowanej treści HTML. Ponieważ wkhtmltopdf nigdy nie zostanie załatany, każda aplikacja korzystająca zRotativapozostaje na stałe narażona na tę krytyczną lukę.

Zgodność projektu

Największym ograniczeniem Rotativy jest jej wyłączna koncentracja na ASP.NET MVC:

Funkcja Rotativa IronPDF
ASP.NET MVC Tak Tak
Razor Pages Nieobsługiwane Obsługiwane
Blazor Nieobsługiwane Obsługiwane
Minimalne interfejsy API Nieobsługiwane Obsługiwane
Aplikacje konsolowe Nieobsługiwane Obsługiwane
Aplikacje desktopowe Nieobsługiwane Obsługiwane

Rotativa została zaprojektowana dla ASP.NET MVC 5 i wcześniejszych wersji, opierając się na wzorcu wyników akcji kontrolera. Taka architektura sprawia, że nie nadaje się ona do nowoczesnych aplikacji .NET Core wykorzystujących Razor Pages, Blazor lub minimalne interfejsy API.

Konwersja HTML do PDF

Wzorce kodu służące do konwersji HTML na PDF ujawniają fundamentalne różnice architektoniczne.

Konwersja HTML Rotativa

Rotativa wymaga kontekstu kontrolera MVC i wykorzystuje wzorce wyników akcji:

// 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>";

            //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 RotativaExample
{
    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
$vbLabelText   $csharpLabel

PodejścieRotativałączy generowanie plików PDF z widokami i kontrolerami MVC. Wynik akcji ViewAsPdf renderuje widok Razor i konwertuje go do PDF, ale nie może akceptować surowych ciągów HTML bez widoku.

Konwersja HTML w IronPDF

IronPDF zapewnia bezpośrednią konwersję ciągów znaków HTML bez konieczności stosowania kontekstu MVC:

// 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
$vbLabelText   $csharpLabel

Metoda RenderHtmlAsPdf akceptuje bezpośrednio zawartość HTML, umożliwiając generowanie plików PDF z dowolnego kontekstu aplikacji — aplikacji konsolowych, usług działających w tle lub aplikacji internetowych dowolnego typu.

Konwersja adresów URL do formatu PDF

Konwersja aktywnych stron internetowych do formatu PDF pokazuje, w jaki sposób każda biblioteka obsługuje nawigację i renderowanie.

Konwersja adresów URL 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()
        {
            //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 RotativaExample
{
    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
$vbLabelText   $csharpLabel

Typ wyniku UrlAsPdf wRotativawymaga kontekstu kontrolera MVC i zwraca wynik akcji. Należy pamiętać, że renderowanie adresów URL za pomocą wkhtmltopdf naraża system na lukę SSRF, umożliwiając atakującym potencjalny dostęp do zasobów sieci wewnętrznej.

Konwersja adresów URL w 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
$vbLabelText   $csharpLabel

Metoda RenderUrlAsPdf firmyIronPDFdziała niezależnie od jakiegokolwiek frameworka internetowego, z wbudowanymi ograniczeniami bezpieczeństwa, które zapobiegają atakom SSRF.

Implementacja nagłówków i stopek

Nagłówki i stopki dokumentów pokazują istotne różnice w projektowaniu API.

Nagłówki i stopki Rotativa

Rotativa wykorzystuje przełączniki wiersza poleceń przekazywane jako ciągi znaków:

// 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
$vbLabelText   $csharpLabel

Właściwość CustomSwitches przekazuje surowe argumenty wiersza poleceń do wkhtmltopdf. Takie podejście nie zapewnia bezpieczeństwa typów, obsługi IntelliSense ani sprawdzania w czasie kompilacji. Błędy w składni switch pojawiają się dopiero w czasie wykonywania.

Nagłówki i stopki IronPDF

IronPDF udostępnia właściwości typowane do konfiguracji nagłówków i stopek:

// 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
$vbLabelText   $csharpLabel

Klasa TextHeaderFooter firmyIronPDFzapewnia obsługę IntelliSense, sprawdzanie typów w czasie kompilacji oraz przejrzyste nazwy właściwości. Składnia symboli zastępczych różni się:Rotativaużywa [page] i [toPage], podczas gdyIronPDFużywa {page} i {total-pages}.

Odnośnik do składni symboli zastępczych

Rotativa Placeholder IronPDF Placeholder
[page] {page}
[topage] {total-pages}
[date] {date}
[time] {time}
[title] {html-title}
[sitepage] {url}

Tabela porównawcza funkcji

Funkcja Rotativa IronPDF
Bezpieczeństwo Krytyczne luki CVE (niezałatane) Brak luk w zabezpieczeniach
Renderowanie HTML Przestarzały WebKit (2012) Nowoczesny Chromium
CSS3 Częściowe wsparcie Obsługiwane
Flexbox/Grid Nieobsługiwane Obsługiwane
JavaScript Niewiarygodne Pełna obsługa ES6+
ASP.NET Core Ograniczone porty Wsparcie native
Razor Pages Nieobsługiwane Obsługiwane
Blazor Nieobsługiwane Obsługiwane
Manipulacja plikami PDF Niedostępne Obsługiwane
Podpisy cyfrowe Niedostępne Obsługiwane
Zgodność z PDF/A Niedostępne Obsługiwane
Async/Await Tylko synchroniczne Pełna asynchroniczność
Aktywna konserwacja Porzucony Cotygodniowe aktualizacje

Przewodnik po mapowaniu API

Zespoły oceniające migrację zRotativadoIronPDFmogą skorzystać z poniższego zestawienia równoważnych operacji:

KlasaRotativa OdpowiednikIronPDF
ViewAsPdf ChromePdfRenderer
ActionAsPdf ChromePdfRenderer.RenderUrlAsPdf()
UrlAsPdf ChromePdfRenderer.RenderUrlAsPdf()
Orientation enum PdfPaperOrientation enum
Size enum PdfPaperSize enum
Margins RenderingOptions.Margin*
CustomSwitches RenderingOptions.*

Problem z wątkami

Rotativa dziedziczy ograniczenia wkhtmltopdf dotyczące wątków:

//Rotativa- Blocks the thread
public ActionResult GeneratePdf()
{
    return new ViewAsPdf("Report");
    // This blocks the request thread until PDF is complete
    // Poor scalability under load
}
//Rotativa- Blocks the thread
public ActionResult GeneratePdf()
{
    return new ViewAsPdf("Report");
    // This blocks the request thread until PDF is complete
    // Poor scalability under load
}
'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
$vbLabelText   $csharpLabel

IronPDF zapewnia pełną obsługę asynchroniczną:

//IronPDF- Pełna asynchroniczność 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- Pełna asynchroniczność 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
}
Imports IronPdf

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
$vbLabelText   $csharpLabel

Wzorce wyłącznie synchroniczne wRotativablokują wątki żądań, co ogranicza skalowalność aplikacji pod obciążeniem. Obsługa trybu asynchronicznego wIronPDFumożliwia lepsze wykorzystanie zasobów w scenariuszach o dużej przepustowości.

Kwestie związane z wdrożeniem

Rotativa wymaga zarządzania plikami binarnymi wkhtmltopdf w różnych środowiskach wdrożeniowych:

  • Różne pliki binarne dla platform x86/x64/Linux/Mac
  • Ręczna konfiguracja środowiska PATH
  • Luki w zabezpieczeniach we wszystkich wersjach binarnych
  • Obrazy Docker muszą zawierać instalację wkhtmltopdf

IronPDF upraszcza wdrażanie dzięki pakietom NuGet bez konieczności zewnętrznego zarządzania plikami binarnymi.

Kiedy zespoły rozważają migrację do Rotativa

Kilka czynników skłania zespoły programistów do rozważenia alternatyw dla Rotativa:

Wymagania bezpieczeństwa stają się krytyczne, gdy skanery podatności wykrywają lukę CVE-2022-35583. Ponieważ wkhtmltopdf nigdy nie zostanie załatany, organizacje podlegające audytom bezpieczeństwa lub wymógom zgodności muszą odejść od Rotativa.

Wdrażanie nowoczesnego .NET powoduje niekompatybilność, gdy zespoły przechodzą na Razor Pages, Blazor lub minimalne API. ArchitekturaRotativaoparta wyłącznie na MVC nie obsługuje tych nowoczesnych wzorców.

Ograniczenia renderowania CSS wpływają na jakość dokumentu, gdy w projektach wykorzystuje się Flexbox lub CSS Grid. Przestarzały silnik WebKit firmyRotativaz 2012 roku nie jest w stanie poprawnie renderować tych układów.

Niezawodność JavaScriptu wpływa na dynamiczne renderowanie treści. Złożony kod JavaScript działający w przeglądarkach często nie działa lub jest wyświetlany nieprawidłowo ze względu na ograniczoną obsługę JavaScript przez wkhtmltopdf.

Skalowalność asynchroniczna ma znaczenie w przypadku aplikacji o dużej przepustowości. Wzorzec wyłącznie synchroniczny Rotivaty blokuje wątki, podczas gdyIronPDFobsługuje pełną funkcję async/await w celu lepszego wykorzystania zasobów.

Zalety i kompromisy

Atuty Rotativa

  • Prosta integracja z MVC dla podstawowych przypadków użycia
  • Oprogramowanie open source (licencja MIT)
  • Znany wzorzec dla starszych aplikacji MVC
  • Brak kosztów licencji komercyjnych

Ograniczenia Rotativa

  • Tylko ASP.NET MVC — bez Razor Pages, Blazor ani minimalnych interfejsów API
  • Porzucone — brak aktualizacji i konserwacji
  • Krytyczne luki w zabezpieczeniach, które nigdy nie zostaną załatane
  • Przestarzały silnik renderujący WebKit (2012)
  • Brak obsługi Flexbox lub CSS Grid
  • Niewiarygodne wykonywanie kodu JavaScript
  • Tylko synchroniczne — słaba skalowalność
  • Brak możliwości edycji plików PDF
  • Brak podpisów cyfrowych ani zgodności z formatem PDF/A

Atuty IronPDF

  • Działa z każdym typem projektu .NET
  • Nowoczesny silnik renderujący Chromium z pełną obsługą CSS3/JavaScript
  • Aktywnie utrzymywany z regularnymi aktualizacjami zabezpieczeń
  • Pełna obsługa async/await
  • Kompleksowe funkcje obróbki plików PDF
  • Podpisy cyfrowe i bezpieczeństwo
  • Zgodność z formatem archiwizacji PDF/A
  • Profesjonalne wsparcie i dokumentacja

Uwagi dotyczące IronPDF

  • Komercyjny model licencjonowania
  • Wymaga inicjalizacji klucza licencyjnego

Wnioski

Rotativa zapewniała proste rozwiązanie do generowania plików PDF w aplikacjach ASP.NET MVC, gdy była aktywnie utrzymywana. Jednak zaprzestanie rozwoju biblioteki w połączeniu z krytycznymi, niezałatanymi lukami w zabezpieczeniach jej podstawy wkhtmltopdf stwarza poważne ryzyko dla aplikacji produkcyjnych.

Dla zespołów korzystających obecnie z Rotativy połączenie luk w zabezpieczeniach, architektury opartej wyłącznie na MVC oraz przestarzałych możliwości renderowania stanowi istotny powód do rozważenia alternatywnych rozwiązań. W przypadku nowych projektów opartych na .NET 10 i C# 14 w 2026 r. architekturaRotativanie będzie w stanie obsługiwać nowoczesnych wzorców, takich jak Razor Pages, Blazor czy minimalne interfejsy API.

IronPDF rozwiązuje te ograniczenia dzięki nowoczesnemu silnikowi renderowania Chromium, kompatybilności z platformą .NET, aktywnej konserwacji oraz wszechstronnym możliwościom manipulacji plikami PDF, którychRotativanigdy nie oferowała. Ścieżka migracji zRotativadoIronPDFgłównie polega na zastąpieniu wyników akcji MVC bezpośrednimi wywołaniami ChromePdfRenderer oraz aktualizacji składni symboli zastępczych w nagłówkach i stopkach.


Aby uzyskać wskazówki dotyczące wdrożenia, zapoznaj się z samouczkiem IronPDF ASP.NET Core oraz dokumentacją dotyczącą wzorców generowania plików PDF dla nowoczesnych aplikacji .NET Core.