Altbilgi içeriğine atla
GEçIş KıLAVUZLARı

Rotativa'dan IronPDF'e C# ile Nasıl Geçilir

Rotativa'dan IronPDF'e geçiş, kritik güvenlik açıklarını ele alırken PDF oluşturma iş akışınızı modernize eder. Bu kılavuz, terk edilmiş wkhtmltopdf bağımlılığını ortadan kaldıran, modern CSS ve JavaScript desteğini etkinleştiren ve ASP.NET MVC'nin ötesinde çapraz platform uyumluluğu sağlayan tamamen adım adım bir geçiş yolu sunar.

Rotativa'dan IronPDF'e Neden Geçilmeli

Rotativa'yı Anlama

Rotativa, C#'da PDF oluşturmak için uzun süredir geliştiriciler arasında popüler bir seçim olmuştur. İçeriği PDF formatına dönüştürmek için wkhtmltopdf aracını kullanır. Rotativa, özellikle ASP.NET MVC uygulamaları için tasarlanmış açık kaynaklı bir kütüphanedir. Ancak, önemli bir izleyici kitlesi edinmesine rağmen, Rotativa'nın eski bir teknoloji yığınına dayandığı gerçeği, her geliştirici için hemen belirgin olmayabilecek zorluklar sunar.

Rotativa'nın temeli, PDF oluşturmayı ASP.NET MVC projelerine entegre etmenin basit bir yolunu sağlar ve arka plan fonksiyonları için wkhtmltopdf'i kullanır.

Kritik Güvenlik Danışmanlığı

Rotativa, yamalanmamış KRİTİK GÜVENLİK AÇIKLARINA sahip wkhtmltopdf'u çevreler.

Nitelik Değer
CVE ID CVE-2022-35583
Ciddiyet KRİTİK (9.8/10)
Saldırı Vektörü
Durum Sabit sürüm yok (wkhtmltopdf binary arşivlendi)
Etkilenen TümRotativasürümleri wkhtmltopdf 0.12.6 ile paketlenmiştir

wkhtmltopdf GitHub deposu, 2 Ocak 2023'te arşivlendi (yalnızca okuma). Bakıcının durum sayfası projeye Qt 4 (2015 yılından beri desteklenmiyor) ve 2012'den bir WebKit dalına bağımlı olduğunu belirtir ve açıkça güvensiz HTML ile kullanımı konusunda uyarır. CVE-2022-35583'un sabit bir sürümü yok, bu yüzden, HTML girdileri tamamen temizlenmiş olmadıkçaRotativakullanan herhangi bir uygulama maruz kalır.

Saldırının Çalışma Şekli


<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

Etkisi:

  • AWS/Azure/GCP bulut meta verisi uç noktalarına erişim
  • İç API verileri ve kimlik bilgilerini çalma
  • İç ağları port tarama
  • Gizli yapılandırmanın dışa aktarılması

Teknoloji Krizi

