Rotativa'dan IronPDF'e C# ile Nasıl Geçilir
Rotativa'dan IronPDF'e geçiş, işlev akışınızı modernize ederek kritik güvenlik açıklarını giderir. Bu rehber, kullanım dışı kalan 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 eksiksiz, adım adım bir geçiş yolu sunar.
Neden Rotativa'dan IronPDF'e Geçin
Rotativa'yı Anlamak
Rotativa, C# dilinde PDF oluşturmak için geliştiriciler arasında uzun zamandır popüler bir seçim olmuştur. HTML içeriğini PDF formatına dönüştürmek için wkhtmltopdf aracını kullanır. Rotativa, özel olarak ASP.NET MVC uygulamaları için tasarlanmış açık kaynak kodlu bir kütüphanedir. Bununla birlikte, önemli bir kitle çekmiş olmasına rağmen, Rotativa'nın modası geçmiş bir teknoloji yığınına bağımlılığı, her geliştirici için hemen belirgin olmayabilecek zorluklar ortaya çıkarır.
Rotativa'nın temelinde, PDF oluşturmayı ASP.NET MVC projelerine entegre etmenin basit bir yolunu sağlar ve backend işlevsellikleri için wkhtmltopdf avantajından yararlanır.
Kritik Güvenlik Bildirimi
Rotativa, CRİTİK DÜZELTİLMEMİŞ GÜVENLİK AÇIKLARINA sahip olan wkhtmltopdf'i sarar.
| Özellik | Değer |
|---|---|
| CVE ID | CVE-2022-35583 |
| Şiddet | KRİTİK (9.8/10) |
| Saldırı Vektörü | Ağ |
| Durum | ASLA DÜZELTİLMEYECEK |
| Etkilenen | TÜMRotativasürümleri |
wkhtmltopdf Aralık 2022'de resmi olarak bırakıldı. Bakımcılar, güvenlik açıklarını onarmayacaklarını açıkça belirtti.Rotativakullanan her uygulama kalıcı olarak maruz kalır.
Saldırı Nasıl Çalışır?
<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" />
Etkileri:
- AWS/Azure/GCP bulut meta veri uç noktalarına erişim
- Dahili API verilerini ve kimlik bilgilerini çalmak
- Dahili ağlarda port taraması yapmak
- Hassas konfigürasyonu dışarıya aktarma
Teknoloji Krizi
Rotativa, wkhtmltopdf'i bir arayüze sarar, bu da şu teknolojileri kullanır:
- Qt WebKit 4.8 (2012'den)
- Flexbox desteği yok
- CSS Grid desteği yok
- Kırık JavaScript yürütümü
- ES6+ desteği yok
Rotativa veIronPDFKarşılaştırması
| Özellik | Rotativa | IronPDF |
|---|---|---|
| Proje Uyumluluğu | Sadece ASP.NET MVC | Herhangi bir .NET Proje Türü (MVC, Razor Pages, Blazor, vb.) |
| Bakım | Terk edilmiş | Aktif olarak destekleniyor |
| Güvenlik | wkhtmltopdf bağımlılıkları nedeniyle risk altında (CVE-2022-35583) | Düzenli güncellemeler ve güvenlik yamaları |
| HTML İşleme | Eski WebKit | Modern Chromium |
| CSS3 | Kısmen | Desteklenir |
| Flexbox/Grid | Desteklenmiyor | Desteklenir |
| JavaScript | Güvenilmez | Tam ES6+ |
| Razor Sayfaları | Desteklenmiyor | Desteklenir |
| Blazor | Desteklenmiyor | Desteklenir |
| PDF Manipulasyonu | Mevcut değil | Tam |
| Dijital İmzalar | Mevcut değil | Tam |
| PDF/A Uyumluluğu | Mevcut değil | Tam |
| Async/Await | Yalnızca eşzamanlı | Tam asenkron |
| Açık Kaynak | Evet, MIT Lisansı | Hayır, Ticari Lisans |
.NET 10 ve C# 14'ü 2025 ve 2026 boyunca benimsemeyi planlayan ekipler için IronPDF, Rotativa'nın sunamayacağı modern Chromium işleme ve çapraz platform desteği sağlar.
Başlamadan Önce
Önkoşullar
- .NET Ortamı: .NET Framework 4.6.2+ veya .NET Core 3.1+ / .NET 5/6/7/8/9+
- NuGet Erişimi: NuGet paketlerini yükleme yeteneği
- IronPDF Lisansı: Lisans anahtarınızı ironpdf.com adresinden edinin
NuGet Paket Değişiklikleri
# 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 İkili Dosyalarını Kaldır
Projeden bu dosyaları silin:
wkhtmltopdf.exewkhtmltox.dll- Herhangi bir
Rotativa/klasörleri
Bunlar, CVE-2022-35583'ün kaynağıdır.IronPDFyerel ikili dosyalara ihtiyaç duymaz.
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"
API Referansının Tamamı
Namespace 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
Temel 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 Geçiş Örnekleri
Örnek 1: HTML'den PDF'e Dönüştürme
Önce (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>";
//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
Sonra (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
Bu örnek temel mimari farkı göstermektedir. Rotativa, ASP.NET MVC frameworküne bağlı kalarak bir MVC denetleyici eyleminden ViewAsPdf sonucu döndürmeyi gerektirir. Kalıp yalnızca MVC istek hattı içinde çalışır ve görünümü render etmek 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ü. RenderHtmlAsPdf(), bir HTML dizesi ile çağrılır ve sonuç kaydedilir. MVC controller gerekmez, görünüm bağımlılığı yoktur. Kapsamlı örnekler için HTML'den PDF'e döndürme belgesine bakın.
Örnek 2: URL'den PDF'e Dönüştürme
Önce (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
Sonra (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'nın UrlAsPdf sınıfı, bir MVC denetleyicisinden ActionResult dönüşünü gerektirir. IronPDF'nin RenderUrlAsPdf() yöntemi herhangi bir bağlamdan çağrılabilir ve doğrudan bir PdfDocument nesnesi döndürür. URL render etmeye modern Chromium kullaniyor, wkhtmltopdf'in guvenligi zayif ve eski WebKit motoru yerine. Daha fazlasi icin eğitimlerimize bakin.
Örnek 3: Sayfa Numaralı Başlıklar ve Altbilgiler
Önce (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
Sonra (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, wkhtmltopdf'e komut satırı argümanları geçirmek için CustomSwitches kullanır ve yer tutucularla başlık ve altbilgi yapılandırmasını içerebilir [page] ve [toPage]. Bu dize temelli yaklasim hata yapmaya acik ve derleme zamaninda doğrulamak zordur.
IronPDF, TextHeaderFooter gibi özelliklere sahip güçlü türde CenterText ve DrawDividerLine olan nesneler kullanır. Yer tutucu sözdizimi [page]'den {page}'ye ve [toPage]'ten {total-pages}'ye değişir. Typed property'ler IntelliSense, derleme zamani kontrolu ve yazim hatasi riski olmadan gelir.
Sadece MVC Mimari Sorunu
Rotativa ASP.NET MVC 5 ve daha onceki versiyonlar icin tasarlandi:
// ❌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, gorunum render etmeyi PDF oluşturmadan ayirir, bu aslinda daha esnektir—sadece MVC gorunumleri değil, her turlu HTML'yi render edebilirsiniz.
Asenkron Desen Gocerimi
Rotativa thread'i bloklar; IronPDF, tam asenkron/await destegi saglar:
// ❌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 asenkronsupport
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 asenkronsupport
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-Tam asenkronsupport
Public Async Function GeneratePdfAsync() 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
Geçiş Sonrası Yeni Özellikler
IronPDF'ye gecerken, Rotativa'nin saglayamayacagi yetenekler kazanirsiniz:
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")
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)
Şifre Koruması
pdf.SecuritySettings.UserPassword = "secret";
pdf.SecuritySettings.UserPassword = "secret";
pdf.SecuritySettings.UserPassword = "secret"
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
PDF/A Arsivleme Uyumlulugu
pdf.SaveAsPdfA("archive.pdf", PdfAVersions.PdfA3b);
pdf.SaveAsPdfA("archive.pdf", PdfAVersions.PdfA3b);
pdf.SaveAsPdfA("archive.pdf", PdfAVersions.PdfA3b)
Modern CSS Destegi
// 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!
Goc Kontrol Listesi
Geçiş Öncesi
- Kod tabanindaki tumRotativakullanimlarini tespit edin
- RenderingOptions'a dönüştürme icin kullanilan CustomSwitches'i dokümante edin
- Dönüşüm için başlık/altbilgi yer tutucu sözdizimini not edin (
[page]→{page}) - ironpdf.com adresindenIronPDFlisans anahtarını alın
Paket Değişiklikleri
RotativaveRotativa.AspNetCoreNuGet paketlerini kaldırın- wkhtmltopdf ikili dosyalarını silin (
wkhtmltopdf.exe,wkhtmltox.dll) IronPdfNuGet paketini yükleyin
Kod Değişiklikleri
- Namespace ithalatlarını güncelleyin (
using Rotativa;→using IronPdf;) ViewAsPdf'iChromePdfRenderer+RenderHtmlAsPdf()ile değiştirinUrlAsPdf'iRenderUrlAsPdf()ile değiştirinCustomSwitches'yiRenderingOptionsözelliklerine dönüştürün- Yer tutucu sözdizimini güncelleyin (
[page]→{page},[topage]→{total-pages}) PageMargins'i bireyselMarginRightile değiştirin- Dogru oldugu yerde asenkron desene gecin
- Uygulama başlatıldığında lisans başlatma ekleyin
Geçişten Sonra
- Tüm PDF oluşturmalarinin dogru calistigini dogrulayin
- PDF cikis kalitesini karsilastirin (Chromium daha dogru render eder)
- CSS render iyilestirmelerini dogrulayin (Flexbox/Grid simdi calisiyor)
- JavaScript calistirimini test edin (Chromium ile artik guvenilir)
- Güvenlik taramasının geçtiğini doğrulayın (CVE-2022-35583 bayrakları artık yok)
- Docker konfigurasiyonlarini wkhtmltopdf kurulumunu kaldirmak icin güncelleyin

