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

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

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.
SHELL

Adım 2:IronPDF Yükleme

# Add IronPDF(secure, modern alternative)
dotnet add package IronPdf
# Add IronPDF(secure, modern alternative)
dotnet add package IronPdf
SHELL

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

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

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

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

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

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

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

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

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

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

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

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

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" .
SHELL

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

  1. Tüm wkhtmltopdf sarmalayıcı NuGet paketlerini kaldırın
  2. wkhtmltopdf ikili dosyalarını kaldırın (wkhtmltopdf.exe, wkhtmltox.dll) 3.IronPDF NuGet paketini yükleyin
  3. Namespace dosya eklemelerini Haukcode.WkHtmlToPdfDotNet (veya kullandığınız sarmalayıcı) ile IronPdf olarak güncelleyin.
  4. SynchronizedConverter öğesini ChromePdfRenderer ile değiştirin.
  5. HtmlToPdfDocument desenlerini doğrudan işleme metodlarına dönüştürün.
  6. GlobalSettings yapılandırmalarını RenderingOptions olarak güncelleyin.
  7. Kenar boşluğu yapılandırmalarını MarginSettings'tan bireysel özelliklere dönüştürün.
  8. Yer tutucu yapısını güncelleyin ([page]{page}, [toPage]{total-pages}).
  9. 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
SHELL

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.

Lütfen dikkate alınDinkToPdf, NReco, Rotativa, TuesPechkin, ve wkhtmltopdf, ilgili sahiplerinin tescilli ticari markalarıdır. Bu site DinkToPdf, NReco, Rotativa, TuesPechkin veya wkhtmltopdf ile bağlantılı, onaylanmış veya sponsorlu 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