Rotativa, wkhtmltopdf'u çevreliyor, bu da şunları kullanıyor:

  • Qt WebKit 4.8 (2012'den)
  • Flexbox desteği yok
  • CSS Grid desteği yok
  • Kırık JavaScript çalışması
  • ES6+ desteği yok

Rotativavs IronPDF Karşılaştırması

Özellik Rotativa IronPDF
Proje Uyumluluğu Yalnızca ASP.NET MVC Herhangi bir .NET Proje Türü (MVC, Razor Pages, Blazor vb.)
Bakım Terkedilmiş Aktif olarak korunur
Güvenlik wkhtmltopdf bağımlılıkları nedeniyle savunmasız (CVE-2022-35583) Düzenli güncellemeler ve güvenlik yamaları
HTML İşleme Eski WebKit Modern Krom
CSS3 Kısmi Desteklenen
Flexbox/Grid Desteklenmiyor Desteklenen
JavaScript Güvensiz Tam ES6+
Razor Pages Desteklenmiyor Desteklenen
Blazor Desteklenmiyor Desteklenen
PDF Manipülasyonu Mevcut değil Tam
Dijital İmzalar Mevcut değil Tam
PDF/A Uyumlu Mevcut değil Tam
Async/Await Yalnızca senkronize Tam asenkron
Açık Kaynak Evet, MIT Lisansı Hayır, Ticari Lisans

Modern .NET sürümlerini hedefleyen ekipler için, IronPDF, Rotativa'nın sunamadığı modern Chromium renderleme ve çapraz platform desteği sunar.


Başlamadan Önce

Ön Koşullar

  1. .NET Ortamı: .NET Framework 4.6.2+ veya .NET Core 3.1+ / .NET 5/6/7/8/9+
  2. NuGet Erişimi: NuGet paketlerini yükleyebilme
  3. IronPDF Lisansı: Lisans anahtarınızı ironpdf.com adresinden edinin

NuGet Paket Değişiklikleri

Orijinal Rotativa paketi, klasik ASP.NET MVC 5'i hedefler (son sürüm v1.7.3, 29.09.2017). Topluluk çatalı Rotativa.AspNetCore (webgio) 06.11.2024 tarihinde v1.4.0'a ulaştı ve .NET Core 3.1'den .NET 8'e kadar destekler — ancak her iki paket de hâlâ wkhtmltopdf 0.12.6 ikili dosyasını içerir (son üst akış sürümü Haziran 2020).

# 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 İkiliklerini Kaldırma

Bu dosyaları projenizden silin:

  • wkhtmltopdf.exe
  • wkhtmltox.dll
  • Herhangi bir Rotativa/ klasörleri

Bunlar CVE-2022-35583'ün kaynağıdır. IronPDF'nin yerel ikiliklere ihtiyacı yok.

Lisans Yapılandırması

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

Tam API Referansı

Ad Alanı Değişiklikleri

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

Çekirdek Sınıf Eşlemeleri

RotativaSınıfı IronPDF Eşdeğeri
ViewAsPdf ChromePdfRenderer
ActionAsPdf ChromePdfRenderer.RenderUrlAsPdf()
UrlAsPdf ChromePdfRenderer.RenderUrlAsPdf()
Orientation enum PdfPaperOrientation enum
Size enum PdfPaperSize enum

Sayfa Yer Tutucu Dönüşümü

RotativaYer Tutucu IronPDF Yer Tutucu
[page] {page}
[topage] {total-pages}
[date] {date}
[time] {time}
[title] {html-title}
[sitepage] {url}

Kod Göç Örnekleri

Örnek 1: HTML'den PDF'ye Dönüştürme

Önce (Rotativa):

// NuGet: Install-Package Rotativa.AspNetCore
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.AspNetCore
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

Sonrası (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
$vbLabelText   $csharpLabel

Bu örnek, temel yapısal farkı gösterir. Rotativa, ASP.NET MVC çerçevesine bağlı kalarak, bir MVC controller eyleminden ViewAsPdf sonucu döndürmenizi gerektirir. Bu model yalnızca MVC istek hattı içinde çalışır ve işlemek için bir Razor görünümü gerektirir.

IronPDF, her yerde çalışır: konsol uygulamaları, web API'leri, Blazor, Razor Pages veya herhangi bir .NET proje türü. Bir HTML dizgesi ile RenderHtmlAsPdf() çağırırsınız ve sonucu kaydedersiniz. MVC kontrolcü gerekmez, görünüm bağımlılığı yoktur. Kapsamlı örnekler için HTML'den PDF'e dönüşüm belgelerine bakın.

Örnek 2: URL'den PDF'ye Dönüştürme

Önce (Rotativa):

// NuGet: Install-Package Rotativa.AspNetCore
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.AspNetCore
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

Sonrası (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

Rotativa'nın UrlAsPdf sınıfı, bir MVC controller'ından ActionResult döndürülmesini gerektirir. IronPDF'in RenderUrlAsPdf() yöntemi herhangi bir bağlamdan çağrılabilir ve doğrudan bir PdfDocument nesnesi döner. URL işleme, wkhtmltopdf'un savunmasız ve eski WebKit motoru yerine modern Chromium kullanır. Daha fazla bilgiyi eğitimlerimizde öğrenebilirsiniz.

Örnek 3: Sayfa Numaraları ile Başlıklar ve Alt Bilgiler

Önce (Rotativa):

// NuGet: Install-Package Rotativa.AspNetCore
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,
                // Margins(top, right, bottom, left)
                PageMargins = new Margins(20, 10, 20, 10),
                CustomSwitches = "--header-center \"Page Header\" --footer-center \"Page [page] of [topage]\""
            };
        }
    }
}
// NuGet: Install-Package Rotativa.AspNetCore
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,
                // Margins(top, right, bottom, left)
                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,
                ' Margins(top, right, bottom, left)
                .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

