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

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

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

Adım 2: IronPDF'i Kurun

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

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

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

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

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

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

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

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

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

  1. Tümwkhtmltopdfsarmalayıcı NuGet paketlerini kaldırın 2.wkhtmltopdfikili dosyalarını kaldırın (wkhtmltopdf.exe, wkhtmltox.dll)
  2. IronPdf NuGet paketini yükleyin
  3. Ad alanı eklemelerini WkHtmlToPdfDotNet'den IronPdf'ya güncelleyin
  4. SynchronizedConverter ile ChromePdfRenderer değiştirin
  5. HtmlToPdfDocument desenlerini doğrudan işleme yöntemlerine dönüştürün
  6. GlobalSettings yapılandırmalarını RenderingOptions'ya güncelleyin
  7. Kenar boşluğu yapılandırmalarını MarginSettings'den bireysel özelliklere dönüştürün
  8. Yer tutucu sözdizimini güncelleyin ([page]{page}, [toPage]{total-pages})
  9. 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
SHELL

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.

Curtis Chau
Teknik Yazar

Curtis Chau, Bilgisayar Bilimleri alanında lisans derecesine sahiptir (Carleton Üniversitesi) ve Node.js, TypeScript, JavaScript ve React konularında uzmanlaşmış ön uç geliştirme üzerine uzmanlaşmıştır. Kullanıcı dostu ve estetik açıdan hoş arayüzler tasarlamaya tutkuyla bağlı olan Curtis, modern çerç...

Daha Fazlasını Oku

Iron Destek Ekibi

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