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

PuppeteerSharp'tan IronPDF'e C# ile Nasıl Geçilir

PuppeteerSharp'ten IronPDF'e geçiş yapmak, PDF oluşturma iş akışınızı300MB+bağımlılığı olan bir tarayıcı otomasyon aracından otomatik bellek yönetimi sağlayan amacına uygun bir PDF kütüphanesine dönüştürür. Bu kılavuz, Chromium indirmelerini ortadan kaldıran, bellek sızıntısı sorunlarını çözen ve kapsamlı PDF manipülasyon yetenekleri sağlayan eksiksiz, adım adım bir geçiş yolu sunar.

Neden PuppeteerSharp'tan IronPDF'e Geçilmeli

PuppeteerSharp'ı Anlamak

PuppeteerSharp, C#'a tarayıcı otomasyon yetenekleri getiren, Google'un Puppeteer'ının bir .NET portudur. Bu, PDF'leri Chrome'un yerleşik PDF'e yazdır işlevini kullanarak üretir - bir tarayıcıda Ctrl+P tuşuna basmakla aynı şey. Bu, ekrandan gördüğünüzden farklı olarak, kağıt için optimize edilmiş baskı hazır çıktılar üretir.

PuppeteerSharp, web testi ve kazıma için tasarlanmıştır, belge oluşturma için değil. Yetkin olmasına rağmen, PDF üretimi içinPuppeteerSharpkullanılması önemli üretim zorlukları oluşturur.

Tarayıcı Otomasyonu Problemi

PuppeteerSharp, doküman üretimi için değil, tarayıcı otomasyonu için tasarlanmıştır. Bu, PDF'ler için kullanıldığında temel sorunlar yaratır:

  1. İlk kullanım öncesi 300MB+ Chromium indirmeleri gereklidir. PuppeteerSharp'ın en önemli dezavantajı, Chromium ikili dosyasını bünyesinde bulundurması nedeniyle devasa dağıtım boyutudur. Bu önemli büyüklük, Docker görüntülerini şişirebilir ve sunucusuz ortamlarda soğuk başlatma sorunlarına neden olabilir.

  2. Yük altında bellek sızıntıları manuel tarayıcı geri dönüşümü gerektirir. Ağır yük altında, PuppeteerSharp'un bellek sızıntıları yaşadığı bilinmektedir. Tarayıcı örneklerinin bellek birikimi, süreç yönetimi ve geri dönüşüm için manuel müdahale gerektirir.

  3. Tarayıcı yaşam döngüsü yönetimi ile karmaşık asenkron desenler.

  4. PDF'e yazdırma çıktısı (Ctrl+P'ye eşdeğer, ekran yakalama değil). Düzenler yeniden akışa geçebilir, arka planlar varsayılan olarak atlanabilir ve çıktı, tarayıcı görüntüleme portuna uymak yerine yazdırmak için sayfalandırılır.

  5. Uyumluluk gereksinimleri için PDF/A veya PDF/UA desteği yok. PuppeteerSharp, PDF/A (arşivleme) veya PDF/UA (erişilebilirlik) uyumlu belgeler üretemez.

  6. PDF üzerinde manipülasyon yok - sadece üretim, birleştirme/bölme/düzenleme yok. PuppeteerSharp, PDF'leri üretmede etkili olsa da, PDF'leri birleştirme, bölme, güvenli hale getirme veya düzenleme gibi daha fazla manipülasyon için yeteneklerden yoksundur.

PuppeteerSharp ileIronPDFKarşılaştırması

Bağlam PuppeteerSharp IronPDF
Birincil Amaç Tarayıcı otomasyonu PDF oluşturma
Chromium Bağımlılığı 300MB+ayrı indirme Dahili optimize edilmiş motor
API Karmaşıklığı Asenkron tarayıcı/sayfa yaşam döngüsü Eşzamansız tek satırlıklar
Başlatma BrowserFetcher.DownloadAsync() + LaunchAsync new ChromePdfRenderer()
Bellek Yönetimi Manuel tarayıcı yenilemesi gereklidir Otomatik
Yük Altında Bellek 500MB+ sızıntılarla ~50MB kararlı
Soğuk Başlatma 45+ saniye ~20 saniye
PDF/A Desteği Mevcut değil Desteklenir
PDF/UA Erişilebilirlik Mevcut değil Desteklenir
PDF Düzenleme Mevcut değil Birleştir, ayır, damga ekle, düzenle
Dijital İmzalar Mevcut değil Desteklenir
İplik Güvenliği Sınırlı Tam
Profesyonel Destek Topluluk SLA ile ticari

