PuppeteerSharp'tan IronPDF'e C# ile Nasıl Geçilir
PuppeteerSharp'tan IronPDF'ye geçiş, PDF oluşturma iş akışınızı300MB'den fazlaChromium bağımlılığı olan bir tarayıcı otomasyon aracından, otomatik bellek yönetimine sahip amaca yönelik bir PDF kütüphanesine taşır. Bu kılavuz, çalışma zamanında Chromium indirmesini ortadan kaldıran, yük altında rapor edilmiş bellek büyümesini adresleyen ve kapsamlı PDF manipülasyon yetenekleri ekleyen adım adım bir geçiş yolu sağlar.
Neden PuppeteerSharp'dan IronPDF'ye Geçilmeli
PuppeteerSharp'ı Anlamak
PuppeteerSharp, Google'ın Puppeteer'ının .NET portudur, C#'a tarayıcı otomasyonu yetenekleri getirir. Chrome'un yerleşik print-to-PDF işlevselliğini kullanarak PDF'ler oluşturur—tarayıcıda Ctrl+P tuşlarına basmakla aynıdır. Bu, kağıt için optimizasyonlu, ekranda gördüğünüzden farklı baskı hazır çıktılar üretir.
PuppeteerSharp, web testi ve veri kazıma için tasarlanmıştır, belge oluşturma için değil. Yetenekli olsa da, PuppeteerSharp'ın PDF üretimi için kullanılması ciddi üretim zorlukları yaratır.
Tarayıcı Otomasyonu Sorunu
PuppeteerSharp, belge üretimi değil tarayıcı otomasyonu için tasarlandı. Bu, PDF'ler için kullanıldığında temel sorunlar yaratır:
-
300MB'dan fazla Chromium indirmeleri ilk kullanımdan önce gereklidir. PuppeteerSharp'ın önemli bir dezavantajı, esas olarak Chromium ikilisini içerdiği için ağır dağıtım boyutudur. Bu önemli boyut, Docker görüntülerini şişirebilir ve sunucusuz ortamlarda soğuk başlama sorunlarına neden olabilir.
-
Yük altında rapor edilen bellek büyümesi manuel tarayıcı geri dönüşümü gerektirir. Sürekli yük altında,PuppeteerSharpkullanıcıları, genellikle manuel işlem geri dönüşümü ile adreslenen tarayıcı örnekleri arasında bellek birikimi rapor ettmiştir.
-
Tarayıcı yaşam döngüsü yönetimi ile karmaşık asenkron desenler
-
Baskı-izleme çıktısı (Ctrl+P'ye eşdeğer, ekran görüntüsü değil). Düzenler yeniden akabilir, arka planlar varsayılan olarak devre dışı bırakılabilir ve çıktı yazdırma için sayfalara ayrılır, tarayıcı görünümüne uymak yerine.
-
Uyumluluk gereksinimleri için PDF/A veya PDF/UA desteği yok PuppeteerSharp, PDF/A (arşiv) veya PDF/UA (erişilebilirlik) uyumlu belgeler üretemez.
- PDF manipulasyonu yok - sadece üretim, birleştirme/bölme/düzenleme yok.PuppeteerSharpPDF'leri üretmekte verimliyken, daha fazla manipulasyon yeteneklerine sahip değildir, örneğin birleştirme, bölme, güvenceye alma veya PDF'leri düzenleme.
PuppeteerSharpve IronPDF Karşılaştırması
| Aspekt | PuppeteerSharp | IronPDF |
|---|---|---|
| Birincil Amaç | Tarayıcı otomasyonu | PDF oluşturma |
| Chromium Bağımlılığı | 300MB'den fazla ayrı indirme | Yerleşik optimize edilmiş motor |
| API Karmaşıklığı | Asenkron tarayıcı/sayfa yaşam döngüsü | Eşzamanlı tek satırlık ifadeler |
| Başlatma | BrowserFetcher.DownloadAsync() + LaunchAsync |
new ChromePdfRenderer() |
| Bellek Yönetimi | Manuel tarayıcı geri dönüşümü | Otomatik |
| Yük Altında Bellek | Ağır iş yüklerinde büyüme rapor edildi | Sürekli çalışmalarda kararlı |
| PDF/A Desteği | Mevcut değil | Desteklenen |
| PDF/UA Erişilebilirliği | Mevcut değil | Desteklenen |
| PDF Düzenleme | Mevcut değil | Birleştir, böl, damgala, düzenle |
| Dijital İmzalar | Mevcut değil | Desteklenen |
| İş Parçacığı Güvenliği | Sınırlandırılmış (yukarı akış rehberi başına) | Tam |
| Lisanslama | MIT (açık kaynak) | Ticari lisans |
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 | netstandard2.0 aracılığıyla | Tam | Tam | Tam |
IronPDF'in modern .NET hedefleri arasında desteği, mevcut uygulamaların çoğuna uyumlu bir şekilde entegre olmasını sağlar.
Başlamadan Önce
Ön Koşullar
- .NET Ortamı: .NET Framework 4.6.2+ veya .NET Core 3.1+ / .NET 5/6/7/8/9+
- NuGet Erişimi: NuGet paketlerini yükleyebilme
- 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
IronPDF ile BrowserFetcher.DownloadAsync() gerekmez - oluşturma motoru otomatik olarak paketlenmiştir.
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"
Tam API Referansı
Ad Alanı 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
Temel API Eşlemeleri
| PuppeteerSharp API | IronPDF API | Notlar |
|---|---|---|
new BrowserFetcher().DownloadAsync() |
Gerekli değil | Tarayıcı indirme 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 render |
page.SetContentAsync(html) |
renderer.RenderHtmlAsPdf(html) |
Doğrudan render |
page.PdfAsync(path) |
pdf.SaveAs(path) |
Render sonrasında |
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 boşluklar |
PdfOptions.PrintBackground |
RenderingOptions.PrintHtmlBackgrounds |
Arka plan yazdırma |
PdfOptions.HeaderTemplate |
RenderingOptions.HtmlHeader |
HTML başlıklar |
PdfOptions.FooterTemplate |
RenderingOptions.HtmlFooter |
HTML alt bilgiler |
page.WaitForSelectorAsync() |
RenderingOptions.WaitFor.HtmlElementId |
Öğeyi bekle |
Kod Göç Örnekleri
Örnek 1: Temel HTML'den PDF'ye Dönüştürme
Önceki (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
Sonrası (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
Bu örnek, temel yapısal farkı gösterir.PuppeteerSharpaltı asenkron işlemi gerektirir: BrowserFetcher.DownloadAsync() (300MB'den fazla Chromium indirme), Puppeteer.LaunchAsync(), browser.NewPageAsync(), page.SetContentAsync() ve page.PdfAsync(), ayrıca await using ile uygun imha.
IronPDF bu 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'nin yaklaşımı, güncel .NET uygulamaları ile daha temiz söz dizimi ve daha iyi entegrasyon sunar. Kapsamlı örnekler için HTML'den PDF'e dönüşüm belgelerine bakın.
Örnek 2: URL'den PDF'ye Dönüştürme
Önceki (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
Sonrası (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
PuppeteerSharp bir URL'ye gitmek için GoToAsync() kullanır, ardından PdfAsync() gelir. IronPDF, tek bir çağrıda gezinme ve PDF oluşturma işlemlerini ele alan bir RenderUrlAsPdf() yöntemi sağlar. Daha fazla bilgiyi kılavuzlarımızda öğrenin.
Örnek 3: Kenarlıklı Özel Sayfa Ayarları
Önceki (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
Sonrası (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
Bu örnek, iki kütüphane arasındaki PDF seçeneklerinin eşleşmesini gösterir. PuppeteerSharp, içerisinde Format, Landscape ve MarginOptions bulunan string değerler ("20mm") ile PdfOptions kullanır. IronPDF, doğrudan kağıt boyutu ile yönelim sabitleri ve milimetre cinsinden sayısal kenar boşlukları ile RenderingOptions özelliklerini kullanır.
Anahtar eşlemeleri:
Format = PaperFormat.A4→PaperSize = PdfPaperSize.A4Landscape = true→PaperOrientation = PdfPaperOrientation.LandscapeMarginOptions.Top = "20mm"→MarginTop = 20(sayısal milimetre)
Sürekli Yük Altında Bellek Büyümesi
Kullanıcılar, sürekli yük altındaPuppeteerSharpile bellek birikimini, genellikle manuel tarayıcı geri dönüşümü ile giderildiğini rapor etmiştir:
//PuppeteerSharp- memory growth typically requires periodic recycling
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();
}
// Recommended: await browser.CloseAsync(); and re-launch every N operations
//IronPDF- reuse a single renderer across operations
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 growth typically requires periodic recycling
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();
}
// Recommended: await browser.CloseAsync(); and re-launch every N operations
//IronPDF- reuse a single renderer across operations
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
}
Imports PuppeteerSharp
Imports IronPdf
' PuppeteerSharp- memory growth typically requires periodic recycling
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()
Next
' Recommended: Await browser.CloseAsync() and re-launch every N operations
' IronPDF- reuse a single renderer across operations
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
IronPDF, PuppeteerSharp'ın gerektirdiği tarayıcı havuzu altyapısını 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
Kritik Taşıma Notları
Asenkronu Eşzamana Dönüştürme
PuppeteerSharp, async/await gerektirir;IronPDF senkron 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
Kenar Boşluğu Birimi Dönüşümü
PuppeteerSharp, dize birimleri kullanır;IronPDF sayısal milimetreler 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
Başlık/Altbilgi Yer Tutucu Dönüşümü
| PuppeteerSharp Sı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çiş yaptıktan sonra PuppeteerSharp'ın sağlayamadığı yetenekler 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")
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)
Şifre Koruma
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
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)
PDF/A Uyumluğu
pdf.SaveAsPdfA("archive.pdf", PdfAVersions.PdfA3b);
pdf.SaveAsPdfA("archive.pdf", PdfAVersions.PdfA3b);
pdf.SaveAsPdfA("archive.pdf", PdfAVersions.PdfA3b)
Performans Karşılaştırma Özeti
| Metrik | PuppeteerSharp | IronPDF | İyileştirme |
|---|---|---|---|
| İlk PDF (Soğuk Başlatma) | 45+ saniye | 20s | %55+ daha hızlı |
| Sonraki PDF'ler | Değişken | Tutarlı | Öngörülebilir |
| Bellek Kullanımı | 500MB+ (büyür) | ~50MB (kararlı) | %90 daha az bellek |
| Disk Alanı (Chromium) | 300MB'den fazla | 0 | İndirmeleri ortadan kaldır |
| Tarayıcı İndirme | Gereklidir | Gerekli değil | Kurulum sıfır |
| İş 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ı |
Geçiş Kontrol Listesi
Öncesi-Geçiş
- Kod tabanında tümPuppeteerSharpkullanımlarını tespit edin
- Kenar boşluk değerlerini belgeleyin (dize değerlerini milimetreye dönüştürün)
- Dönüştürme için başlık/altbilgi yer tutucu sözdizimini not edin
- Tarayıcı havuzlama/yenileme altyapısını silin
- ironpdf.com adresinden IronPDF lisans anahtarını edinin
Paket Değişiklikleri
PuppeteerSharpNuGet paketini kaldır- Yaklaşık 300MB disk alanını geri kazanmak için
.local-chromiumklasörünü sil IronPdfNuGet paketini yükleyin:dotnet add package IronPdf
Kod Değişiklikleri
- Ad alanı ithalatlarını güncelleyin
BrowserFetcher.DownloadAsync()çağrılarını kaldırınPuppeteer.LaunchAsync()ve tarayıcı yönetimini kaldırınpage.SetContentAsync()+page.PdfAsync()ileRenderHtmlAsPdf()değiştirinpage.GoToAsync()+page.PdfAsync()ileRenderUrlAsPdf()değiştirin- Marjin dizelerini milimetre değerlerine dönüştürün
- Başlık/altbilgi yer tutucu sözdizimini dönüştürün
- Tüm tarayıcı/sayfa bertaraf kodunu kaldırın
- Tarayıcı havuzlama altyapısını silin
- Uygulama başlangıcında lisans başlatma ekle
Geçiş Sonrası
- PDF çıktısının görsel karşılaştırması
- Bellek kararlılığı için yük testi yapın (yenileme olmadan kararlı kalmalı)
- Sayfa numaraları ile başlık/altbilgi işlemesini doğrulayın
- Gerektiğinde yeni yetenekler ekleyin (güvenlik, filigranlar, birleştirme)