Sonrası (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
$vbLabelText   $csharpLabel

Rotativa, komut satırı argümanlarını wkhtmltopdf'e iletmek, üst bilgi ve alt bilgi yapılandırmaları için [page] ve [topage] gibi yer tutucu kullanarak CustomSwitches kullanır. Bu dizge tabanlı yaklaşım hata eğilimlidir ve derleme zamanında doğrulama yapmak zordur.

IronPDF, CenterText ve DrawDividerLine gibi özelliklere sahip güçlü bir şekilde yazılmış TextHeaderFooter nesnelerini kullanır. Yer tutucu söz dizimi [page]'den {page}'ye ve [topage]'den {total-pages}'ye değişir. Yazılmış özellikler IntelliSense, derleme zamanında kontrol ve yazım hatası riski olmadan sağlar.


Yalnızca MVC Mimari Sorunu

Rotativa, ASP.NET MVC 5 ve öncekiler için tasarlanmıştır:

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

IronPDF, görünüm işleme ile PDF oluşturma arasını ayırır, bu aslında daha esnektir—sadece MVC görünümleri değil, herhangi bir HTML'yi işleyebilirsiniz.


Async Pattern Göçü

Rotativa ipliği engeller;IronPDF tam async/await desteği sağlar:

// ❌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- Tam asenkron 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- Tam asenkron 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 System.Threading.Tasks
Imports IronPdf

' ❌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- Tam asenkron 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
$vbLabelText   $csharpLabel

Geçiş Sonrası Yeni Özellikler

IronPDF'e geçtikten sonra Rotativa'nın sağlayamayacağı kapasiteleri kazanırsınız:

PDF Birleştirme

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

Dijital İmzalar

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

Şifre Koruma

pdf.SecuritySettings.UserPassword = "secret";
pdf.SecuritySettings.UserPassword = "secret";
pdf.SecuritySettings.UserPassword = "secret"
$vbLabelText   $csharpLabel

Filigranlar

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

PDF/A Arşiv Uyumluluğu

pdf.SaveAsPdfA("archive.pdf", PdfAVersions.PdfA3b);
pdf.SaveAsPdfA("archive.pdf", PdfAVersions.PdfA3b);
pdf.SaveAsPdfA("archive.pdf", PdfAVersions.PdfA3b)
$vbLabelText   $csharpLabel

Modern CSS Desteği

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

Geçiş Kontrol Listesi

Öncesi-Geçiş

  • Kod tabanındaki tümRotativakullanımlarını tespit edin
  • RenderingOptions'a dönüştürme için kullanılan CustomSwitches belgelenmesi
  • Dönüştürme için üst bilgi/alt bilgi yer tutucu söz dizimine dikkat edin ([page]{page})
  • ironpdf.com adresinden IronPDF lisans anahtarını edinin

Paket Değişiklikleri

  • Rotativa ve Rotativa.AspNetCore NuGet paketlerini kaldırın
  • wkhtmltopdf ikili dosyalarını silin (wkhtmltopdf.exe, wkhtmltox.dll)
  • IronPdf NuGet paketini yükleyin

Kod Değişiklikleri

  • Ad alanı içe aktarımlarını güncelleyin (using Rotativa;using IronPdf;)
  • ViewAsPdf'yi ChromePdfRenderer + RenderHtmlAsPdf() ile değiştirin
  • UrlAsPdf'yi RenderUrlAsPdf() ile değiştirin
  • CustomSwitches'yi RenderingOptions özelliklerine dönüştürün
  • Yer tutucu söz dizimini güncelleyin ([page]{page}, [topage]{total-pages})
  • PageMargins'yi bireysel MarginRight ile değiştirin
  • Uygun yerlerde asenkron kalıba geçiş yapın
  • Uygulama başlangıcında lisans başlatma ekle

Geçiş Sonrası

  • Tüm PDF oluşturmanın doğru çalıştığını doğrulayın
  • PDF çıktı kalitesini karşılaştırın (Chromium daha doğru şekilde işler)
  • CSS işleme iyileştirmelerini doğrulayın (Artık Flexbox/Grid çalışır)
  • JavaScript çalışmasını test edin (artık Chromium ile güvenilir)
  • Güvenlik taramasının geçtiğini doğrulayın (artıkCVE-2022-35583bayrakları yok)
  • wkhtmltopdf kurulumunu kaldırmak için Docker yapılandırmalarını güncelleyin

Lütfen dikkate alınRotativa ve wkhtmltopdf, ilgili sahiplerinin tescilli markalarıdır. Bu site,Rotativaveya wkhtmltopdf ile ilişkili, onaylı veya destekli değildir. Tüm ürün adları, logolar ve markalar kendi sahiplerine aittir. Karşılaştırmalar, yalnızca bilgilendirme amaçlıdır ve yazı sırasında halka açık bilgilerle alakalı olarak yansıtılmaktadır.

Curtis Chau
Teknik Yazar

Curtis Chau, Bilgisayar Bilimleri alanında Lisans Derecesine (Carleton Üniversitesi) sahip ve Node.js, TypeScript, JavaScript ve React konularında uzmanlaşmış ön uç geliştirmeyle ilgileniyor. Sezgisel ve estetik açıdan hoş kullanıcı arayüzleri oluşturma tutkunu, Curtis modern çerçevelerle çalışmayı ve iyi yapı...

Daha Fazla Oku

Iron Destek Ekibi

Haftada 5 gün, 24 saat çevrimiçiyiz.
Sohbet
E-posta
Beni Ara