Platform Desteği

|Kütüphane|.NET Framework 4.7.2|.NET Core 3.1|.NET 6-8|.NET 10| | --------- | :---: | :---: | :---: | :---: ||IronPDF| Tam | Tam | Tam | Tam ||PuppeteerSharp| Sınırlı | Tam | Tam | Beklemede | IronPDF'nin .NET platformları genelindeki geniş desteği, geliştiricilere çeşitli ortamlarda kullanılabilmesini sağlar, uyumluluk sorunlarıyla karşılaşmadan modern .NET uygulamaları için 2025 ve 2026 yıllarına kadar esnek bir seçim sunar.


Başlamadan Önce

Önkoşullar

  1. .NET Ortamı: .NET Framework 4.6.2+ veya .NET Core 3.1+ / .NET 5/6/7/8/9+
  2. NuGet Erişimi: NuGet paketlerini yükleme yeteneği
  3. IronPDF Lisansı: Lisans anahtarınızı ironpdf.com adresinden edinin

NuGet Paket Değişiklikleri

# Remove PuppeteerSharp
dotnet remove package PuppeteerSharp

# Remove downloaded Chromium binaries (~300MB recovered)
# Delete the .local-chromium folder

# Add IronPDF
dotnet add package IronPdf
# Remove PuppeteerSharp
dotnet remove package PuppeteerSharp

# Remove downloaded Chromium binaries (~300MB recovered)
# Delete the .local-chromium folder

# Add IronPDF
dotnet add package IronPdf
SHELL

IronPDF ile BrowserFetcher.DownloadAsync() gerekmez - oluşturma motoru otomatik olarak bir araya getirilir.

Lisans Yapılandırması

// Add at application startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
// Add at application startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
' Add at application startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
$vbLabelText   $csharpLabel

API Referansının Tamamı

Namespace Değişiklikleri

// Before: PuppeteerSharp
using PuppeteerSharp;
using PuppeteerSharp.Media;
using System.Threading.Tasks;

// After: IronPDF
using IronPdf;
using IronPdf.Rendering;
// Before: PuppeteerSharp
using PuppeteerSharp;
using PuppeteerSharp.Media;
using System.Threading.Tasks;

// After: IronPDF
using IronPdf;
using IronPdf.Rendering;
' Before: PuppeteerSharp
Imports PuppeteerSharp
Imports PuppeteerSharp.Media
Imports System.Threading.Tasks

' After: IronPDF
Imports IronPdf
Imports IronPdf.Rendering
$vbLabelText   $csharpLabel

Temel API Eşleştirmeleri

PuppeteerSharp API IronPDF API Notlar
new BrowserFetcher().DownloadAsync() Gerekli değil Tarayıcı indirmesi yok
Puppeteer.LaunchAsync(options) Gerekli değil Tarayıcı yönetimi yok
browser.NewPageAsync() Gerekli değil Sayfa bağlamı yok
page.GoToAsync(url) renderer.RenderUrlAsPdf(url) Doğrudan işleme
page.SetContentAsync(html) renderer.RenderHtmlAsPdf(html) Doğrudan işleme
page.PdfAsync(path) pdf.SaveAs(path) İşlemeden sonra
await page.CloseAsync() Gerekli değil Otomatik temizleme
await browser.CloseAsync() Gerekli değil Otomatik temizleme
PdfOptions.Format RenderingOptions.PaperSize Kağıt boyutu
PdfOptions.Landscape RenderingOptions.PaperOrientation Yönlendirme
PdfOptions.MarginOptions RenderingOptions.MarginTop/Bottom/Left/Right Bireysel kenar boşlukları
PdfOptions.PrintBackground RenderingOptions.PrintHtmlBackgrounds Arka plan baskısı
PdfOptions.HeaderTemplate RenderingOptions.HtmlHeader HTML üstbilgileri
PdfOptions.FooterTemplate RenderingOptions.HtmlFooter HTML altbilgileri
page.WaitForSelectorAsync() RenderingOptions.WaitFor.HtmlElementId Element bekleyişi

Kod Geçiş Örnekleri

