C#'ta wkhtmltopdf'den IronPDF'ye Nasıl Geçilir
wkhtmltopdf, HTML belgelerini Qt 4.8 + QtWebKit kullanarak PDF'ye dönüştürmek için yaygın olarak kullanılan bir araç olmuştur. Geliştiriciler arasında komut satırı yetenekleri ve ücretsiz lisansı için popüler olmasına rağmen, proje artık görmezden gelinemeyecek kritik güvenlik riskleri sunmaktadır. GitHub deposu 2 Ocak 2023'te arşivlendi; son üst sürüm, 11 Haziran 2020'den 0.12.6'dır; ve CVE-2022-35583 (CVSS 9.8, SSRF) yamalanmamış olarak kalmaktadır.
Bu rehber, wkhtmltopdf'ten IronPDF'e tam bir geçiş yolu sağlamakta ve bu güvensizlik riskini uygulamalarından yok etmesi gereken profesyonel .NET geliştiricileri için adım adım talimatlar, kod karşılaştırmaları ve pratik örnekler sunmaktadır.
Kritik Güvenlik Uyarısı: CVE-2022-35583
wkhtmltopdf, asla düzeltilemeyecek ciddi bir güvenlik açığı içerir:
| Issue | Detay | Durumu |
|---|---|---|
| CVE-2022-35583 (SSRF, CWE-918) | KRİTİK (CVSS 9.8) | YAMALANMADI — bakımcılar tarafından tartışmaya açık |
| GitHub deposu arşivlendi | Sadece okunur | 2 Ocak 2023 |
| Son üst sürüm | 0.12.6 | 11 Haziran 2020 |
| Alt motor | Qt 4.8 + QtWebKit (Qt 4.8 EOL 2015) | ESKİ |
| CSS Grid Desteği | None | Kırık |
| Flexbox Desteği | Kısmi | Kırık |
| ES6+ JavaScript | Sınırlı | Kırık |
SSRF Saldırısının Nasıl Çalıştığını
Sunucu Tarafı İstek Sahtekarlığı (SSRF) güvenlik açığı, saldırganların iç hizmetlere erişmesine, kimlik bilgilerini çalmasına, ağınızın içini taramasına ve duyarlı verileri yanlış HTML ile dışa çıkarmasına olanak 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'i render ettiğinde, bu URL'leri sunucunuzun ağ bağlamından çeker ve güvenlik duvarlarını ve güvenlik kontrollerini atlar.
Etkilenen Sarmalayıcı Kütüphaneler
Her .NET sargısı aynı wkhtmltopdf yerel ikili dosyasını paketler ya da dışa bırakır, bu nedenle kendileri ne kadar aktif olursa olsun hepsi CVE maruz kalır:
| Sarmalayıcı Kütüphane | En son NuGet | Güvenlik Riski |
|---|---|---|
| DinkToPdf | 1.0.8 (Nisan 2017) — terk edilmiş | CVE-2022-35583 kalıtları |
| Rotativa.AspNetCore (webgio çatallanma) | 1.4.0 (Kasım 2023) — sargı güncellendi, ikili dosya donduruldu | CVE-2022-35583 kalıtları |
| TuesPechkin | 2.1.1 (Ocak 2015) — terk edilmiş | CVE-2022-35583 kalıtları |
Haukcode.WkHtmlToPdfDotNet (önceki adı WkHtmlToPdf-DotNet) |
1.5.95 (Ekim 2024) — sargı güncellendi, ikili dosya donduruldu | CVE-2022-35583 kalıtları |
| NReco.PdfGenerator | sargı güncellendi, wkhtmltopdf paketlenmiştir | CVE-2022-35583 kalıtları |
Bu kütüphanelerden herhangi birini kullanıyorsanız, tüm HTML girdisini temizlemediğiniz sürece uygulamanız CVE-2022-35583'e maruz kalır.
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 4.8 + QtWebKit (Qt 4.8 EOL 2015) | Mevcut Chromium motoru |
| Güvenlik Açıkları | CVE-2022-35583 (CVSS 9.8) yamalanmamış, tartışmaya açık | Raport edilmemiş kritik CVE'ler yok |
| Aktif Bakım | GitHub deposu 2 Ocak 2023'te arşivlendi; son sürüm Haziran 2020 | Düzenli sürümlerle aktif olarak korunur |
| Modern Web Standartları için Destek | Sınırlı (kırık flexbox, CSS Grid yok) | Desteklenen |
| Entegrasyon ve Destek | Topluluk forumları ile sınırlıdır | Geniş kapsamlı belgeler ve özel destek |
| CSS Grid | ❌ Desteklenmiyor | ✅ Desteklenir |
| Flexbox | ⚠ Bozuk | ✅ Desteklenir |
| ES6+ JavaScript | ❌ Desteklenmiyor | ✅ Desteklenir |
| Async/Await | ❌ Desteklenmiyor | ✅ Desteklenir |
| PDF Manipülasyonu | ❌ Desteklenmiyor | ✅ Desteklenir |
| Dijital İmzalar | ❌ Desteklenmiyor | ✅ Desteklenir |
| PDF/A Uyumlu | ❌ Desteklenmiyor | ✅ Desteklenir |
Hızlı Başlangıç: wkhtmltopdf'ten IronPDF'e Geçiş
Geçiş bu öncü adımlarla hemen başlayabilir.
Adım 1: wkhtmltopdf Paketlerini ve İkili Dosyalarını Kaldırın
Tüm wkhtmltopdf sarmalayıcı paketlerini kaldırın:
# Remove wkhtmltopdf wrapper (whichever you're using)
dotnet remove package Haukcode.WkHtmlToPdfDotNet
dotnet remove package DinkToPdf
dotnet remove package TuesPechkin
dotnet remove package Rotativa
dotnet remove package Rotativa.AspNetCore
dotnet remove package NReco.PdfGenerator
# Remove wkhtmltopdf binary from your deployment
# Delete wkhtmltopdf.exe, wkhtmltox.dll, etc.
# Remove wkhtmltopdf wrapper (whichever you're using)
dotnet remove package Haukcode.WkHtmlToPdfDotNet
dotnet remove package DinkToPdf
dotnet remove package TuesPechkin
dotnet remove package Rotativa
dotnet remove package Rotativa.AspNetCore
dotnet remove package NReco.PdfGenerator
# Remove wkhtmltopdf binary from your deployment
# Delete wkhtmltopdf.exe, wkhtmltox.dll, etc.
Adım 2:IronPDF Yükleme
# Add IronPDF(secure, modern alternative)
dotnet add package IronPdf
# Add IronPDF(secure, modern alternative)
dotnet add package IronPdf
3. Adım: Namespace'leri Güncelleme
wkhtmltopdf ad alanlarınıIronPDF ad alanı ile değiştirin:
// Before (wkhtmltopdf)
using Haukcode.WkHtmlToPdfDotNet;
using Haukcode.WkHtmlToPdfDotNet.Contracts;
// After (IronPDF)
using IronPdf;
// Before (wkhtmltopdf)
using Haukcode.WkHtmlToPdfDotNet;
using Haukcode.WkHtmlToPdfDotNet.Contracts;
// After (IronPDF)
using IronPdf;
Imports IronPdf
Adım 4: Lisansı Başlat
Uygulama başlangıcında lisans başlatmayı ekleyin:
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
Kod Göç Örnekleri
HTML'yi PDF'ye Dönüştürme
En temel işlem, bu .NET PDF yaklaşımları arasındaki karmaşıklık farkını ortaya çıkarır.
wkhtmltopdf Yaklaşımı:
// NuGet: Install-Package Haukcode.WkHtmlToPdfDotNet
using Haukcode.WkHtmlToPdfDotNet;
using Haukcode.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 Haukcode.WkHtmlToPdfDotNet
using Haukcode.WkHtmlToPdfDotNet;
using Haukcode.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);
}
}
Imports Haukcode.WkHtmlToPdfDotNet
Imports Haukcode.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 List(Of ObjectSettings) From {
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 Module
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, SynchronizedConverter oluşturmak için PdfTools gerektirir, GlobalSettings ve Objects kullanarak bir HtmlToPdfDocument inşa eder, ColorMode, Orientation ve PaperSize gibi özellikleri ayarlamayı, converter.Convert() çağrısı yapılarak ham baytları almayı ve File.WriteAllBytes() ile bir dosyaya elle yazmayı gerektirir.
IronPDF bu işlemi tamamen ortadan kaldırıyor—bir ChromePdfRenderer oluşturun, RenderHtmlAsPdf() çağırın ve yerleşik SaveAs() metodunu kullanın.
İleri düzey HTML-to-PDF senaryoları için HTML'den PDF'ye dönüşüm rehberine bakın.
URL'leri PDF'ye Dönüştürme
URL'den PDF'ye dönüştürmede benzer karmaşıklık modelleri gösterir.
wkhtmltopdf Yaklaşımı:
// NuGet: Install-Package Haukcode.WkHtmlToPdfDotNet
using Haukcode.WkHtmlToPdfDotNet;
using Haukcode.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 Haukcode.WkHtmlToPdfDotNet
using Haukcode.WkHtmlToPdfDotNet;
using Haukcode.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);
}
}
Imports Haukcode.WkHtmlToPdfDotNet
Imports Haukcode.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 List(Of ObjectSettings) From {
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, URL belirtmek için Page özelliğini ObjectSettings içinde kullanır, aynı belge oluşturma modelini gerektirir. IronPDF, amacı açıkça ifade eden özel bir RenderUrlAsPdf() metodu sağlar.
Kimlik doğrulama ve özel başlık seçenekleri için URL'den PDF'ye dokümantasyonu inceleyin.
Özel Ayarlar: Sayfa Yapılandırması ile HTML Dosyaları
Yönlendirme, kenar boşlukları ve kağıt boyutu yapılandırması farklı yaklaşımlar gerektirir.
wkhtmltopdf Yaklaşımı:
// NuGet: Install-Package Haukcode.WkHtmlToPdfDotNet
using Haukcode.WkHtmlToPdfDotNet;
using Haukcode.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 Haukcode.WkHtmlToPdfDotNet
using Haukcode.WkHtmlToPdfDotNet;
using Haukcode.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);
}
}
Imports Haukcode.WkHtmlToPdfDotNet
Imports Haukcode.WkHtmlToPdfDotNet.Contracts
Imports System.IO
Module Program
Sub Main()
Dim converter = New SynchronizedConverter(New PdfTools())
Dim doc = 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 Module
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çine yerleştirir, MarginSettings ise ayrı bir nesne olarak bırakılır. IronPDF, PaperOrientation, MarginTop ve PaperSize gibi adları net olan doğrudan RenderingOptions özelliklerini sağlar.
wkhtmltopdf API'den IronPDF Haritalama Referansı
Bu eşleştirme, doğrudan API eşdeğerlerini göstererek geçişi hızlandırır:
CLI'den IronPDF Haritalama
| wkhtmltopdf CLI Seçeneği | 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} yer tutucu |
--footer-center "[toPage]" |
{total-pages} yer tutucu |
--enable-javascript |
Varsayılan olarak etkin |
--javascript-delay 500 |
RenderingOptions.WaitFor.RenderDelay = 500 |
--dpi 300 |
RenderingOptions.Dpi = 300 |
--grayscale |
RenderingOptions.GrayScale = true |
C# Sarmalayıcı API Haritalaması
| wkhtmltopdf Sarmalayıcı | 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özdizimi Geçişi
| wkhtmltopdf Yer Tutucu | IronPDF Yer Tutucu |
|---|---|
[page] |
{page} |
[toPage] |
{total-pages} |
[date] |
{date} |
[time] |
{time} |
[title] |
{html-title} |
[url] |
{url} |
Yaygın Göç Sorunları ve Çözümleri
Sorun 1: Başlık/Dipnot Yer Tutucu Söz Dizimi
wkhtmltopdf: [page] ve [toPage] gibi köşeli parantez sözdizimini kullanır.
Çözüm: IronPDF'in süslü parantez yer tutucularına 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üvenilirlikle JavaScriptDelay özelliğini kullanır.
Çözüm:IronPDF birden fazla 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 Render Edilmiyor
Belirti: CSS Grid ve Flexbox düzenleri wkhtmltopdf'te yanlış render ediliyor.
Çözüm: IronPDF'in Chromium motoru modern CSS'yi doğru şekilde 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: Senkron ve Asenkron Render
wkhtmltopdf: Sarmalayıcılar senkron çalışır ve iş parçacıklarını engeller.
Çözüm:IronPDF asenkron render 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
Geçiş Öncesi Görevler
Kod tabanınızı denetleyerek tüm wkhtmltopdf kullanımlarını belirleyin:
# Find all wkhtmltopdf references
grep -r "Haukcode.WkHtmlToPdfDotNet\|WkHtmlToPdfDotNet\|DinkToPdf\|TuesPechkin\|Rotativa\|NReco.PdfGenerator" --include="*.cs" .
grep -r "wkhtmltopdf" --include="*.yml" --include="*.yaml" --include="Dockerfile" .
# Find all wkhtmltopdf references
grep -r "Haukcode.WkHtmlToPdfDotNet\|WkHtmlToPdfDotNet\|DinkToPdf\|TuesPechkin\|Rotativa\|NReco.PdfGenerator" --include="*.cs" .
grep -r "wkhtmltopdf" --include="*.yml" --include="*.yaml" --include="Dockerfile" .
Kaldırmak için wkhtmltopdf ikili dosyalarını bulun ve belgeleyin. Mevcut ayarları (kağıt boyutu, kenar boşlukları, başlıklar/dipnotlar) belgeleyin.
Kod Güncelleme Görevleri
- Tüm wkhtmltopdf sarmalayıcı NuGet paketlerini kaldırın
- wkhtmltopdf ikili dosyalarını kaldırın (wkhtmltopdf.exe, wkhtmltox.dll) 3.IronPDF NuGet paketini yükleyin
- Namespace dosya eklemelerini
Haukcode.WkHtmlToPdfDotNet(veya kullandığınız sarmalayıcı) ileIronPdfolarak güncelleyin. SynchronizedConverteröğesiniChromePdfRendererile değiştirin.HtmlToPdfDocumentdesenlerini doğrudan işleme metodlarına dönüştürün.GlobalSettingsyapılandırmalarınıRenderingOptionsolarak güncelleyin.- Kenar boşluğu yapılandırmalarını
MarginSettings'tan bireysel özelliklere dönüştürün. - Yer tutucu yapısını güncelleyin (
[page]→{page},[toPage]→{total-pages}). - Başlangıçta IronPDF lisans başlatma ekleyin
Geçiş Sonrası Testler
Geçiş sonrasında bu yönleri doğrulayın:
- PDF çıktısının görsel karşılaştırması (modern CSS desteği ile gelişmeli)
- Modern CSS render'ını doğrulayın (CSS Grid ve Flexbox artık çalışıyor)
- JavaScript ağırlıklı sayfaları test edin
- Wkhtmltopdf ikili dosyalarının kalmadığını doğrulamak için güvenlik taraması yapın
- Performans karşılaştırması için yük testi
Güvenlik Doğrulaması
# Scan for any remaining wkhtmltopdf artifacts
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 remaining wkhtmltopdf artifacts
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çmenin Temel Faydaları
Wkhtmltopdf'den IronPDF'e geçişin sağladığı birkaç önemli avantaj bulunmaktadır:
Güvenlik: CVE-2022-35583 ve tüm wkhtmltopdf güvenlik açıkları ortadan kaldırıldı. IronPDF, bilinen bir CVE'ye sahip değildir ve düzenli güvenlik güncellemeleri alır.
Modern Rendering Motoru: IronPDF, güncel Chromium motorunu kullanır ve tam CSS3, CSS Grid, Flexbox ve ES6+ JavaScript desteği sağlar. Modern framework'ler doğru bir şekilde render edilir.
Basitleştirilmiş API: Direkt render metotlar, belge oluşturma kalıplarının yerine geçer. Yerleşik SaveAs() metotları, manuel bayt işlemlerini ortadan kaldırıyor.
Genişletilmiş Yetiler: PDF manipülasyonu, dijital imzalar, PDF/A uyumu, filigranlar ve birleştirme/bölme işlemleri, wkhtmltopdf'in sağlayamadığı dahili özelliklerdir.
Aktif Geliştirme: IronPDF'nin düzenli güncellemeleri, mevcut .NET sürümlerini takip eder, bu sayede modern .NET ve C# dil sürümleri gönderildiği gibi desteklenir.
Async Desteği: Yüksek yüklü web uygulamalarında native async/await desteğiyle thread kilitlenmesini önler.

