C#'ta wkhtmltopdf'den IronPDF'ye Nasıl Geçilir
wkhtmltopdf, HTML belgelerini Qt WebKit kullanarak PDF'ye dönüştürmek için geniş çapta kullanılan bir araç olmuştur. Komut satırı yetenekleri ve ücretsiz lisansı nedeniyle geliştiriciler arasında popüler olmasına rağmen, proje artık göz ardı edilemeyecek ciddi güvenlik riskleri sunuyor. Kütüphane 2016-2017 yılları arasında resmen terk edilmiş olup, CVE-2022-35583 gibi KRİTİK önem arz eden bir zafiyet kalıcı olarak düzeltilmemiştir.
Bu kılavuz, bu güvenlik riskini uygulamalarından çıkarmak isteyen profesyonel .NET geliştiricileri için adım adım talimatlar, kod karşılaştırmaları ve pratik örnekler ile wkhtmltopdf'den IronPDF'e tam bir geçiş yolu sağlar.
Kritik Güvenlik Uyarısı: CVE-2022-35583
wkhtmltopdf, asla düzeltilmeyecek kritik bir güvenlik açığı içeriyor:
| Sorun | Ciddiyet | Durum |
|---|---|---|
| CVE-2022-35583 | KRİTİK (9.8/10) | ONARILMADI |
| SSRF Zafiyeti | Altyapı ele geçirme riski | ONARILMADI |
| Son Güncelleme | 2016-2017 | TERK EDİLDİ |
| WebKit Sürümü | 2015 (Qt WebKit) | GEÇERSİZ |
| CSS Grid Desteği | None | Bozuk |
| Flexbox Desteği | Kısmen | Bozuk |
| ES6+ JavaScript | None | Bozuk |
SSRF Saldırısının Nasıl Çalıştığı
Sunucu Tarafı İstek Sahteciliği (SSRF) güvenlik açığı, saldırganlara iç hizmetlere erişim sağlama, kimlik bilgilerini çalma, iç ağınızı tarama ve hassas verileri özel HTML yoluyla dışarıda atma imkanı tanı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"/>
wkhtmltopdf bu HTML'yi işlediğinde, güvenlik duvarlarını ve güvenlik kontrollerini atlatarak sunucunuzun ağ bağlamından bu URL'leri alır.
Etkilenen Sarıcı Kütüphaneler
wkhtmltopdf için tüm .NET sarmalayıcılar bu güvenlik açıklarını devralır:
| Sarıcı Kütüphane | Durum | Güvenlik Riski |
|---|---|---|
| DinkToPdf | Terk edilmiş | ⚠️ KRİTİK |
| Rotativa | Terk edilmiş | ⚠️ KRİTİK |
| TuesPechkin | Terk edilmiş | ⚠️ KRİTİK |
| WkHtmlToPdf-DotNet | Terk edilmiş | ⚠️ KRİTİK |
| NReco.PdfGenerator | Wkhtmltopdf kullanır | ⚠️ KRİTİK |
Bu kütüphanelerin herhangi birini kullanıyorsanız, CVE-2022-35583 için savunmasızsınız.
IronPDF vs wkhtmltopdf: Özellik Karşılaştırması
Mimari farklılıkları anlamak, teknik karar vericilerin geçiş yatırımını değerlendirmesine yardımcı olur:
| Özellik | wkhtmltopdf | IronPDF |
|---|---|---|
| Lisanslama | LGPLv3 (Ücretsiz) | Ticari |
| Render Motoru | Qt WebKit (2015) | Güncel Chromium Motoru |
| Güvenlik Açıkları | CVE-2022-35583, önemli düzeltme yapılmamış sorunlar | Bilinen güvenlik açığı yok |
| Aktif Bakım | 2017'den bu yana anlamlı güncellemeler sunulmamış, terk edilmiş | Düzenli sürümlerle aktif olarak bakım altında |
| Modern Web Standartlarına Destek | Sınırlı (Bozuk flexbox, CSS Grid yok) | Desteklenir |
| Entegrasyon ve Destek | Topluluk forumları ile sınırlı | Kapsamlı dokümantasyon ve özel destek |
| CSS Grid | ❌ Desteklenmiyor | ✅ Destekleniyor |
| Flexbox | ⚠️ Bozuk | ✅ Destekleniyor |
| ES6+ JavaScript | ❌ Desteklenmiyor | ✅ Destekleniyor |
| Async/Await | ❌ Desteklenmiyor | ✅ Destekleniyor |
| PDF Manipulasyonu | ❌ Desteklenmiyor | ✅ Destekleniyor |
| Dijital İmzalar | ❌ Desteklenmiyor | ✅ Destekleniyor |
| PDF/A Uyumluluğu | ❌ Desteklenmiyor | ✅ Destekleniyor |
Hızlı Başlangıç: wkhtmltopdf'den IronPDF'e Geçiş
Geçiş hemen bu temel adımlar ile başlatılabilir.
Adım 1:wkhtmltopdfPaketlerini ve İkili Dosyalarını Kaldırın
Tümwkhtmltopdfsarmalayıcı paketlerini kaldırın:
# Removewkhtmltopdfwrapper (whichever you're using)
dotnet remove package WkHtmlToPdf-DotNet
dotnet remove package DinkToPdf
dotnet remove package TuesPechkin
dotnet remove package Rotativa
dotnet remove package Rotativa.AspNetCore
dotnet remove package NReco.PdfGenerator
# Removewkhtmltopdfbinary from your deployment
# Delete wkhtmltopdf.exe, wkhtmltox.dll, etc.
# Removewkhtmltopdfwrapper (whichever you're using)
dotnet remove package WkHtmlToPdf-DotNet
dotnet remove package DinkToPdf
dotnet remove package TuesPechkin
dotnet remove package Rotativa
dotnet remove package Rotativa.AspNetCore
dotnet remove package NReco.PdfGenerator
# Removewkhtmltopdfbinary from your deployment
# Delete wkhtmltopdf.exe, wkhtmltox.dll, etc.
Adım 2: IronPDF'i Kurun
# AddIronPDF(secure, modern alternative)
dotnet add package IronPdf
# AddIronPDF(secure, modern alternative)
dotnet add package IronPdf
Adım 3: Adalanları Güncelleyin
wkhtmltopdf namespace'lerini IronPdf namespace'i ile değiştirin:
// Before (wkhtmltopdf)
using WkHtmlToPdfDotNet;
using WkHtmlToPdfDotNet.Contracts;
// After (IronPDF)
using IronPdf;
// Before (wkhtmltopdf)
using WkHtmlToPdfDotNet;
using WkHtmlToPdfDotNet.Contracts;
// After (IronPDF)
using IronPdf;
' Before (wkhtmltopdf)
Imports WkHtmlToPdfDotNet
Imports WkHtmlToPdfDotNet.Contracts
' After (IronPDF)
Imports IronPdf
Adim 4: Lisans Icin Yapisallastirma
Uygulama başlangıcında lisans başlatmasını ekleyin:
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
Kod Geçiş Örnekleri
HTML'i PDF'ye Dönüştürme
.NET PDF yaklaşımları arasındaki karmaşıklık farkını en temel işlem ortaya çıkarır.
wkhtmltopdf Yaklaşımı:
// NuGet: Install-Package WkHtmlToPdf-DotNet
using WkHtmlToPdfDotNet;
using WkHtmlToPdfDotNet.Contracts;
using System.IO;
class Program
{
static void Main()
{
var converter = new SynchronizedConverter(new PdfTools());
var doc = new HtmlToPdfDocument()
{
GlobalSettings = {
ColorMode = ColorMode.Color,
Orientation = Orientation.Portrait,
PaperSize = PaperKind.A4
},
Objects = {
new ObjectSettings()
{
HtmlContent = "<h1>Hello World</h1><p>This is a PDF from HTML.</p>"
}
}
};
byte[] pdf = converter.Convert(doc);
File.WriteAllBytes("output.pdf", pdf);
}
}
// NuGet: Install-Package WkHtmlToPdf-DotNet
using WkHtmlToPdfDotNet;
using WkHtmlToPdfDotNet.Contracts;
using System.IO;
class Program
{
static void Main()
{
var converter = new SynchronizedConverter(new PdfTools());
var doc = new HtmlToPdfDocument()
{
GlobalSettings = {
ColorMode = ColorMode.Color,
Orientation = Orientation.Portrait,
PaperSize = PaperKind.A4
},
Objects = {
new ObjectSettings()
{
HtmlContent = "<h1>Hello World</h1><p>This is a PDF from HTML.</p>"
}
}
};
byte[] pdf = converter.Convert(doc);
File.WriteAllBytes("output.pdf", pdf);
}
}
' NuGet: Install-Package WkHtmlToPdf-DotNet
Imports WkHtmlToPdfDotNet
Imports WkHtmlToPdfDotNet.Contracts
Imports System.IO
Class Program
Shared Sub Main()
Dim converter = New SynchronizedConverter(New PdfTools())
Dim doc = New HtmlToPdfDocument() With {
.GlobalSettings = New GlobalSettings() With {
.ColorMode = ColorMode.Color,
.Orientation = Orientation.Portrait,
.PaperSize = PaperKind.A4
},
.Objects = {
New ObjectSettings() With {
.HtmlContent = "<h1>Hello World</h1><p>This is a PDF from HTML.</p>"
}
}
}
Dim pdf As Byte() = converter.Convert(doc)
File.WriteAllBytes("output.pdf", pdf)
End Sub
End Class
IronPDF Yaklaşımı:
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1><p>This is a PDF from HTML.</p>");
pdf.SaveAs("output.pdf");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1><p>This is a PDF from HTML.</p>");
pdf.SaveAs("output.pdf");
}
}
Imports IronPdf
Imports System
Class Program
Shared Sub Main()
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1><p>This is a PDF from HTML.</p>")
pdf.SaveAs("output.pdf")
End Sub
End Class
wkhtmltopdf, bir SynchronizedConverter oluşturmayı, PdfTools ile bir HtmlToPdfDocument yapmayı, özellikleri GlobalSettings ve Objects gibi ayarlamayı, ham baytları almak için converter.Convert() çağırmayı ve File.WriteAllBytes() ile dosyaya manuel olarak yazmayı gerektirir.
IronPDF bu prosedürü tamamen ortadan kaldırır—bir ChromePdfRenderer oluşturun, RenderHtmlAsPdf() çağırın ve dahili SaveAs() yöntemini kullanın.
Gelişmiş HTML-PDF senaryoları için HTML'den PDF'e dönüştürme kılavuzuna bakın.
URL'leri PDF'ye Dönüştürme
URL'den PDF'ye dönüşüm benzer karmaşıklık desenleri gösterir.
wkhtmltopdf Yaklaşımı:
// NuGet: Install-Package WkHtmlToPdf-DotNet
using WkHtmlToPdfDotNet;
using WkHtmlToPdfDotNet.Contracts;
using System.IO;
class Program
{
static void Main()
{
var converter = new SynchronizedConverter(new PdfTools());
var doc = new HtmlToPdfDocument()
{
GlobalSettings = {
ColorMode = ColorMode.Color,
Orientation = Orientation.Portrait,
PaperSize = PaperKind.A4
},
Objects = {
new ObjectSettings()
{
Page = "https://www.example.com"
}
}
};
byte[] pdf = converter.Convert(doc);
File.WriteAllBytes("webpage.pdf", pdf);
}
}
// NuGet: Install-Package WkHtmlToPdf-DotNet
using WkHtmlToPdfDotNet;
using WkHtmlToPdfDotNet.Contracts;
using System.IO;
class Program
{
static void Main()
{
var converter = new SynchronizedConverter(new PdfTools());
var doc = new HtmlToPdfDocument()
{
GlobalSettings = {
ColorMode = ColorMode.Color,
Orientation = Orientation.Portrait,
PaperSize = PaperKind.A4
},
Objects = {
new ObjectSettings()
{
Page = "https://www.example.com"
}
}
};
byte[] pdf = converter.Convert(doc);
File.WriteAllBytes("webpage.pdf", pdf);
}
}
' NuGet: Install-Package WkHtmlToPdf-DotNet
Imports WkHtmlToPdfDotNet
Imports WkHtmlToPdfDotNet.Contracts
Imports System.IO
Module Program
Sub Main()
Dim converter As New SynchronizedConverter(New PdfTools())
Dim doc As New HtmlToPdfDocument() With {
.GlobalSettings = New GlobalSettings() With {
.ColorMode = ColorMode.Color,
.Orientation = Orientation.Portrait,
.PaperSize = PaperKind.A4
},
.Objects = {
New ObjectSettings() With {
.Page = "https://www.example.com"
}
}
}
Dim pdf As Byte() = converter.Convert(doc)
File.WriteAllBytes("webpage.pdf", pdf)
End Sub
End Module
IronPDF Yaklaşımı:
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderUrlAsPdf("https://www.example.com");
pdf.SaveAs("webpage.pdf");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderUrlAsPdf("https://www.example.com");
pdf.SaveAs("webpage.pdf");
}
}
Imports IronPdf
Imports System
Class Program
Shared Sub Main()
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderUrlAsPdf("https://www.example.com")
pdf.SaveAs("webpage.pdf")
End Sub
End Class
wkhtmltopdf, bir URL belirtmek için Page özelliğini ObjectSettings içinde kullanır ve aynı belge yapılandırma deseni gerektirir. IronPDF, niyeti açıkça ifade eden özel bir RenderUrlAsPdf() yöntemi sağlar.
Kimlik doğrulama ve ozellestirilmis baslik seçenekleri icin URL'den PDF'ye dokümantasyonu kesfedin.
Özel Ayarlar: Sayfa Yapılandırması ile HTML Dosyaları
Yönlendirme, kenar boşlukları ve kağıt boyutunu yapılandırmak farklı yaklaşımlar gerektirir.
wkhtmltopdf Yaklaşımı:
// NuGet: Install-Package WkHtmlToPdf-DotNet
using WkHtmlToPdfDotNet;
using WkHtmlToPdfDotNet.Contracts;
using System.IO;
class Program
{
static void Main()
{
var converter = new SynchronizedConverter(new PdfTools());
var doc = new HtmlToPdfDocument()
{
GlobalSettings = {
ColorMode = ColorMode.Color,
Orientation = Orientation.Landscape,
PaperSize = PaperKind.A4,
Margins = new MarginSettings() { Top = 10, Bottom = 10, Left = 10, Right = 10 }
},
Objects = {
new ObjectSettings()
{
Page = "input.html",
WebSettings = { DefaultEncoding = "utf-8" }
}
}
};
byte[] pdf = converter.Convert(doc);
File.WriteAllBytes("custom-output.pdf", pdf);
}
}
// NuGet: Install-Package WkHtmlToPdf-DotNet
using WkHtmlToPdfDotNet;
using WkHtmlToPdfDotNet.Contracts;
using System.IO;
class Program
{
static void Main()
{
var converter = new SynchronizedConverter(new PdfTools());
var doc = new HtmlToPdfDocument()
{
GlobalSettings = {
ColorMode = ColorMode.Color,
Orientation = Orientation.Landscape,
PaperSize = PaperKind.A4,
Margins = new MarginSettings() { Top = 10, Bottom = 10, Left = 10, Right = 10 }
},
Objects = {
new ObjectSettings()
{
Page = "input.html",
WebSettings = { DefaultEncoding = "utf-8" }
}
}
};
byte[] pdf = converter.Convert(doc);
File.WriteAllBytes("custom-output.pdf", pdf);
}
}
' NuGet: Install-Package WkHtmlToPdf-DotNet
Imports WkHtmlToPdfDotNet
Imports WkHtmlToPdfDotNet.Contracts
Imports System.IO
Class Program
Shared Sub Main()
Dim converter As New SynchronizedConverter(New PdfTools())
Dim doc As New HtmlToPdfDocument() With {
.GlobalSettings = New GlobalSettings() With {
.ColorMode = ColorMode.Color,
.Orientation = Orientation.Landscape,
.PaperSize = PaperKind.A4,
.Margins = New MarginSettings() With {.Top = 10, .Bottom = 10, .Left = 10, .Right = 10}
},
.Objects = {
New ObjectSettings() With {
.Page = "input.html",
.WebSettings = New WebSettings() With {.DefaultEncoding = "utf-8"}
}
}
}
Dim pdf As Byte() = converter.Convert(doc)
File.WriteAllBytes("custom-output.pdf", pdf)
End Sub
End Class
IronPDF Yaklaşımı:
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape;
renderer.RenderingOptions.MarginTop = 10;
renderer.RenderingOptions.MarginBottom = 10;
renderer.RenderingOptions.MarginLeft = 10;
renderer.RenderingOptions.MarginRight = 10;
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
var pdf = renderer.RenderHtmlFileAsPdf("input.html");
pdf.SaveAs("custom-output.pdf");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape;
renderer.RenderingOptions.MarginTop = 10;
renderer.RenderingOptions.MarginBottom = 10;
renderer.RenderingOptions.MarginLeft = 10;
renderer.RenderingOptions.MarginRight = 10;
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
var pdf = renderer.RenderHtmlFileAsPdf("input.html");
pdf.SaveAs("custom-output.pdf");
}
}
Imports IronPdf
Imports IronPdf.Rendering
Imports System
Class Program
Shared Sub Main()
Dim renderer As New ChromePdfRenderer()
renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape
renderer.RenderingOptions.MarginTop = 10
renderer.RenderingOptions.MarginBottom = 10
renderer.RenderingOptions.MarginLeft = 10
renderer.RenderingOptions.MarginRight = 10
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4
Dim pdf = renderer.RenderHtmlFileAsPdf("input.html")
pdf.SaveAs("custom-output.pdf")
End Sub
End Class
wkhtmltopdf, ayarları GlobalSettings ve Objects içinde yuvalar, MarginSettings ise ayrı bir nesne olarak yapılandırılır. IronPDF, RenderingOptions gibi açık adlara sahip doğrudan PaperOrientation, MarginTop ve PaperSize özellikleri sağlar.
wkhtmltopdf API'nin IronPDF'e Eşleştirme Referansı
Bu eşleme, doğrudan API eşdeğerlerini göstererek geçişi hızlandırır.
CLI'den IronPDF'e Eşleştirme
| wkhtmltopdfCLI Secenegi | IronPDF Eşdeğeri |
|---|---|
wkhtmltopdf input.html output.pdf |
renderer.RenderHtmlFileAsPdf() |
wkhtmltopdf URL output.pdf |
renderer.RenderUrlAsPdf() |
--page-size A4 |
RenderingOptions.PaperSize = PdfPaperSize.A4 |
--page-size Letter |
RenderingOptions.PaperSize = PdfPaperSize.Letter |
--orientation Landscape |
RenderingOptions.PaperOrientation = Landscape |
--margin-top 10mm |
RenderingOptions.MarginTop = 10 |
--margin-bottom 10mm |
RenderingOptions.MarginBottom = 10 |
--margin-left 10mm |
RenderingOptions.MarginLeft = 10 |
--margin-right 10mm |
RenderingOptions.MarginRight = 10 |
--header-html header.html |
RenderingOptions.HtmlHeader |
--footer-center "[page]" |
{page} placeholder |
--footer-center "[toPage]" |
{total-pages} placeholder |
--enable-javascript |
Varsıyılan olarak etkin |
--javascript-delay 500 |
RenderingOptions.WaitFor.RenderDelay = 500 |
--dpi 300 |
RenderingOptions.Dpi = 300 |
--grayscale |
RenderingOptions.GrayScale = true |
C# Wrapper API Haritalama
| wkhtmltopdf Wrapper | IronPDF |
|---|---|
SynchronizedConverter |
ChromePdfRenderer |
HtmlToPdfDocument |
RenderingOptions |
GlobalSettings.Out |
pdf.SaveAs() |
GlobalSettings.PaperSize |
RenderingOptions.PaperSize |
GlobalSettings.Orientation |
RenderingOptions.PaperOrientation |
GlobalSettings.Margins |
RenderingOptions.Margin* |
ObjectSettings.Page |
RenderHtmlFileAsPdf() |
ObjectSettings.HtmlContent |
RenderHtmlAsPdf() |
converter.Convert(doc) |
renderer.RenderHtmlAsPdf() |
Yer Tutucu Söz Dizimi Goc Yolu
| wkhtmltopdfYer Tutucu | IronPDF Yer Tutucu |
|---|---|
[page] |
{page} |
[toPage] |
{total-pages} |
[date] |
{date} |
[time] |
{time} |
[title] |
{html-title} |
[url] |
{url} |
Yaygın Taşınma Sorunları ve Çözümleri
Sorun 1: Başlık/Altbilgi Yer Tutucu Sözdizimi
wkhtmltopdf: [page] ve [toPage] gibi köşeli parantez sözdizimini kullanır.
Cozum: IronPDF'nin suslü parantez yeri tutucularina güncelleyin:
// Before (wkhtmltopdf)
FooterSettings = { Left = "Page [page] of [toPage]" }
// After (IronPDF)
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
HtmlFragment = "<div style='text-align:left;'>Page {page} of {total-pages}</div>",
MaxHeight = 25
};
// Before (wkhtmltopdf)
FooterSettings = { Left = "Page [page] of [toPage]" }
// After (IronPDF)
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
HtmlFragment = "<div style='text-align:left;'>Page {page} of {total-pages}</div>",
MaxHeight = 25
};
' Before (wkhtmltopdf)
FooterSettings = New With {.Left = "Page [page] of [toPage]"}
' After (IronPDF)
renderer.RenderingOptions.HtmlFooter = New HtmlHeaderFooter With {
.HtmlFragment = "<div style='text-align:left;'>Page {page} of {total-pages}</div>",
.MaxHeight = 25
}
Sorun 2: JavaScript Gecikme Yapılandırması
wkhtmltopdf: Sınırlı güvenilirlik sağlayan JavaScriptDelay özelliğini kullanır.
Çözüm:IronPDFbirçok seçenek sunar:
renderer.RenderingOptions.EnableJavaScript = true;
// Option 1: Fixed delay
renderer.RenderingOptions.WaitFor.RenderDelay(500);
// Option 2: Wait for specific element (more reliable)
renderer.RenderingOptions.WaitFor.HtmlElementById("content-loaded");
// Option 3: Wait for JavaScript condition
renderer.RenderingOptions.WaitFor.JavaScript("window.renderComplete === true");
renderer.RenderingOptions.EnableJavaScript = true;
// Option 1: Fixed delay
renderer.RenderingOptions.WaitFor.RenderDelay(500);
// Option 2: Wait for specific element (more reliable)
renderer.RenderingOptions.WaitFor.HtmlElementById("content-loaded");
// Option 3: Wait for JavaScript condition
renderer.RenderingOptions.WaitFor.JavaScript("window.renderComplete === true");
renderer.RenderingOptions.EnableJavaScript = True
' Option 1: Fixed delay
renderer.RenderingOptions.WaitFor.RenderDelay(500)
' Option 2: Wait for specific element (more reliable)
renderer.RenderingOptions.WaitFor.HtmlElementById("content-loaded")
' Option 3: Wait for JavaScript condition
renderer.RenderingOptions.WaitFor.JavaScript("window.renderComplete === true")
Sorun 3: Modern CSS'yi İşleyememe
Belirti: CSS Grid ve Flexbox düzenleri wkhtmltopdf'da yanlış işlenir.
Çözüm: IronPDF'in Chromium motoru modern CSS'yi doğru işler:
// This CSS now works with IronPDF
var html = @"
<style>
.grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px; }
.flex { display: flex; justify-content: space-between; align-items: center; }
</style>
<div class='grid'>
<div>Column 1</div>
<div>Column 2</div>
<div>Column 3</div>
</div>";
var pdf = renderer.RenderHtmlAsPdf(html);
// This CSS now works with IronPDF
var html = @"
<style>
.grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px; }
.flex { display: flex; justify-content: space-between; align-items: center; }
</style>
<div class='grid'>
<div>Column 1</div>
<div>Column 2</div>
<div>Column 3</div>
</div>";
var pdf = renderer.RenderHtmlAsPdf(html);
Dim html As String = "
<style>
.grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px; }
.flex { display: flex; justify-content: space-between; align-items: center; }
</style>
<div class='grid'>
<div>Column 1</div>
<div>Column 2</div>
<div>Column 3</div>
</div>"
Dim pdf = renderer.RenderHtmlAsPdf(html)
Sorun 4: Eşzamanlı ve Eşzamanlı Olmayan İşleme
wkhtmltopdf: Sarmalayıcılar eşzamanlıdır ve threadleri kilitler.
Çözüm:IronPDFeşzamanlı olmayan işlemeyi destekler:
public async Task<byte[]> GeneratePdfAsync(string html)
{
var renderer = new ChromePdfRenderer();
var pdf = await renderer.RenderHtmlAsPdfAsync(html);
return pdf.BinaryData;
}
public async Task<byte[]> GeneratePdfAsync(string html)
{
var renderer = new ChromePdfRenderer();
var pdf = await renderer.RenderHtmlAsPdfAsync(html);
return pdf.BinaryData;
}
Imports System.Threading.Tasks
Public Async Function GeneratePdfAsync(html As String) As Task(Of Byte())
Dim renderer As New ChromePdfRenderer()
Dim pdf = Await renderer.RenderHtmlAsPdfAsync(html)
Return pdf.BinaryData
End Function
wkhtmltopdf Geçiş Kontrol Listesi
Ön Taşınma Görevleri
wkhtmltopdf kullanımını belirlemek için kod tabanınızı denetleyin:
# Find allwkhtmltopdfreferences
grep -r "WkHtmlToPdfDotNet\|DinkToPdf\|TuesPechkin\|Rotativa" --include="*.cs" .
grep -r "wkhtmltopdf" --include="*.yml" --include="*.yaml" --include="Dockerfile" .
# Find allwkhtmltopdfreferences
grep -r "WkHtmlToPdfDotNet\|DinkToPdf\|TuesPechkin\|Rotativa" --include="*.cs" .
grep -r "wkhtmltopdf" --include="*.yml" --include="*.yaml" --include="Dockerfile" .
Kaldırmak içinwkhtmltopdfikili dosyalarını bulun ve belgeleyin. Mevcut ayarları belgeleyin (kağıt boyutu, kenar boşlukları, başlıklar/altbilgiler).
Kod Güncelleme Görevleri
- Tümwkhtmltopdfsarmalayıcı NuGet paketlerini kaldırın 2.wkhtmltopdfikili dosyalarını kaldırın (wkhtmltopdf.exe, wkhtmltox.dll)
- IronPdf NuGet paketini yükleyin
- Ad alanı eklemelerini
WkHtmlToPdfDotNet'denIronPdf'ya güncelleyin SynchronizedConverterileChromePdfRendererdeğiştirinHtmlToPdfDocumentdesenlerini doğrudan işleme yöntemlerine dönüştürünGlobalSettingsyapılandırmalarınıRenderingOptions'ya güncelleyin- Kenar boşluğu yapılandırmalarını
MarginSettings'den bireysel özelliklere dönüştürün - Yer tutucu sözdizimini güncelleyin (
[page]→{page},[toPage]→{total-pages}) - BaşlangıçtaIronPDFlisans başlatma ekleyin
Taşınım Sonrası Test
Geçiş sonrasında aşağıdaki yönleri doğrulayın:
- PDF çıktısının görsel karşılaştırması (modern CSS desteği ile geliştirilmeli)
- Modern CSS işleme doğrulaması (CSS Grid ve Flexbox artık çalışıyor)
- JavaScript ağırlıklı sayfaları test edin -wkhtmltopdfikili dosyalarının kalmadığını doğrulamak için güvenlik taraması
- Performans karşılaştırması için yük testi
Güvenlik Doğrulaması
# Scan for any remainingwkhtmltopdfartifacts
find /var/www/ -name "*wkhtmlto*" 2>/dev/null
find /usr/local/bin/ -name "*wkhtmlto*" 2>/dev/null
docker images | grep wkhtmltopdf
# Check if any process is still using it
ps aux | grep wkhtmltopdf
# Scan for any remainingwkhtmltopdfartifacts
find /var/www/ -name "*wkhtmlto*" 2>/dev/null
find /usr/local/bin/ -name "*wkhtmlto*" 2>/dev/null
docker images | grep wkhtmltopdf
# Check if any process is still using it
ps aux | grep wkhtmltopdf
IronPDF'e Geçişin Temel Avantajları
wkhtmltopdf'dan IronPDF'e geçiş, birkaç kritik avantaj sağlar:
Güvenlik: CVE-2022-35583 ve tümwkhtmltopdfaçıkları kaldırılmıştır. IronPDF'in bilinen hiçbir CVE'si yoktur ve düzenli güvenlik güncellemeleri alır.
Modern İşlemci Motoru: IronPDF, mevcut Chromium motorunu kullanarak tam CSS3, CSS Grid, Flexbox ve ES6+ JavaScript desteği sağlar. Modern frameworkler düzgün şekilde işlenir.
Basitleştirilmiş API: Doğrudan işleme yöntemleri, belge yapı desenlerinin yerini alır. Dahili SaveAs() yöntemleri, manuel bayt işlemesini ortadan kaldırır.
Genişletilmiş Yetenekler: PDF manipulasyonu, dijital imzalar, PDF/A uyumluluğu, filigranlar ve birleştirme/bölme işlemleri wkhtmltopdf'un sağlayamadığı yerleşik özelliklerdir.
Aktif Geliştirme: 2026 boyunca .NET 10 ve C# 14 benimsenmesi arttıkça, IronPDF'in düzenli güncellemeleri mevcut ve gelecekteki .NET sürümleriyle uyumluluğu sağlar.
Eşzamanlı Destek: Yüksek yük altındaki web uygulamalarında thread kilitlenmesini, yerleşik async/await desteği ile önleyin.