Örnek 1: Temel HTML'den PDF'e Dönüşüm

Önce (PuppeteerSharp):

// NuGet: Install-Package PuppeteerSharp
using PuppeteerSharp;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        var browserFetcher = new BrowserFetcher();
        await browserFetcher.DownloadAsync();

        await using var browser = await Puppeteer.LaunchAsync(new LaunchOptions
        {
            Headless = true
        });

        await using var page = await browser.NewPageAsync();
        await page.SetContentAsync("<h1>Hello World</h1><p>This is a PDF document.</p>");
        await page.PdfAsync("output.pdf");
    }
}
// NuGet: Install-Package PuppeteerSharp
using PuppeteerSharp;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        var browserFetcher = new BrowserFetcher();
        await browserFetcher.DownloadAsync();

        await using var browser = await Puppeteer.LaunchAsync(new LaunchOptions
        {
            Headless = true
        });

        await using var page = await browser.NewPageAsync();
        await page.SetContentAsync("<h1>Hello World</h1><p>This is a PDF document.</p>");
        await page.PdfAsync("output.pdf");
    }
}
Imports PuppeteerSharp
Imports System.Threading.Tasks

Module Program
    Async Function Main(args As String()) As Task
        Dim browserFetcher = New BrowserFetcher()
        Await browserFetcher.DownloadAsync()

        Using browser = Await Puppeteer.LaunchAsync(New LaunchOptions With {
            .Headless = True
        })

            Using page = Await browser.NewPageAsync()
                Await page.SetContentAsync("<h1>Hello World</h1><p>This is a PDF document.</p>")
                Await page.PdfAsync("output.pdf")
            End Using
        End Using
    End Function
End Module
$vbLabelText   $csharpLabel

Sonra (IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main(string[] args)
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1><p>This is a PDF document.</p>");
        pdf.SaveAs("output.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main(string[] args)
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1><p>This is a PDF document.</p>");
        pdf.SaveAs("output.pdf");
    }
}
Imports IronPdf

Class Program
    Shared Sub Main(args As String())
        Dim renderer = New ChromePdfRenderer()
        Dim pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1><p>This is a PDF document.</p>")
        pdf.SaveAs("output.pdf")
    End Sub
End Class
$vbLabelText   $csharpLabel

Bu örnek temel mimari farkı göstermektedir.PuppeteerSharpaltı asenkron işlem gerektirir: BrowserFetcher.DownloadAsync() (300MB+ Chromium indir), Puppeteer.LaunchAsync(), browser.NewPageAsync(), page.SetContentAsync(), ve page.PdfAsync(), artı doğru bir şekilde yok etme ile await using.

IronPDF bu tüm karmaşıklığı ortadan kaldırır: bir ChromePdfRenderer oluşturun, RenderHtmlAsPdf() çağırın, ve SaveAs() yapın. Asenkron desenler yok, tarayıcı yaşam döngüsü yok, Chromium indirmeleri yok. IronPDF'in yaklaşımı, daha temiz bir sözdizimi ve modern .NET uygulamalarıyla daha iyi entegrasyon sunar. Kapsamlı örnekler için HTML'den PDF'e döndürme belgesine bakın.

Örnek 2: URL'den PDF'e Dönüştürme

Önce (PuppeteerSharp):

// NuGet: Install-Package PuppeteerSharp
using PuppeteerSharp;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        var browserFetcher = new BrowserFetcher();
        await browserFetcher.DownloadAsync();

        await using var browser = await Puppeteer.LaunchAsync(new LaunchOptions
        {
            Headless = true
        });

        await using var page = await browser.NewPageAsync();
        await page.GoToAsync("https://www.example.com");
        await page.PdfAsync("webpage.pdf");
    }
}
// NuGet: Install-Package PuppeteerSharp
using PuppeteerSharp;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        var browserFetcher = new BrowserFetcher();
        await browserFetcher.DownloadAsync();

        await using var browser = await Puppeteer.LaunchAsync(new LaunchOptions
        {
            Headless = true
        });

        await using var page = await browser.NewPageAsync();
        await page.GoToAsync("https://www.example.com");
        await page.PdfAsync("webpage.pdf");
    }
}
Imports PuppeteerSharp
Imports System.Threading.Tasks

Module Program
    Async Function Main(args As String()) As Task
        Dim browserFetcher = New BrowserFetcher()
        Await browserFetcher.DownloadAsync()

        Using browser = Await Puppeteer.LaunchAsync(New LaunchOptions With {
            .Headless = True
        })

            Using page = Await browser.NewPageAsync()
                Await page.GoToAsync("https://www.example.com")
                Await page.PdfAsync("webpage.pdf")
            End Using
        End Using
    End Function
End Module
$vbLabelText   $csharpLabel

Sonra (IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main(string[] args)
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderUrlAsPdf("https://www.example.com");
        pdf.SaveAs("webpage.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main(string[] args)
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderUrlAsPdf("https://www.example.com");
        pdf.SaveAs("webpage.pdf");
    }
}
Imports IronPdf

Class Program
    Shared Sub Main(ByVal args As String())
        Dim renderer = New ChromePdfRenderer()
        Dim pdf = renderer.RenderUrlAsPdf("https://www.example.com")
        pdf.SaveAs("webpage.pdf")
    End Sub
End Class
$vbLabelText   $csharpLabel

PuppeteerSharp, bir URL'ye gitmek için GoToAsync() kullanır, ardından PdfAsync(). IronPDF, gezinme ve PDF oluşturma işlemlerini tek bir çağrıda ele alan bir tek RenderUrlAsPdf() metodu sağlar. Detayli bilgi icin eğitimlerimize bakin.

Örnek 3: Kenar Boşlukları ile Özel Sayfa Ayarları

Önce (PuppeteerSharp):

// NuGet: Install-Package PuppeteerSharp
using PuppeteerSharp;
using PuppeteerSharp.Media;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        var browserFetcher = new BrowserFetcher();
        await browserFetcher.DownloadAsync();

        await using var browser = await Puppeteer.LaunchAsync(new LaunchOptions
        {
            Headless = true
        });

        await using var page = await browser.NewPageAsync();
        await page.SetContentAsync("<h1>Custom PDF</h1><p>With landscape orientation and margins.</p>");

        await page.PdfAsync("custom.pdf", new PdfOptions
        {
            Format = PaperFormat.A4,
            Landscape = true,
            MarginOptions = new MarginOptions
            {
                Top = "20mm",
                Bottom = "20mm",
                Left = "20mm",
                Right = "20mm"
            }
        });
    }
}
// NuGet: Install-Package PuppeteerSharp
using PuppeteerSharp;
using PuppeteerSharp.Media;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        var browserFetcher = new BrowserFetcher();
        await browserFetcher.DownloadAsync();

        await using var browser = await Puppeteer.LaunchAsync(new LaunchOptions
        {
            Headless = true
        });

        await using var page = await browser.NewPageAsync();
        await page.SetContentAsync("<h1>Custom PDF</h1><p>With landscape orientation and margins.</p>");

        await page.PdfAsync("custom.pdf", new PdfOptions
        {
            Format = PaperFormat.A4,
            Landscape = true,
            MarginOptions = new MarginOptions
            {
                Top = "20mm",
                Bottom = "20mm",
                Left = "20mm",
                Right = "20mm"
            }
        });
    }
}
Imports PuppeteerSharp
Imports PuppeteerSharp.Media
Imports System.Threading.Tasks

Module Program
    Async Function Main(args As String()) As Task
        Dim browserFetcher = New BrowserFetcher()
        Await browserFetcher.DownloadAsync()

        Await Using browser = Await Puppeteer.LaunchAsync(New LaunchOptions With {
            .Headless = True
        })

            Await Using page = Await browser.NewPageAsync()
                Await page.SetContentAsync("<h1>Custom PDF</h1><p>With landscape orientation and margins.</p>")

                Await page.PdfAsync("custom.pdf", New PdfOptions With {
                    .Format = PaperFormat.A4,
                    .Landscape = True,
                    .MarginOptions = New MarginOptions With {
                        .Top = "20mm",
                        .Bottom = "20mm",
                        .Left = "20mm",
                        .Right = "20mm"
                    }
                })
            End Using
        End Using
    End Function
End Module
$vbLabelText   $csharpLabel

Sonra (IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;

class Program
{
    static void Main(string[] args)
    {
        var renderer = new ChromePdfRenderer();
        renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
        renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape;
        renderer.RenderingOptions.MarginTop = 20;
        renderer.RenderingOptions.MarginBottom = 20;
        renderer.RenderingOptions.MarginLeft = 20;
        renderer.RenderingOptions.MarginRight = 20;

        var pdf = renderer.RenderHtmlAsPdf("<h1>Custom PDF</h1><p>With landscape orientation and margins.</p>");
        pdf.SaveAs("custom.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;

class Program
{
    static void Main(string[] args)
    {
        var renderer = new ChromePdfRenderer();
        renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
        renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape;
        renderer.RenderingOptions.MarginTop = 20;
        renderer.RenderingOptions.MarginBottom = 20;
        renderer.RenderingOptions.MarginLeft = 20;
        renderer.RenderingOptions.MarginRight = 20;

        var pdf = renderer.RenderHtmlAsPdf("<h1>Custom PDF</h1><p>With landscape orientation and margins.</p>");
        pdf.SaveAs("custom.pdf");
    }
}
Imports IronPdf
Imports IronPdf.Rendering

Class Program
    Shared Sub Main(args As String())
        Dim renderer = New ChromePdfRenderer()
        renderer.RenderingOptions.PaperSize = PdfPaperSize.A4
        renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape
        renderer.RenderingOptions.MarginTop = 20
        renderer.RenderingOptions.MarginBottom = 20
        renderer.RenderingOptions.MarginLeft = 20
        renderer.RenderingOptions.MarginRight = 20

        Dim pdf = renderer.RenderHtmlAsPdf("<h1>Custom PDF</h1><p>With landscape orientation and margins.</p>")
        pdf.SaveAs("custom.pdf")
    End Sub
End Class
$vbLabelText   $csharpLabel

Bu örnek, iki kütüphane arasındaki PDF seçeneklerinin nasıl eşlendiğini gösterir. PuppeteerSharp, PdfOptions ile birlikte Format, Landscape, ve MarginOptions string değerler içeren "20mm" kullanır. IronPDF, doğrudan kağıt boyutu enumları, yönlendirme enumları ve milimetre cinsinden sayısal boşluk değerlerine sahip RenderingOptions özelliklerini kullanır.

Anahtar eşlemeler:

  • Format = PaperFormat.A4PaperSize = PdfPaperSize.A4
  • Landscape = truePaperOrientation = PdfPaperOrientation.Landscape
  • MarginOptions.Top = "20mm"MarginTop = 20 (sayısal milimetre)

Bellek Sızıntısı Problemi

PuppeteerSharp, sürekli yük altında bellek birikimiyle ünlüdür:

// ❌PuppeteerSharp- Memory grows with each operation
// Requires explicit browser recycling every N operations
for (int i = 0; i < 1000; i++)
{
    var page = await browser.NewPageAsync();
    await page.SetContentAsync($"<h1>Document {i}</h1>");
    await page.PdfAsync($"doc_{i}.pdf");
    await page.CloseAsync(); // Memory still accumulates!
}
// Must periodically: await browser.CloseAsync(); and re-launch

// ✅IronPDF- Stable memory, reuse renderer
var renderer = new ChromePdfRenderer();
for (int i = 0; i < 1000; i++)
{
    var pdf = renderer.RenderHtmlAsPdf($"<h1>Document {i}</h1>");
    pdf.SaveAs($"doc_{i}.pdf");
    // Memory managed automatically
}
// ❌PuppeteerSharp- Memory grows with each operation
// Requires explicit browser recycling every N operations
for (int i = 0; i < 1000; i++)
{
    var page = await browser.NewPageAsync();
    await page.SetContentAsync($"<h1>Document {i}</h1>");
    await page.PdfAsync($"doc_{i}.pdf");
    await page.CloseAsync(); // Memory still accumulates!
}
// Must periodically: await browser.CloseAsync(); and re-launch

// ✅IronPDF- Stable memory, reuse renderer
var renderer = new ChromePdfRenderer();
for (int i = 0; i < 1000; i++)
{
    var pdf = renderer.RenderHtmlAsPdf($"<h1>Document {i}</h1>");
    pdf.SaveAs($"doc_{i}.pdf");
    // Memory managed automatically
}
' ❌PuppeteerSharp- Memory grows with each operation
' Requires explicit browser recycling every N operations
For i As Integer = 0 To 999
    Dim page = Await browser.NewPageAsync()
    Await page.SetContentAsync($"<h1>Document {i}</h1>")
    Await page.PdfAsync($"doc_{i}.pdf")
    Await page.CloseAsync() ' Memory still accumulates!
Next
' Must periodically: Await browser.CloseAsync() and re-launch

' ✅IronPDF- Stable memory, reuse renderer
Dim renderer As New ChromePdfRenderer()
For i As Integer = 0 To 999
    Dim pdf = renderer.RenderHtmlAsPdf($"<h1>Document {i}</h1>")
    pdf.SaveAs($"doc_{i}.pdf")
    ' Memory managed automatically
Next
$vbLabelText   $csharpLabel

IronPDF, PuppeteerSharp'ın gerektirdiği tarayıcı havuzu altyapısına olan ihtiyaçı ortadan kaldırır:

// Before (PuppeteerSharp - delete entire class)
public class PuppeteerBrowserPool
{
    private readonly ConcurrentBag<IBrowser> _browsers;
    private readonly SemaphoreSlim _semaphore;
    private int _operationCount;
    // ... recycling logic ...
}

// After (IronPDF - simple reuse)
public class PdfService
{
    private readonly ChromePdfRenderer _renderer = new();

    public byte[] Generate(string html)
    {
        return _renderer.RenderHtmlAsPdf(html).BinaryData;
    }
}
// Before (PuppeteerSharp - delete entire class)
public class PuppeteerBrowserPool
{
    private readonly ConcurrentBag<IBrowser> _browsers;
    private readonly SemaphoreSlim _semaphore;
    private int _operationCount;
    // ... recycling logic ...
}

// After (IronPDF - simple reuse)
public class PdfService
{
    private readonly ChromePdfRenderer _renderer = new();

    public byte[] Generate(string html)
    {
        return _renderer.RenderHtmlAsPdf(html).BinaryData;
    }
}
' Before (PuppeteerSharp - delete entire class)
Public Class PuppeteerBrowserPool
    Private ReadOnly _browsers As ConcurrentBag(Of IBrowser)
    Private ReadOnly _semaphore As SemaphoreSlim
    Private _operationCount As Integer
    ' ... recycling logic ...
End Class

' After (IronPDF - simple reuse)
Public Class PdfService
    Private ReadOnly _renderer As New ChromePdfRenderer()

    Public Function Generate(html As String) As Byte()
        Return _renderer.RenderHtmlAsPdf(html).BinaryData
    End Function
End Class
$vbLabelText   $csharpLabel

Kritik Geçiş Notları

Asenkron'dan Senkron'a Dönüşüm

PuppeteerSharp, ortamda asenkron/await gerektirir;IronPDFsenkron işlemleri destekler:

// PuppeteerSharp: Async required
public async Task<byte[]> GeneratePdfAsync(string html)
{
    await new BrowserFetcher().DownloadAsync();
    await using var browser = await Puppeteer.LaunchAsync(...);
    await using var page = await browser.NewPageAsync();
    await page.SetContentAsync(html);
    return await page.PdfDataAsync();
}

// IronPDF: Sync default
public byte[] GeneratePdf(string html)
{
    var renderer = new ChromePdfRenderer();
    return renderer.RenderHtmlAsPdf(html).BinaryData;
}

// Or async when needed
public async Task<byte[]> GeneratePdfAsync(string html)
{
    var renderer = new ChromePdfRenderer();
    var pdf = await renderer.RenderHtmlAsPdfAsync(html);
    return pdf.BinaryData;
}
// PuppeteerSharp: Async required
public async Task<byte[]> GeneratePdfAsync(string html)
{
    await new BrowserFetcher().DownloadAsync();
    await using var browser = await Puppeteer.LaunchAsync(...);
    await using var page = await browser.NewPageAsync();
    await page.SetContentAsync(html);
    return await page.PdfDataAsync();
}

// IronPDF: Sync default
public byte[] GeneratePdf(string html)
{
    var renderer = new ChromePdfRenderer();
    return renderer.RenderHtmlAsPdf(html).BinaryData;
}

// Or async when needed
public async Task<byte[]> GeneratePdfAsync(string html)
{
    var renderer = new ChromePdfRenderer();
    var pdf = await renderer.RenderHtmlAsPdfAsync(html);
    return pdf.BinaryData;
}
Imports System.Threading.Tasks
Imports PuppeteerSharp

' PuppeteerSharp: Async required
Public Async Function GeneratePdfAsync(html As String) As Task(Of Byte())
    Await (New BrowserFetcher()).DownloadAsync()
    Await Using browser = Await Puppeteer.LaunchAsync(...)
        Await Using page = Await browser.NewPageAsync()
            Await page.SetContentAsync(html)
            Return Await page.PdfDataAsync()
        End Using
    End Using
End Function

' IronPDF: Sync default
Public Function GeneratePdf(html As String) As Byte()
    Dim renderer = New ChromePdfRenderer()
    Return renderer.RenderHtmlAsPdf(html).BinaryData
End Function

' Or async when needed
Public Async Function GeneratePdfAsync(html As String) As Task(Of Byte())
    Dim renderer = New ChromePdfRenderer()
    Dim pdf = Await renderer.RenderHtmlAsPdfAsync(html)
    Return pdf.BinaryData
End Function
$vbLabelText   $csharpLabel

Kenarlik Birimi Dönüşümü

PuppeteerSharp, dize birimleri kullanır;IronPDFsayısal milimetre kullanır:

//PuppeteerSharp- string units
MarginOptions = new MarginOptions
{
    Top = "1in",      // 25.4mm
    Bottom = "0.75in", // 19mm
    Left = "1cm",     // 10mm
    Right = "20px"    // ~7.5mm at 96dpi
}

//IronPDF- numeric millimeters
renderer.RenderingOptions.MarginTop = 25;    // mm
renderer.RenderingOptions.MarginBottom = 19;
renderer.RenderingOptions.MarginLeft = 10;
renderer.RenderingOptions.MarginRight = 8;
//PuppeteerSharp- string units
MarginOptions = new MarginOptions
{
    Top = "1in",      // 25.4mm
    Bottom = "0.75in", // 19mm
    Left = "1cm",     // 10mm
    Right = "20px"    // ~7.5mm at 96dpi
}

//IronPDF- numeric millimeters
renderer.RenderingOptions.MarginTop = 25;    // mm
renderer.RenderingOptions.MarginBottom = 19;
renderer.RenderingOptions.MarginLeft = 10;
renderer.RenderingOptions.MarginRight = 8;
MarginOptions = New MarginOptions With {
    .Top = "1in",      ' 25.4mm
    .Bottom = "0.75in", ' 19mm
    .Left = "1cm",     ' 10mm
    .Right = "20px"    ' ~7.5mm at 96dpi
}

renderer.RenderingOptions.MarginTop = 25    ' mm
renderer.RenderingOptions.MarginBottom = 19
renderer.RenderingOptions.MarginLeft = 10
renderer.RenderingOptions.MarginRight = 8
$vbLabelText   $csharpLabel

Başlık/Alt Bilgi Yer Tutucu Dönüşümü

PuppeteerSharpSınıfı IronPDF Yer Tutucu
<span class='pageNumber'> {page}
<span class='totalPages'> {total-pages}
<span class='date'> {date}
<span class='title'> {html-title}

Geçiş Sonrası Yeni Özellikler

IronPDF'ye geçtikten sonra, PuppeteerSharp'un sağlayamayacağı yetenekleri kazanırsınız:

PDF Birleştirme

var pdf1 = renderer.RenderHtmlAsPdf(html1);
var pdf2 = renderer.RenderHtmlAsPdf(html2);
var merged = PdfDocument.Merge(pdf1, pdf2);
merged.SaveAs("merged.pdf");
var pdf1 = renderer.RenderHtmlAsPdf(html1);
var pdf2 = renderer.RenderHtmlAsPdf(html2);
var merged = PdfDocument.Merge(pdf1, pdf2);
merged.SaveAs("merged.pdf");
Dim pdf1 = renderer.RenderHtmlAsPdf(html1)
Dim pdf2 = renderer.RenderHtmlAsPdf(html2)
Dim merged = PdfDocument.Merge(pdf1, pdf2)
merged.SaveAs("merged.pdf")
$vbLabelText   $csharpLabel

Filigranlar

var watermark = new TextStamper
{
    Text = "CONFIDENTIAL",
    FontSize = 48,
    Opacity = 30,
    Rotation = -45
};
pdf.ApplyStamp(watermark);
var watermark = new TextStamper
{
    Text = "CONFIDENTIAL",
    FontSize = 48,
    Opacity = 30,
    Rotation = -45
};
pdf.ApplyStamp(watermark);
Dim watermark As New TextStamper With {
    .Text = "CONFIDENTIAL",
    .FontSize = 48,
    .Opacity = 30,
    .Rotation = -45
}
pdf.ApplyStamp(watermark)
$vbLabelText   $csharpLabel

Şifre Koruması

pdf.SecuritySettings.OwnerPassword = "admin";
pdf.SecuritySettings.UserPassword = "readonly";
pdf.SecuritySettings.AllowUserCopyPasteContent = false;
pdf.SecuritySettings.OwnerPassword = "admin";
pdf.SecuritySettings.UserPassword = "readonly";
pdf.SecuritySettings.AllowUserCopyPasteContent = false;
pdf.SecuritySettings.OwnerPassword = "admin"
pdf.SecuritySettings.UserPassword = "readonly"
pdf.SecuritySettings.AllowUserCopyPasteContent = False
$vbLabelText   $csharpLabel

Dijital İmzalar

var signature = new PdfSignature("certificate.pfx", "password");
pdf.Sign(signature);
var signature = new PdfSignature("certificate.pfx", "password");
pdf.Sign(signature);
Dim signature = New PdfSignature("certificate.pfx", "password")
pdf.Sign(signature)
$vbLabelText   $csharpLabel

PDF/A Uyumu

pdf.SaveAsPdfA("archive.pdf", PdfAVersions.PdfA3b);
pdf.SaveAsPdfA("archive.pdf", PdfAVersions.PdfA3b);
pdf.SaveAsPdfA("archive.pdf", PdfAVersions.PdfA3b)
$vbLabelText   $csharpLabel

Performans Karşılaştırma Özeti

Metrik PuppeteerSharp IronPDF Gelişme
İlk PDF (Soğuk Başlatma) 45s+ ~20s %55'ten fazla hızlı
Sonraki PDF'ler Değişken Tutarlı Öngörülebilir
Bellek Kullanımı 500MB+ (büyür) ~50MB (sabit) %90 daha az hafıza
Disk Alanı (Chromium) 300MB+ 0 İndirmeleri ortadan kaldırın
Tarayıcı İndirmesi Gerekli Gerekli değil Sıfır kurulum
İş Parçacığı Güvenliği Sınırlı Tam Güvenilir eşzamanlılık
PDF Oluşturma Süresi 45s 20s %55 daha hızlı

Goc Kontrol Listesi

Geçiş Öncesi

  • Kod tabanındaki tümPuppeteerSharpkullanımlarını kimliklendirin
  • Belge kenar boşluğu değerlerini belgelerken (dizeleri milimetreye çevirin)
  • Dönüşüm için başlık/alt bilgi yer tutucu sözdizimini not alın
  • Tarayıcı havuzu/geri dönüşüm altyapısını silin
  • ironpdf.com adresindenIronPDFlisans anahtarını alın

Paket Değişiklikleri

  • PuppeteerSharp NuGet paketini kaldır
  • Yaklaşık 300MB disk alanını geri kazanmak için .local-chromium klasörünü sil
  • IronPdf NuGet paketini yükle: dotnet add package IronPdf

Kod Değişiklikleri

  • Ad alanı eklerini güncelleyin
  • BrowserFetcher.DownloadAsync() çağrılarını kaldır
  • Puppeteer.LaunchAsync() ve tarayıcı yönetimini kaldır
  • page.SetContentAsync() + page.PdfAsync() ile RenderHtmlAsPdf() değiştir
  • page.GoToAsync() + page.PdfAsync() ile RenderUrlAsPdf() değiştir
  • Kenar boşluğu stringlerini milimetre değerlerine çevirin
  • Başlık/alt bilgi yer tutucu sözdizimini dönüştürün
  • Tüm tarayıcı/sayfa imha kodunu kaldırın
  • Tarayıcı havuzu altyapısını silin
  • Uygulama başlatıldığında lisans başlatma ekleyin

Geçişten Sonra

  • PDF çıktısının görsel karşılaştırması
  • Bellek istikrarı için yük testi yapın (geri dönüşüm olmadan sabit kalmalı)
  • Sayfa numaraları ile başlık/alt bilgi render'ını doğrulayın
  • Gerektiği gibi yeni yetenekler (güvenlik, filigranlar, birleştirme) ekleyin

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