C# 14 PDF Oluşturucu – Kapsamlı Kılavuz (2025 Baskısı)
C#'da PDF oluşturmak, finansal raporlar hazırlamak, sağlık belgeleri oluşturmak veya e-ticaret makbuzları üretmek için modern .NET geliştiricileri için önemli bir beceridir. Doğru .NET PDF kütüphanesi ile sadece birkaç satır kodla HTML içeriğini profesyonel PDF belgelerine dönüştürebilir, belge yapısını ve görünümünü tamamen kontrol edebilirsiniz.
IronPDF, çok uzak ara en basit ve kullanışlı .NET PDF oluşturma kütüphanesidir - öğrenmesi inanılmaz derecede kolay bir eğriyle PDF'ler oluşturmayı dakikalar içinde, saatler değil. Bu kapsamlı kılavuz, IronPDF kullanarak tam olarak nasıl PDF belgeleri oluşturabileceğinizi gösterecek - güçlü bir C# PDF üreticisidir ve en yeni .NET platformlarında piksel mükemmel sonuçlar üretir, yaklaşan Kasım 2025'teki .NET 10 sürümü dahil. Bu eğitim, en basit kullanım senaryolarından en ileri düzey PDF oluşturma senaryolarına kadar her şeyi kapsıyor, korkmayın - baştan başlayın ve ileri doğru devam edin. Basit HTML dizgilerinden karmaşık çok sayfalı raporlara kadar PDF'ler oluşturmanın birden fazla yolunu öğreneceksiniz; artı ortak sorunları giderme ve farklı PDF oluşturma görevleri için performansı optimize etme yolları.
Neleri Öğreneceksiniz
- Hızlı Başlangıç: İlk PDF'nizi 2 Dakikadan Daha Kısa Sürede Oluşturun
- Geliştiriciler Neden C#'da PDF Oluşturmalı?
- C# Projenize IronPDF Kurulumu
- C#'da PDF Oluşturmanın Farklı Yolları?
- PDF'lerimi Nasıl Profesyonel Gösteririm?
Hızlı Başlangıç: İlk PDF'nizi C#'da Oluşturun (2 Dakikadan Daha Az)
Hemen şimdi bir PDF oluşturmak ister misiniz? .NET'te PDF oluşturmanın gücünü gösteren basit ama işlevsel bir PDF belge oluşturalım. Öncelikle, IronPDF'i yükleyin NuGet Paket Yöneticisi ile - bu tek paket PDF'ler oluşturmaya başlamak için ihtiyacınız olan her şeyi içerir. IronPDF geliştirme için ücretsizdir, böylece bir lisans almadan önce tüm özellikleri deneyebilirsiniz.
Install-Package IronPdf
Şimdi C# kullanarak PDF içeriği oluşturalım:
using IronPdf;
// Instantiate the PDF generator - this is your gateway to PDF creation
var renderer = new ChromePdfRenderer();
// Create a PDF from HTML string - yes, it's really this simple!
var pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1><p>PDF generated successfully!</p>");
// Save your newly created PDF document
pdf.SaveAs("my-first-pdf.pdf");
Console.WriteLine("PDF generated successfully!");
using IronPdf;
// Instantiate the PDF generator - this is your gateway to PDF creation
var renderer = new ChromePdfRenderer();
// Create a PDF from HTML string - yes, it's really this simple!
var pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1><p>PDF generated successfully!</p>");
// Save your newly created PDF document
pdf.SaveAs("my-first-pdf.pdf");
Console.WriteLine("PDF generated successfully!");
Imports IronPdf
' Instantiate the PDF generator - this is your gateway to PDF creation
Private renderer = New ChromePdfRenderer()
' Create a PDF from HTML string - yes, it's really this simple!
Private pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1><p>PDF generated successfully!</p>")
' Save your newly created PDF document
pdf.SaveAs("my-first-pdf.pdf")
Console.WriteLine("PDF generated successfully!")
İşte bu kadar! C#'da ilk PDF belgenizi oluşturdunuz. Karmaşık PDF API'lerini öğrenmeye gerek yok, yükleyecek sunucu bağımlılıkları yok, öğrenilecek düşük seviyeli PDF komutları yok. Sadece HTML içeriği PDF olarak - PDF oluşturmanın en iyi yolu. Ama bu sadece başlangıç - neden bu yaklaşımın bu kadar güçlü olduğunu ve daha sofistike PDF belgeleri nasıl oluşturabileceğinizi keşfedelim.
C#'de PDF Nasıl Oluşturulur: Hızlı Bir Genel Bakış
C#'de PDF oluşturmak için IronPDF, QuestPDF veya PDFSharp gibi üçüncü taraf kütüphaneleri kullanabilirsiniz. Bu kütüphaneler, sıfırdan PDF oluşturma, HTML'yi PDF'ye dönüştürme ve daha fazlası gibi çeşitli işlevsellikler sunar.
İşlemin genel bir taslağı burada:
- Bir PDF kütüphanesi yükleyin: Uygun bir kütüphaneyi yüklemek için Visual Studio'da NuGet Paket Yöneticisini kullanın.
- Yeni bir PDF belgesi oluşturun: Bir PDF belge nesnesi oluşturun.
- İçerik ekleyin: Belgeye sayfalar, metinler, resimler ve diğer öğeler ekleyin.
- Belgeyi kaydedin: Bir dosya yolu belirtin ve PDF'yi kaydedin.
IronPDF kullanarak bir örnek:
using IronPdf;
public class Example
{
public static void CreatePdf()
{
// Create a new PDF document
var pdf = new ChromePdfRenderer();
// Add some text
string htmlContent = "<h1>Hello, PDF!</h1><p>This is a dynamically created PDF.</p>";
// Render HTML to PDF
var pdfDocument = pdf.RenderHtmlAsPdf(htmlContent);
// Save the PDF
pdfDocument.SaveAs("MyDynamicPdf.pdf");
}
}
using IronPdf;
public class Example
{
public static void CreatePdf()
{
// Create a new PDF document
var pdf = new ChromePdfRenderer();
// Add some text
string htmlContent = "<h1>Hello, PDF!</h1><p>This is a dynamically created PDF.</p>";
// Render HTML to PDF
var pdfDocument = pdf.RenderHtmlAsPdf(htmlContent);
// Save the PDF
pdfDocument.SaveAs("MyDynamicPdf.pdf");
}
}
Imports IronPdf
Public Class Example
Public Shared Sub CreatePdf()
' Create a new PDF document
Dim pdf = New ChromePdfRenderer()
' Add some text
Dim htmlContent As String = "<h1>Hello, PDF!</h1><p>This is a dynamically created PDF.</p>"
' Render HTML to PDF
Dim pdfDocument = pdf.RenderHtmlAsPdf(htmlContent)
' Save the PDF
pdfDocument.SaveAs("MyDynamicPdf.pdf")
End Sub
End Class
Şimdi, geliştiricilerin PDF oluşturma ihtiyacını daha derinlemesine inceleyelim ve IronPDF'in bu süreci nasıl basit ve güçlü hale getirdiğini keşfedelim.
Geliştiriciler Neden C#'da PDF Oluşturmalı?
C#'da programatik olarak PDF oluşturmak, belge oluşturmayı otomatikleştirmek ve iş süreçlerini hızlandırmak için sonsuz olanaklar açar. IronPDF, dünya çapında 14 milyondan fazla yüklenen geliştirici tarafından bu görevleri başarmak için güvenilmiştir çünkü .NET'te PDF oluşturma için benzersiz güvenilirlik ve kullanım kolaylığı sağlar. Finans sektöründe, geliştiriciler C#'yi PDF faturaları, raporlar ve düzenleyici raporlar oluşturmak için kullanır ve bu belgeler hassas biçimlendirme ve güvenlik özellikleri gerektirir. Sağlık kuruluşları hasta kayıtları, laboratuvar sonuçları ve sigorta formlarını PDF olarak üretir ve belge bütünlüğü ve HIPAA uyumluluğu sağlanır. E-ticaret platformları doğrudan PDF'ye gömülü QR kodlarıyla PDF makbuzları, gönderim etiketleri ve biletler üretirler (IronQR gibi araçlar kullanılarak). PDF belgelerini programatik olarak manipüle etme yeteneği sayesinde, belgelerinizi geniş ölçekte manuel müdahale olmadan oluşturabilir, değiştirebilir ve güvence altına alabilirsiniz.
Modern .NET PDF kitaplığı kullanmanın avantajı IronPDF, mevcut iş akışlarınıza kusursuz biçimde entegre olur. İş kullanıcılarınızdan Word belgelerini dönüştürme olsun, geliştirme ekibinizden Markdown belgelerini dönüştürme ya da web tabanlı raporlardan PDF oluşturma olsun, IronPDF her şeyi halleder. Bu organizasyonel esneklik, şirketlerin programatik .NET'te PDF oluşturmayı tercih etme nedenidir - manuel belge oluşturmayı ortadan kaldırır, hataları azaltır, tüm oluşturulan PDF'lerde tutarlılığı sağlar ve çalışanların sınırsız saatlerce zaman kazanmasına yardımcı olur. Özel PDF sözdizimini öğrenmek veya her öğeyi manuel olarak konumlandırmak yerine, belgelerinizi tasarlamak için HTML ve CSS'yi kullanabilirsiniz. Bu yaklaşım, geliştirme süresini önemli ölçüde azaltır ve üretilen tüm PDF'lerinizde tutarlı markalaşmayı sürdürmenizi kolaylaştırır. İster tek sayfalık bir fatura ister karmaşık bir çok bölümlü rapor oluşturuyor olun, ilkeler hep aynı - HTML ile tasarlayın, PDF'leri C# ile oluşturun.
C# Projenize IronPDF Kurmak
PDF'ler oluşturmaya başlamadan önce, PDF oluşturmanın en iyi şekilde yapılması için gelişim ortamınızın doğru şekilde yapılandırıldığından emin olalım. IronPDF, tüm modern .NET sürümlerini destekler, .NET 8, .NET 9 ve gelecek Kasım 2025'te planlanan .NET 10 sürümüyle uyumludur (Iron Software, birinci gün uyumluluğu sağlamak için .NET Foundation ve Microsoft ile yakın çalışır). Kurulum süreci basittir, ancak seçeneklerinizi anlamak, belirli ihtiyaçlarınız için en iyi yaklaşımı seçmenize yardımcı olur.
Yükleme Yöntemleri
Yöntem 1: Visual Studio Paket Yöneticisi (Yeni Başlayanlar İçin Tavsiye Edilir)
IronPDF ile çalışmaya başlamanın en kolay yolu Visual Studio'nun yerleşik NuGet Paket Yöneticisi ile yapılır. Bu grafiksel arayüz, PDF oluşturma bağımlılıklarını taramak, yüklemek ve yönetmek için basit yöntemler sunar:
- Çözüm Gezgini'nde projenize sağ tıklayın
- "NuGet Paketlerini Yönet" seçeneğini seçin
- "Gözat"a tıklayın ve "IronPDF" arayın
- Iron Software tarafından IronPDF paketini seçin
- Yükle'ye tıklayın ve lisans sözleşmesini kabul edin
Yöntem 2: Paket Yöneticisi Konsolu
Komut satırı araçlarını tercih eden geliştiriciler için Paket Yöneticisi Konsolu, IronPDF'yi yüklemek için hızlı bir yol sunar:
Install-Package IronPdf
Yöntem 3: .NET CLI (Çapraz Platform Geliştirme için)
macOS, Linux üzerinde çalışıyorsanız ya da .NET CLI'yi tercih ediyorsanız, proje dizininizde bu komutu kullanın:
dotnet add package IronPdf
Doğru Paketi Seçmek
IronPDF, çeşitli dağıtım senaryoları için optimize edilmiş farklı NuGet paketleri sunar. Bu seçenekleri anlamak, dağıtım boyutunu en aza indirmenize ve performansı optimize etmenize yardımcı olur:
IronPdf: Windows, macOS ve Linux için ihtiyacınız olan her şeyi içeren standart paket. Çoğu uygulama için mükemmel.IronPdf.Slim: Platforma özgü bileşenleri çalışırken indiren hafif bir temel paket. Paket boyutunun önemli olduğu bulut dağıtımları için idealdir.IronPdf.Linux: Tüm gerekli bağımlılıkları önceden paketlenmiş olarak Linux dağıtımları için özel olarak optimize edilmiştir.IronPdf.MacOs: Yerel Apple Silicon desteğiyle macOS ortamları için özelleştirilmiştir.
Kurulumunuzu Doğrulama
Yüklemeden sonra, her şeyin düzgün çalıştığını doğrulamak için yeni bir belge oluşturan bu basit testi kullanın:
using IronPdf;
using System.IO;
// Test your IronPDF installation
var renderer = new ChromePdfRenderer();
var testPdf = renderer.RenderHtmlAsPdf("<p>Installation test successful!</p>");
testPdf.SaveAs("test.pdf");
if (File.Exists("test.pdf"))
{
Console.WriteLine("IronPDF installed and working correctly!");
}
using IronPdf;
using System.IO;
// Test your IronPDF installation
var renderer = new ChromePdfRenderer();
var testPdf = renderer.RenderHtmlAsPdf("<p>Installation test successful!</p>");
testPdf.SaveAs("test.pdf");
if (File.Exists("test.pdf"))
{
Console.WriteLine("IronPDF installed and working correctly!");
}
Imports IronPdf
Imports System.IO
' Test your IronPDF installation
Private renderer = New ChromePdfRenderer()
Private testPdf = renderer.RenderHtmlAsPdf("<p>Installation test successful!</p>")
testPdf.SaveAs("test.pdf")
If File.Exists("test.pdf") Then
Console.WriteLine("IronPDF installed and working correctly!")
End If
C#'ta PDF'leri Farklı Yollarla Nasıl Oluşturabilirsiniz?
IronPDF, farklı senaryolar ve gereksinimlere uygun, PDF belgeleri oluşturmak için birçok yaklaşım sunar. Bu yöntemleri anlamak, .NET'te PDF üretmeniz gerektiğinde özgül kullanım durumunuz için en verimli yaklaşımı seçmenize yardımcı olur. IronPDF, sıfırdan PDF oluşturmak, mevcut dosyaları dönüştürmek veya canlı web içeriğini yakalamak olsun, kapsamlı bir C# PDF oluşturucu olarak size çözümler sunar. Her yöntemi C#'ta PDF oluşturma için gerçekte kullanılabilecek pratik örneklerle ayrıntılı olarak inceleyelim.
1. HTML Dizgisi ile PDF Oluşturma (En Esnek)
HTML dizgilerinden PDF oluşturmak, son belgenizin içeriği ve stilizasyonu üzerinde tam kontrol sağlar ve HTML içeriğini PDF biçimine dönüştürmeniz gerektiğinde mükemmeldir. Bu yöntem, içeriğin veri bazında değiştiği dinamik raporlar, faturalar veya herhangi bir belge oluşturmak için mükemmeldir. Modern HTML5 ve CSS3 özellikleri, dahil flexbox ve grid düzenleri kullanarak HTML içeriğini profesyonel PDF'lere dönüştürebilirsiniz. HTML içeriğini dinamik olarak dönüştürebilme özelliği, bu yöntemi C#'ta PDF oluşturma için en çok yönlü yaklaşım haline getirir:
using IronPdf;
using System;
using System.Linq;
var renderer = new ChromePdfRenderer();
// Build dynamic content with data
var customerName = "Acme Corporation";
var orderDate = DateTime.Now;
var items = new[] {
new { Name = "Widget Pro", Price = 99.99m },
new { Name = "Gadget Plus", Price = 149.99m }
};
// Create HTML with embedded data and modern CSS
var html = $@"
<html>
<head>
<style>
body {{font-family: 'Segoe UI', Arial, sans-serif;
margin: 40px;
color: #333;}}
.invoice-header {{display: flex;
justify-content: space-between;
border-bottom: 2px solid #0066cc;
padding-bottom: 20px;}}
.items-table {{width: 100%;
margin-top: 30px;
border-collapse: collapse;}}
.items-table th {{background: #f0f0f0;
padding: 10px;
text-align: left;}}
</style>
</head>
<body>
<div class='invoice-header'>
<div>
<h1>Invoice</h1>
<p>Customer: {customerName}</p>
</div>
<div>
<p>Date: {orderDate:yyyy-MM-dd}</p>
<p>Invoice #: INV-{orderDate:yyyyMMdd}-001</p>
</div>
</div>
<table class='items-table'>
<thead>
<tr>
<th>Item</th>
<th>Price</th>
</tr>
</thead>
<tbody>";
foreach (var item in items)
{
html += $@"
<tr>
<td>{item.Name}</td>
<td>${item.Price:F2}</td>
</tr>";
}
html += @"
</tbody>
</table>
</body>
</html>";
// Generate the PDF document
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs($"invoice-{orderDate:yyyyMMdd}.pdf");
using IronPdf;
using System;
using System.Linq;
var renderer = new ChromePdfRenderer();
// Build dynamic content with data
var customerName = "Acme Corporation";
var orderDate = DateTime.Now;
var items = new[] {
new { Name = "Widget Pro", Price = 99.99m },
new { Name = "Gadget Plus", Price = 149.99m }
};
// Create HTML with embedded data and modern CSS
var html = $@"
<html>
<head>
<style>
body {{font-family: 'Segoe UI', Arial, sans-serif;
margin: 40px;
color: #333;}}
.invoice-header {{display: flex;
justify-content: space-between;
border-bottom: 2px solid #0066cc;
padding-bottom: 20px;}}
.items-table {{width: 100%;
margin-top: 30px;
border-collapse: collapse;}}
.items-table th {{background: #f0f0f0;
padding: 10px;
text-align: left;}}
</style>
</head>
<body>
<div class='invoice-header'>
<div>
<h1>Invoice</h1>
<p>Customer: {customerName}</p>
</div>
<div>
<p>Date: {orderDate:yyyy-MM-dd}</p>
<p>Invoice #: INV-{orderDate:yyyyMMdd}-001</p>
</div>
</div>
<table class='items-table'>
<thead>
<tr>
<th>Item</th>
<th>Price</th>
</tr>
</thead>
<tbody>";
foreach (var item in items)
{
html += $@"
<tr>
<td>{item.Name}</td>
<td>${item.Price:F2}</td>
</tr>";
}
html += @"
</tbody>
</table>
</body>
</html>";
// Generate the PDF document
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs($"invoice-{orderDate:yyyyMMdd}.pdf");
Imports IronPdf
Imports System
Imports System.Linq
Dim renderer = New ChromePdfRenderer()
' Build dynamic content with data
Dim customerName = "Acme Corporation"
Dim orderDate = DateTime.Now
Dim items = New() {
New With {.Name = "Widget Pro", .Price = 99.99D},
New With {.Name = "Gadget Plus", .Price = 149.99D}
}
' Create HTML with embedded data and modern CSS
Dim html = $"
<html>
<head>
<style>
body {{font-family: 'Segoe UI', Arial, sans-serif;
margin: 40px;
color: #333;}}
.invoice-header {{display: flex;
justify-content: space-between;
border-bottom: 2px solid #0066cc;
padding-bottom: 20px;}}
.items-table {{width: 100%;
margin-top: 30px;
border-collapse: collapse;}}
.items-table th {{background: #f0f0f0;
padding: 10px;
text-align: left;}}
</style>
</head>
<body>
<div class='invoice-header'>
<div>
<h1>Invoice</h1>
<p>Customer: {customerName}</p>
</div>
<div>
<p>Date: {orderDate:yyyy-MM-dd}</p>
<p>Invoice #: INV-{orderDate:yyyyMMdd}-001</p>
</div>
</div>
<table class='items-table'>
<thead>
<tr>
<th>Item</th>
<th>Price</th>
</tr>
</thead>
<tbody>"
For Each item In items
html += $"
<tr>
<td>{item.Name}</td>
<td>${item.Price:F2}</td>
</tr>"
Next
html += "
</tbody>
</table>
</body>
</html>"
' Generate the PDF document
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs($"invoice-{orderDate:yyyyMMdd}.pdf")
2. URL'den PDF Oluşturma (Web Sayfası Yakalama)
Bazen mevcut web sayfalarını PDF belgelerine dönüştürmeniz gerekir - arşivleme, raporlama veya çevrimdışı versiyonlar oluşturma için idealdir. IronPDF'nin URL'den PDF'ye dönüştürme, karmaşık JavaScript ağırlıklı sitelerin doğru şekilde görüntülenmesini sağlayan gerçek bir Chromium motoru kullanır. Bu yöntem, panoların anlık görüntülerini oluşturmak, çevrimiçi makbuzları kaydetmek veya web tabanlı raporları belgelemek için paha biçilmezdir:
using IronPdf;
var renderer = new ChromePdfRenderer();
// Configure rendering options for optimal capture
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.MarginTop = 25;
renderer.RenderingOptions.MarginBottom = 25;
// Wait for JavaScript to fully load (important for SPAs)
renderer.RenderingOptions.RenderDelay = 2000; // 2 seconds
// Enable JavaScript execution
renderer.RenderingOptions.EnableJavaScript = true;
// Capture a web page as PDF
var pdf = renderer.RenderUrlAsPdf("https://example.com/dashboard");
pdf.SaveAs("dashboard-capture.pdf");
// For authenticated pages, you can set cookies
var cookieManager = renderer.RenderingOptions.CustomCookies;
cookieManager["session_id"] = "your-session-token";
// Capture authenticated content
var securePdf = renderer.RenderUrlAsPdf("https://app.example.com/private/report");
securePdf.SaveAs("private-report.pdf");
using IronPdf;
var renderer = new ChromePdfRenderer();
// Configure rendering options for optimal capture
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.MarginTop = 25;
renderer.RenderingOptions.MarginBottom = 25;
// Wait for JavaScript to fully load (important for SPAs)
renderer.RenderingOptions.RenderDelay = 2000; // 2 seconds
// Enable JavaScript execution
renderer.RenderingOptions.EnableJavaScript = true;
// Capture a web page as PDF
var pdf = renderer.RenderUrlAsPdf("https://example.com/dashboard");
pdf.SaveAs("dashboard-capture.pdf");
// For authenticated pages, you can set cookies
var cookieManager = renderer.RenderingOptions.CustomCookies;
cookieManager["session_id"] = "your-session-token";
// Capture authenticated content
var securePdf = renderer.RenderUrlAsPdf("https://app.example.com/private/report");
securePdf.SaveAs("private-report.pdf");
Imports IronPdf
Private renderer = New ChromePdfRenderer()
' Configure rendering options for optimal capture
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4
renderer.RenderingOptions.MarginTop = 25
renderer.RenderingOptions.MarginBottom = 25
' Wait for JavaScript to fully load (important for SPAs)
renderer.RenderingOptions.RenderDelay = 2000 ' 2 seconds
' Enable JavaScript execution
renderer.RenderingOptions.EnableJavaScript = True
' Capture a web page as PDF
Dim pdf = renderer.RenderUrlAsPdf("https://example.com/dashboard")
pdf.SaveAs("dashboard-capture.pdf")
' For authenticated pages, you can set cookies
Dim cookieManager = renderer.RenderingOptions.CustomCookies
cookieManager("session_id") = "your-session-token"
' Capture authenticated content
Dim securePdf = renderer.RenderUrlAsPdf("https://app.example.com/private/report")
securePdf.SaveAs("private-report.pdf")
3. HTML Dosyasından PDF Oluşturma (Şablon Tabanlı Üretim)
Tasarımcıların uygulama kodundan ayrı olarak sürdürebileceği karmaşık düzenler olduğunda, şablon tabanlı PDF oluşturma idealdir. HTML şablonlarını dosyalar olarak saklayarak tasarım ve mantık arasında temiz bir ayrım sağlar. Bu yaklaşım, sertifikalar, sözleşmeler veya standartlaştırılmış raporlar gibi tutarlı belgeler oluşturmak için mükemmel bir şekilde çalışır:
using IronPdf;
using System.IO;
using System;
var renderer = new ChromePdfRenderer();
// Basic file conversion
var pdf = renderer.RenderHtmlFileAsPdf("Templates/certificate-template.html");
pdf.SaveAs("certificate.pdf");
// Advanced: Using templates with asset directories
// Perfect when your HTML references images, CSS, or JavaScript files
var basePath = Path.Combine(Directory.GetCurrentDirectory(), "Templates", "Assets");
var pdfWithAssets = renderer.RenderHtmlFileAsPdf(
"Templates/report-template.html",
basePath // IronPDF will resolve relative paths from here
);
// Even better: Template with placeholders
var templateHtml = File.ReadAllText("Templates/contract-template.html");
templateHtml = templateHtml
.Replace("{{ClientName}}", "Tech Innovations Inc.")
.Replace("{{ContractDate}}", DateTime.Now.ToString("MMMM dd, yyyy"))
.Replace("{{ContractValue}}", "$50,000");
var contractPdf = renderer.RenderHtmlAsPdf(templateHtml);
contractPdf.SaveAs("contract-final.pdf");
using IronPdf;
using System.IO;
using System;
var renderer = new ChromePdfRenderer();
// Basic file conversion
var pdf = renderer.RenderHtmlFileAsPdf("Templates/certificate-template.html");
pdf.SaveAs("certificate.pdf");
// Advanced: Using templates with asset directories
// Perfect when your HTML references images, CSS, or JavaScript files
var basePath = Path.Combine(Directory.GetCurrentDirectory(), "Templates", "Assets");
var pdfWithAssets = renderer.RenderHtmlFileAsPdf(
"Templates/report-template.html",
basePath // IronPDF will resolve relative paths from here
);
// Even better: Template with placeholders
var templateHtml = File.ReadAllText("Templates/contract-template.html");
templateHtml = templateHtml
.Replace("{{ClientName}}", "Tech Innovations Inc.")
.Replace("{{ContractDate}}", DateTime.Now.ToString("MMMM dd, yyyy"))
.Replace("{{ContractValue}}", "$50,000");
var contractPdf = renderer.RenderHtmlAsPdf(templateHtml);
contractPdf.SaveAs("contract-final.pdf");
Imports IronPdf
Imports System.IO
Imports System
Private renderer = New ChromePdfRenderer()
' Basic file conversion
Private pdf = renderer.RenderHtmlFileAsPdf("Templates/certificate-template.html")
pdf.SaveAs("certificate.pdf")
' Advanced: Using templates with asset directories
' Perfect when your HTML references images, CSS, or JavaScript files
Dim basePath = Path.Combine(Directory.GetCurrentDirectory(), "Templates", "Assets")
Dim pdfWithAssets = renderer.RenderHtmlFileAsPdf("Templates/report-template.html", basePath)
' Even better: Template with placeholders
Dim templateHtml = File.ReadAllText("Templates/contract-template.html")
templateHtml = templateHtml.Replace("{{ClientName}}", "Tech Innovations Inc.").Replace("{{ContractDate}}", DateTime.Now.ToString("MMMM dd, yyyy")).Replace("{{ContractValue}}", "$50,000")
Dim contractPdf = renderer.RenderHtmlAsPdf(templateHtml)
contractPdf.SaveAs("contract-final.pdf")
4. Markdown'u PDF'ye Dönüştürme
Markdown, teknik dokümantasyon, README dosyaları ve içerik yönetim sistemleri için standart haline gelmiştir. IronPDF, biçimlendirmeyi koruyarak profesyonel görünümlü belgeler oluşturmak üzere Markdown içeriğini doğrudan PDF'ye dönüştürmeyi kolaylaştırır. Bu özellik, belgelerini Markdown formatında tutan organizasyonlar için özellikle değerlidir - geliştiriciler belgeleri tercih ettikleri formatta yazabilir ve sistem otomatik olarak dağıtım için müşterilere veya paydaşlara PDF'ler üretebilir.
using IronPdf;
var renderer = new ChromePdfRenderer();
// Convert Markdown string to PDF
string markdownContent = @"
# Project Documentation
## Overview
This project demonstrates **PDF generation** from _Markdown_ content.
### Features
- Easy conversion
- Preserves formatting
- Supports lists and tables
| Feature | Status |
|---------|--------|
| Markdown Support | |
| Table Rendering | |
| Code Blocks | |
```csharp
// Code blocks are preserved
var pdf = RenderMarkdownAsPdf(markdown);
\`\`\`
";
// Render Markdown as PDF
var pdfFromMarkdown = renderer.RenderMarkdownStringAsPdf(markdownContent);
pdfFromMarkdown.SaveAs("documentation.pdf");
// Convert Markdown file to PDF
var pdfFromFile = renderer.RenderMarkdownFileAsPdf("README.md");
pdfFromFile.SaveAs("readme-pdf.pdf");
using IronPdf;
var renderer = new ChromePdfRenderer();
// Convert Markdown string to PDF
string markdownContent = @"
# Project Documentation
## Overview
This project demonstrates **PDF generation** from _Markdown_ content.
### Features
- Easy conversion
- Preserves formatting
- Supports lists and tables
| Feature | Status |
|---------|--------|
| Markdown Support | |
| Table Rendering | |
| Code Blocks | |
```csharp
// Code blocks are preserved
var pdf = RenderMarkdownAsPdf(markdown);
\`\`\`
";
// Render Markdown as PDF
var pdfFromMarkdown = renderer.RenderMarkdownStringAsPdf(markdownContent);
pdfFromMarkdown.SaveAs("documentation.pdf");
// Convert Markdown file to PDF
var pdfFromFile = renderer.RenderMarkdownFileAsPdf("README.md");
pdfFromFile.SaveAs("readme-pdf.pdf");
Imports IronPdf
Dim renderer As New ChromePdfRenderer()
' Convert Markdown string to PDF
Dim markdownContent As String = "
# Project Documentation
## Overview
This project demonstrates **PDF generation** from _Markdown_ content.
### Features
- Easy conversion
- Preserves formatting
- Supports lists and tables
| Feature | Status |
|---------|--------|
| Markdown Support | |
| Table Rendering | |
| Code Blocks | |
```csharp
// Code blocks are preserved
var pdf = RenderMarkdownAsPdf(markdown);
\`\`\`
"
' Render Markdown as PDF
Dim pdfFromMarkdown = renderer.RenderMarkdownStringAsPdf(markdownContent)
pdfFromMarkdown.SaveAs("documentation.pdf")
' Convert Markdown file to PDF
Dim pdfFromFile = renderer.RenderMarkdownFileAsPdf("README.md")
pdfFromFile.SaveAs("readme-pdf.pdf")
Markdown'dan PDF'ye dönüşüm, Git gibi sürüm kontrol sistemlerini kullanan organizasyonlar için özellikle kullanışlıdır. Tüm belge iş akışınız otomatik hale getirilebilir - geliştiriciler Markdown dosyalarını günceller, CI/CD devreleri PDF belgeleri otomatik olarak üretir ve paydaşlar manuel müdahale olmaksızın profesyonelce biçimlendirilmiş belgeleri alır. Mevcut iş akışlarına sorunsuz entegrasyon, birçok geliştirme takımının belge ihtiyaçları için IronPDF'yi tercih etme nedenidir.
5. Word Belgelerini (DOCX) PDF'ye Dönüştürme
Birçok işletmenin dağıtım veya arşivleme için PDF'ye dönüştürülmesi gereken mevcut Word belgeleri vardır. IronPDF, biçimlendirmeyi, resimleri ve hatta mail birleştirme gibi karmaşık özellikleri koruyan kusursuz DOCX'ten PDF'ye dönüşüm sağlar. Bu yetenek, organizasyonlar için dönüştürücü niteliktedir - iş kullanıcıları tanıdık Microsoft Word'de çalışmaya devam edebilirken sistem dış dağıtım için otomatik olarak PDF'ler üretebilir. DOCX'ten PDF'ye dönüşüm özelliği, Word'ü tercih eden iş kullanıcıları ve güvenli, düzenlenemeyen PDF belgelerine ihtiyaç arasındaki boşluğu köprüler.
using IronPDF;
using System.Collections.Generic;
// Simple DOCX to PDF conversion
var docxRenderer = new DocxToPdfRenderer();
var pdfFromDocx = docxRenderer.RenderDocxAsPdf("proposal.docx");
pdfFromDocx.SaveAs("proposal.pdf");
// Advanced: Mail merge functionality for mass document generation
var recipients = new List<Dictionary<string, string>>
{
new() { ["Name"] = "John Smith", ["Company"] = "Tech Corp", ["Date"] = "March 15, 2024" },
new() { ["Name"] = "Jane Doe", ["Company"] = "Innovation Inc", ["Date"] = "March 15, 2024" }
};
// Configure mail merge options
var options = new DocxPdfRenderOptions
{
MailMergeDataSource = recipients,
MailMergePrintAllInOnePdfDocument = false // Creates separate PDFs
};
// Generate personalized PDFs from template
foreach (var recipient in recipients)
{
var personalizedPdf = docxRenderer.RenderDocxAsPdf("letter-template.docx", options);
personalizedPdf.SaveAs($"letter-{recipient["Name"].Replace(" ", "-")}.pdf");
}
using IronPDF;
using System.Collections.Generic;
// Simple DOCX to PDF conversion
var docxRenderer = new DocxToPdfRenderer();
var pdfFromDocx = docxRenderer.RenderDocxAsPdf("proposal.docx");
pdfFromDocx.SaveAs("proposal.pdf");
// Advanced: Mail merge functionality for mass document generation
var recipients = new List<Dictionary<string, string>>
{
new() { ["Name"] = "John Smith", ["Company"] = "Tech Corp", ["Date"] = "March 15, 2024" },
new() { ["Name"] = "Jane Doe", ["Company"] = "Innovation Inc", ["Date"] = "March 15, 2024" }
};
// Configure mail merge options
var options = new DocxPdfRenderOptions
{
MailMergeDataSource = recipients,
MailMergePrintAllInOnePdfDocument = false // Creates separate PDFs
};
// Generate personalized PDFs from template
foreach (var recipient in recipients)
{
var personalizedPdf = docxRenderer.RenderDocxAsPdf("letter-template.docx", options);
personalizedPdf.SaveAs($"letter-{recipient["Name"].Replace(" ", "-")}.pdf");
}
Imports IronPDF
Imports System.Collections.Generic
' Simple DOCX to PDF conversion
Dim docxRenderer As New DocxToPdfRenderer()
Dim pdfFromDocx = docxRenderer.RenderDocxAsPdf("proposal.docx")
pdfFromDocx.SaveAs("proposal.pdf")
' Advanced: Mail merge functionality for mass document generation
Dim recipients As New List(Of Dictionary(Of String, String)) From {
New Dictionary(Of String, String) From {{"Name", "John Smith"}, {"Company", "Tech Corp"}, {"Date", "March 15, 2024"}},
New Dictionary(Of String, String) From {{"Name", "Jane Doe"}, {"Company", "Innovation Inc"}, {"Date", "March 15, 2024"}}
}
' Configure mail merge options
Dim options As New DocxPdfRenderOptions With {
.MailMergeDataSource = recipients,
.MailMergePrintAllInOnePdfDocument = False ' Creates separate PDFs
}
' Generate personalized PDFs from template
For Each recipient In recipients
Dim personalizedPdf = docxRenderer.RenderDocxAsPdf("letter-template.docx", options)
personalizedPdf.SaveAs($"letter-{recipient("Name").Replace(" ", "-")}.pdf")
Next
Bu DOCX dönüşüm özelliği, organizasyon içindeki belge iş akışlarını otomatikleştirmek için paha biçilmezdir. Word'de teklif oluşturan bir satış ekibini düşünün - IronPDF ile bu teklifler otomatik olarak PDF'ye dönüştürülebilir ve watermarklar, güvenlik ayarları ve dijital imzalar programlamalı olarak uygulanabilir. Mail birleştirme fonksiyonu, kişiselleştirilmiş PDF belgelerinin kitlesel oluşturulmasını sağlar - binlerce özelleştirilmiş mektup, sertifika veya sözleşme oluşturma için mükemmeldir. Bu entegrasyon yeteneği, IronPDF'nin belgelerini otomatikleştirme ihtiyaçlarını karşılamak için dünya genelindeki işletmeler tarafından güvenilir olmasının nedenidir.
6. Resimleri PDF'ye Dönüştürme
Resimleri PDF'ye dönüştürmek, fotoğraf albümleri, taranan belge derlemeleri veya resim tabanlı raporlar oluşturmak için gereklidir. IronPDF, tüm önemli resim formatlarını destekler ve düzen ve kalite kontrolleri sağlar:
using IronPDF;
using IronPdf.Imaging; // `Install-Package IronPdf`
using System.IO;
var renderer = new ChromePdfRenderer();
// Convert single image to PDF
var imagePath = "product-photo.jpg";
var imageHtml = @"
<html>
<body style='margin: 0; padding: 0;'>
<img src='{imagePath}' style='width: 100%; height: auto;' />
</body>
</html>";
var imagePdf = renderer.RenderHtmlAsPdf(imageHtml, Path.GetDirectoryName(imagePath));
imagePdf.SaveAs("product-catalog-page.pdf");
// Create multi-page PDF from multiple images
var imageFiles = Directory.GetFiles("ProductImages", "*.jpg");
var catalogHtml = "<html><body style='margin: 0;'>";
foreach (var image in imageFiles)
{
catalogHtml += @"
<div style='page-break-after: always;'>
<img src='{Path.GetFileName(image)}' style='width: 100%; height: auto;' />
<p style='text-align: center;'>{Path.GetFileNameWithoutExtension(image)}</p>
</div>";
}
catalogHtml += "</body></html>";
var catalogPdf = renderer.RenderHtmlAsPdf(catalogHtml, "ProductImages");
catalogPdf.SaveAs("product-catalog.pdf");
using IronPDF;
using IronPdf.Imaging; // `Install-Package IronPdf`
using System.IO;
var renderer = new ChromePdfRenderer();
// Convert single image to PDF
var imagePath = "product-photo.jpg";
var imageHtml = @"
<html>
<body style='margin: 0; padding: 0;'>
<img src='{imagePath}' style='width: 100%; height: auto;' />
</body>
</html>";
var imagePdf = renderer.RenderHtmlAsPdf(imageHtml, Path.GetDirectoryName(imagePath));
imagePdf.SaveAs("product-catalog-page.pdf");
// Create multi-page PDF from multiple images
var imageFiles = Directory.GetFiles("ProductImages", "*.jpg");
var catalogHtml = "<html><body style='margin: 0;'>";
foreach (var image in imageFiles)
{
catalogHtml += @"
<div style='page-break-after: always;'>
<img src='{Path.GetFileName(image)}' style='width: 100%; height: auto;' />
<p style='text-align: center;'>{Path.GetFileNameWithoutExtension(image)}</p>
</div>";
}
catalogHtml += "</body></html>";
var catalogPdf = renderer.RenderHtmlAsPdf(catalogHtml, "ProductImages");
catalogPdf.SaveAs("product-catalog.pdf");
Imports IronPDF
Imports IronPdf.Imaging ' `Install-Package IronPdf`
Imports System.IO
Dim renderer As New ChromePdfRenderer()
' Convert single image to PDF
Dim imagePath As String = "product-photo.jpg"
Dim imageHtml As String = "
<html>
<body style='margin: 0; padding: 0;'>
<img src='" & imagePath & "' style='width: 100%; height: auto;' />
</body>
</html>"
Dim imagePdf = renderer.RenderHtmlAsPdf(imageHtml, Path.GetDirectoryName(imagePath))
imagePdf.SaveAs("product-catalog-page.pdf")
' Create multi-page PDF from multiple images
Dim imageFiles = Directory.GetFiles("ProductImages", "*.jpg")
Dim catalogHtml As String = "<html><body style='margin: 0;'>"
For Each image In imageFiles
catalogHtml &= "
<div style='page-break-after: always;'>
<img src='" & Path.GetFileName(image) & "' style='width: 100%; height: auto;' />
<p style='text-align: center;'>" & Path.GetFileNameWithoutExtension(image) & "</p>
</div>"
Next
catalogHtml &= "</body></html>"
Dim catalogPdf = renderer.RenderHtmlAsPdf(catalogHtml, "ProductImages")
catalogPdf.SaveAs("product-catalog.pdf")
7. ASP.NET Sayfalarından PDF Üretme
Web uygulamaları için, mevcut görünümlerinizden PDF'ler oluşturma, web içeriğinin indirilebilir versiyonlarını evrensel bir yol sunar. Bu entegrasyon yeteneği, web uygulamalarından PDF oluşturması gereken organizasyonlar için çok önemlidir - ister müşteri portalları beyanlar oluşturuyor, ister yönetici panoları raporlar üretiyor, isterse e-öğrenme platformları sertifikalar yaratıyor olsun. IronPDF, halihazırda Microsoft ekosistemine yatırım yapmış organizasyonlar için mükemmel bir seçim kılarak, MVC, Razor Pages ve Blazor dahil tüm ASP.NET teknolojileri ile çalışır:
// Namespace: Microsoft.AspNetCore.Mvc
using Microsoft.AspNetCore.Mvc;
// Namespace: IronPDF
using IronPDF;
// Namespace: System.Threading.Tasks
using System.Threading.Tasks;
// Namespace: System.IO
using System.IO;
// Namespace: System
using System;
// ASP.NET Core MVC Controller
public class ReportController : Controller
{
private readonly ChromePdfRenderer _pdfRenderer;
public ReportController()
{
_pdfRenderer = new ChromePdfRenderer();
}
public async Task<IActionResult> DownloadReport(int reportId)
{
// Get your report data
var reportData = await GetReportData(reportId);
// Render view to HTML string
var html = await RenderViewToStringAsync("Reports/MonthlyReport", reportData);
// Convert HTML content to PDF
var pdf = _pdfRenderer.RenderHtmlAsPdf(html);
// Return as file download
return File(
pdf.BinaryData,
"application/pdf",
$"report-{reportId}-{DateTime.Now:yyyy-MM}.pdf"
);
}
private async Task<string> RenderViewToStringAsync(string viewName, object model)
{
ViewData.Model = model;
using var sw = new StringWriter();
var viewResult = ViewEngines.Engines.FindPartialView(ControllerContext, viewName);
var viewContext = new ViewContext(
ControllerContext,
viewResult.View,
ViewData,
TempData,
sw,
new HtmlHelperOptions()
);
viewResult.View.Render(viewContext, sw);
return sw.GetStringBuilder().ToString();
}
}
// Namespace: Microsoft.AspNetCore.Mvc
using Microsoft.AspNetCore.Mvc;
// Namespace: IronPDF
using IronPDF;
// Namespace: System.Threading.Tasks
using System.Threading.Tasks;
// Namespace: System.IO
using System.IO;
// Namespace: System
using System;
// ASP.NET Core MVC Controller
public class ReportController : Controller
{
private readonly ChromePdfRenderer _pdfRenderer;
public ReportController()
{
_pdfRenderer = new ChromePdfRenderer();
}
public async Task<IActionResult> DownloadReport(int reportId)
{
// Get your report data
var reportData = await GetReportData(reportId);
// Render view to HTML string
var html = await RenderViewToStringAsync("Reports/MonthlyReport", reportData);
// Convert HTML content to PDF
var pdf = _pdfRenderer.RenderHtmlAsPdf(html);
// Return as file download
return File(
pdf.BinaryData,
"application/pdf",
$"report-{reportId}-{DateTime.Now:yyyy-MM}.pdf"
);
}
private async Task<string> RenderViewToStringAsync(string viewName, object model)
{
ViewData.Model = model;
using var sw = new StringWriter();
var viewResult = ViewEngines.Engines.FindPartialView(ControllerContext, viewName);
var viewContext = new ViewContext(
ControllerContext,
viewResult.View,
ViewData,
TempData,
sw,
new HtmlHelperOptions()
);
viewResult.View.Render(viewContext, sw);
return sw.GetStringBuilder().ToString();
}
}
Imports Microsoft.AspNetCore.Mvc
Imports IronPDF
Imports System.Threading.Tasks
Imports System.IO
Imports System
Public Class ReportController
Inherits Controller
Private ReadOnly _pdfRenderer As ChromePdfRenderer
Public Sub New()
_pdfRenderer = New ChromePdfRenderer()
End Sub
Public Async Function DownloadReport(reportId As Integer) As Task(Of IActionResult)
' Get your report data
Dim reportData = Await GetReportData(reportId)
' Render view to HTML string
Dim html = Await RenderViewToStringAsync("Reports/MonthlyReport", reportData)
' Convert HTML content to PDF
Dim pdf = _pdfRenderer.RenderHtmlAsPdf(html)
' Return as file download
Return File(pdf.BinaryData, "application/pdf", $"report-{reportId}-{DateTime.Now:yyyy-MM}.pdf")
End Function
Private Async Function RenderViewToStringAsync(viewName As String, model As Object) As Task(Of String)
ViewData.Model = model
Using sw As New StringWriter()
Dim viewResult = ViewEngines.Engines.FindPartialView(ControllerContext, viewName)
Dim viewContext = New ViewContext(ControllerContext, viewResult.View, ViewData, TempData, sw, New HtmlHelperOptions())
viewResult.View.Render(viewContext, sw)
Return sw.GetStringBuilder().ToString()
End Using
End Function
End Class
PDF'lerimi Nasıl Profesyonel Görünüşe Kavuşturabilirim?
PDF oluşturmak bir şeydir - onları profesyonel hale getirmek, uygulamanızın .NET'te PDF oluşturduğunuzda fark yaratır. Profesyonel PDF belgeleri, doğru etkisi yaratmak için düzen, tipografi ve markalama tutarlılığına dikkat gösterir. IronPDF'nin kapsamlı stil seçenekleri ve gelişmiş PDF özellikleri ile kurumsal kimliğinizle mükemmel uyum gösteren belgeler yaratabilirsiniz, bu güçlü C# PDF oluşturucu kullanarak. HTML'den PDF 'ye dönüşüm yetenekleri, PDF olarak üretildiğinde şekilli belgelerinizin görsel çekiciliğini korur. PDF'leri klişeleşmiş, profesyonel belgeler haline getiren özellikleri inceleyelim ki müşterilerinizi ve paydaşlarınızı etkilersiniz.
Başlıklar, Altbilgiler ve Sayfa Numaraları
Profesyonel belgeler, bağlam ve gezinme sağlayan tutarlı başlıklar ve altbilgiler gerektirir. IronPDF, hem basit metin bazlı hem de karmaşık HTML tabanlı başlıklar ve altbilgiler sağlar. Bu esneklik, IronPDF'nin ölçekli bir şekilde markalı PDF belgeleri oluşturma ihtiyacı olduğunda neden organizasyonlar tarafından tercih edildiğidir. Sayfa numaraları, tarih ve belge başlıkları gibi dinamik içeriği ekleyebilirsiniz - her oluşturulan PDF profesyonel standartları korur:
using IronPDF;
using System;
var renderer = new ChromePdfRenderer();
// Simple text header and footer with page numbers
renderer.RenderingOptions.TextHeader = new TextHeaderFooter
{
Text = "Confidential Report - {date}",
DrawDividerLine = true,
Font = "Arial",
FontSize = 12
};
renderer.RenderingOptions.TextFooter = new TextHeaderFooter
{
Text = "Page {page} of {total-pages}",
DrawDividerLine = true,
Font = "Arial",
FontSize = 10,
CenterText = true
};
// HTML headers for complex layouts with logos
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
{
Html = @"
<div style='display: flex; justify-content: space-between; align-items: center; padding: 10px 40px;'>
<img src='logo.png' style='height: 40px;' />
<div style='text-align: center;'>
<h2 style='margin: 0; color: #333;'>Annual Report 2024</h2>
<p style='margin: 0; font-size: 12px; color: #666;'>Confidential</p>
</div>
<div style='text-align: right; font-size: 11px; color: #666;'>
Generated: {date}<br/>
Department: Finance
</div>
</div>",
Height = 80,
LoadStylesAndCSSFromMainHtmlDocument = true
};
// Create your PDF with professional headers/footers
var html = @"<h1>Financial Overview</h1><p>Report content here...</p>";
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("professional-report.pdf");
using IronPDF;
using System;
var renderer = new ChromePdfRenderer();
// Simple text header and footer with page numbers
renderer.RenderingOptions.TextHeader = new TextHeaderFooter
{
Text = "Confidential Report - {date}",
DrawDividerLine = true,
Font = "Arial",
FontSize = 12
};
renderer.RenderingOptions.TextFooter = new TextHeaderFooter
{
Text = "Page {page} of {total-pages}",
DrawDividerLine = true,
Font = "Arial",
FontSize = 10,
CenterText = true
};
// HTML headers for complex layouts with logos
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
{
Html = @"
<div style='display: flex; justify-content: space-between; align-items: center; padding: 10px 40px;'>
<img src='logo.png' style='height: 40px;' />
<div style='text-align: center;'>
<h2 style='margin: 0; color: #333;'>Annual Report 2024</h2>
<p style='margin: 0; font-size: 12px; color: #666;'>Confidential</p>
</div>
<div style='text-align: right; font-size: 11px; color: #666;'>
Generated: {date}<br/>
Department: Finance
</div>
</div>",
Height = 80,
LoadStylesAndCSSFromMainHtmlDocument = true
};
// Create your PDF with professional headers/footers
var html = @"<h1>Financial Overview</h1><p>Report content here...</p>";
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("professional-report.pdf");
Imports IronPDF
Imports System
Dim renderer As New ChromePdfRenderer()
' Simple text header and footer with page numbers
renderer.RenderingOptions.TextHeader = New TextHeaderFooter With {
.Text = "Confidential Report - {date}",
.DrawDividerLine = True,
.Font = "Arial",
.FontSize = 12
}
renderer.RenderingOptions.TextFooter = New TextHeaderFooter With {
.Text = "Page {page} of {total-pages}",
.DrawDividerLine = True,
.Font = "Arial",
.FontSize = 10,
.CenterText = True
}
' HTML headers for complex layouts with logos
renderer.RenderingOptions.HtmlHeader = New HtmlHeaderFooter With {
.Html = "
<div style='display: flex; justify-content: space-between; align-items: center; padding: 10px 40px;'>
<img src='logo.png' style='height: 40px;' />
<div style='text-align: center;'>
<h2 style='margin: 0; color: #333;'>Annual Report 2024</h2>
<p style='margin: 0; font-size: 12px; color: #666;'>Confidential</p>
</div>
<div style='text-align: right; font-size: 11px; color: #666;'>
Generated: {date}<br/>
Department: Finance
</div>
</div>",
.Height = 80,
.LoadStylesAndCSSFromMainHtmlDocument = True
}
' Create your PDF with professional headers/footers
Dim html As String = "<h1>Financial Overview</h1><p>Report content here...</p>"
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("professional-report.pdf")
Bu başlık ve altbilgi opsiyonları, organizasyonların tüm oluşturulan PDF'lerde marka tutarlılığını korumasını sağlar. İster finansal raporlar ister teknik dökümantasyon oluşturuyor olun, profesyonel başlıklar ve altbilgiler belgelerinizin kurumsal standartlara uygun olmasını sağlar.
Gelişmiş Sayfa Ayarı ve Düzen Kontrolü
Sayfa düzeni kontrolü, belgelerin doğru basılması ve tüm cihazlarda profesyonel görünümü için çok önemlidir. IronPDF, özel boyutlar, yönelimler ve kenar boşlukları dahil olmak üzere sayfa ayarı için kapsamlı seçenekler sağlar:
var renderer = new ChromePdfRenderer();
// Configure page setup for professional printing
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Portrait;
// Set margins in millimeters for precise control
renderer.RenderingOptions.MarginTop = 25;
renderer.RenderingOptions.MarginBottom = 25;
renderer.RenderingOptions.MarginLeft = 20;
renderer.RenderingOptions.MarginRight = 20;
// Enable background colors and images (important for branding)
renderer.RenderingOptions.PrintHtmlBackgrounds = true;
// Use screen media type for vibrant colors
renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Screen;
// Custom page size for special documents
renderer.RenderingOptions.SetCustomPaperSizeinMilimeters(210, 297); // A4
// Enable high-quality rendering
renderer.RenderingOptions.RenderQuality = 100; // 0-100 scale
var renderer = new ChromePdfRenderer();
// Configure page setup for professional printing
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Portrait;
// Set margins in millimeters for precise control
renderer.RenderingOptions.MarginTop = 25;
renderer.RenderingOptions.MarginBottom = 25;
renderer.RenderingOptions.MarginLeft = 20;
renderer.RenderingOptions.MarginRight = 20;
// Enable background colors and images (important for branding)
renderer.RenderingOptions.PrintHtmlBackgrounds = true;
// Use screen media type for vibrant colors
renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Screen;
// Custom page size for special documents
renderer.RenderingOptions.SetCustomPaperSizeinMilimeters(210, 297); // A4
// Enable high-quality rendering
renderer.RenderingOptions.RenderQuality = 100; // 0-100 scale
Dim renderer = New ChromePdfRenderer()
' Configure page setup for professional printing
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4
renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Portrait
' Set margins in millimeters for precise control
renderer.RenderingOptions.MarginTop = 25
renderer.RenderingOptions.MarginBottom = 25
renderer.RenderingOptions.MarginLeft = 20
renderer.RenderingOptions.MarginRight = 20
' Enable background colors and images (important for branding)
renderer.RenderingOptions.PrintHtmlBackgrounds = True
' Use screen media type for vibrant colors
renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Screen
' Custom page size for special documents
renderer.RenderingOptions.SetCustomPaperSizeinMilimeters(210, 297) ' A4
' Enable high-quality rendering
renderer.RenderingOptions.RenderQuality = 100 ' 0-100 scale
Fontlar ve Tipografi ile Çalışma
Tipografi, belgenin profesyonelliğinde önemli bir rol oynar. IronPDF, web fontları, özel fontlar ve gelişmiş tipografi özelliklerini destekler:
var renderer = new ChromePdfRenderer();
// HTML with custom fonts and typography
var html = @"
<html>
<head>
<link href='https://fonts.googleapis.com/css2?family=Roboto:wght@300;400;700&display=swap' rel='stylesheet'>
<style>
@font-face {
font-family: 'CustomBrand';
src: url('BrandFont.ttf') format('truetype');
}
body {
font-family: 'Roboto', Arial, sans-serif;
font-size: 11pt;
line-height: 1.6;
color: #333;
}
h1 {
font-family: 'CustomBrand', Georgia, serif;
font-size: 28pt;
color: #0066cc;
letter-spacing: -0.5px;
}
.quote {
font-style: italic;
font-size: 14pt;
color: #666;
border-left: 4px solid #0066cc;
padding-left: 20px;
margin: 20px 0;
}
</style>
</head>
<body>
# Professional Document
<p>This document demonstrates professional typography.</p>
<div class='quote'>
"Excellence in typography enhances readability and professionalism."
</div>
</body>
</html>";
var pdf = renderer.RenderHtmlAsPdf(html, "Assets/Fonts");
pdf.SaveAs("typography-demo.pdf");
var renderer = new ChromePdfRenderer();
// HTML with custom fonts and typography
var html = @"
<html>
<head>
<link href='https://fonts.googleapis.com/css2?family=Roboto:wght@300;400;700&display=swap' rel='stylesheet'>
<style>
@font-face {
font-family: 'CustomBrand';
src: url('BrandFont.ttf') format('truetype');
}
body {
font-family: 'Roboto', Arial, sans-serif;
font-size: 11pt;
line-height: 1.6;
color: #333;
}
h1 {
font-family: 'CustomBrand', Georgia, serif;
font-size: 28pt;
color: #0066cc;
letter-spacing: -0.5px;
}
.quote {
font-style: italic;
font-size: 14pt;
color: #666;
border-left: 4px solid #0066cc;
padding-left: 20px;
margin: 20px 0;
}
</style>
</head>
<body>
# Professional Document
<p>This document demonstrates professional typography.</p>
<div class='quote'>
"Excellence in typography enhances readability and professionalism."
</div>
</body>
</html>";
var pdf = renderer.RenderHtmlAsPdf(html, "Assets/Fonts");
pdf.SaveAs("typography-demo.pdf");
Imports System
Dim renderer = New ChromePdfRenderer()
' HTML with custom fonts and typography
Dim html = "
<html>
<head>
<link href='https://fonts.googleapis.com/css2?family=Roboto:wght@300;400;700&display=swap' rel='stylesheet'>
<style>
@font-face {
font-family: 'CustomBrand';
src: url('BrandFont.ttf') format('truetype');
}
body {
font-family: 'Roboto', Arial, sans-serif;
font-size: 11pt;
line-height: 1.6;
color: #333;
}
h1 {
font-family: 'CustomBrand', Georgia, serif;
font-size: 28pt;
color: #0066cc;
letter-spacing: -0.5px;
}
.quote {
font-style: italic;
font-size: 14pt;
color: #666;
border-left: 4px solid #0066cc;
padding-left: 20px;
margin: 20px 0;
}
</style>
</head>
<body>
# Professional Document
<p>This document demonstrates professional typography.</p>
<div class='quote'>
""Excellence in typography enhances readability and professionalism.""
</div>
</body>
</html>"
Dim pdf = renderer.RenderHtmlAsPdf(html, "Assets/Fonts")
pdf.SaveAs("typography-demo.pdf")
Gerçek Dünya Örneği: Bir Fatura PDF'i Nasıl Oluştururum?
PDF belgeleri oluşturmanın gerçek dünya uygulamaları için en iyi uygulamaları sergileyen tamamlanmış, üretime hazır bir fatura üreticisi yaratalım. Bu örnek, IronPDF'nin fatura üretiminde neden binlerce işletme tarafından bir C# PDF oluşturucu olarak tercih edildiğini göstermektedir - veri bağlama, profesyonel stilizasyon ve uygun belge yapısını güçlü ve sürdürülebilir bir şekilde birleştirir. Benzer uygulamalar, programlı .NET içinde PDF oluşturmanın ölçeklenebilirliğini göstererek aylık olarak milyonlarca fatura oluşturan e-ticaret platformları tarafından kullanılır. Bu kodu kendi PDF oluşturma görevleriniz için uyarlayabilirsiniz:
using IronPDF;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
public class InvoiceGenerator
{
private readonly ChromePdfRenderer _renderer;
public InvoiceGenerator()
{
_renderer = new ChromePdfRenderer();
ConfigureRenderer();
}
private void ConfigureRenderer()
{
// Professional page setup
_renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
_renderer.RenderingOptions.MarginTop = 25;
_renderer.RenderingOptions.MarginBottom = 25;
_renderer.RenderingOptions.MarginLeft = 25;
_renderer.RenderingOptions.MarginRight = 25;
_renderer.RenderingOptions.PrintHtmlBackgrounds = true;
// Add footer with page numbers
_renderer.RenderingOptions.TextFooter = new TextHeaderFooter
{
Text = "Page {page} of {total-pages} | Invoice generated on {date}",
FontSize = 9,
Font = "Arial",
CenterText = true
};
}
public void CreateInvoice(Invoice invoice)
{
var html = GenerateInvoiceHtml(invoice);
var pdf = _renderer.RenderHtmlAsPdf(html);
// Add metadata to the final document
pdf.MetaData.Title = $"Invoice {invoice.Number}";
pdf.MetaData.Author = "Your Company Name";
pdf.MetaData.Subject = $"Invoice for {invoice.CustomerName}";
pdf.MetaData.Keywords = "invoice, billing, payment";
pdf.MetaData.CreationDate = DateTime.Now;
// Save the PDF document
var fileName = $"Invoice-{invoice.Number}.pdf";
pdf.SaveAs(fileName);
Console.WriteLine($"PDF generated successfully: {fileName}");
}
private string GenerateInvoiceHtml(Invoice invoice)
{
var itemsHtml = string.Join("", invoice.Items.Select(item => @"
<tr>
<td style='padding: 12px; border-bottom: 1px solid #eee;'>{item.Description}</td>
<td style='padding: 12px; border-bottom: 1px solid #eee; text-align: center;'>{item.Quantity}</td>
<td style='padding: 12px; border-bottom: 1px solid #eee; text-align: right;'>${item.UnitPrice:F2}</td>
<td style='padding: 12px; border-bottom: 1px solid #eee; text-align: right;'>${item.Total:F2}</td>
</tr>"));
return @"
<html>
<head>
<style>
* {{box-sizing: border-box;}}
body {{font-family: 'Segoe UI', Arial, sans-serif;
line-height: 1.6;
color: #333;
margin: 0;
padding: 0;}}
.invoice-container {{max-width: 800px;
margin: 0 auto;
padding: 40px;}}
.invoice-header {{display: flex;
justify-content: space-between;
margin-bottom: 40px;
padding-bottom: 20px;
border-bottom: 3px solid #0066cc;}}
.company-details {{flex: 1;}}
.company-details h1 {{color: #0066cc;
margin: 0 0 10px 0;
font-size: 28px;}}
.invoice-details {{flex: 1;
text-align: right;}}
.invoice-details h2 {{margin: 0 0 10px 0;
color: #666;
font-size: 24px;}}
.invoice-number {{font-size: 18px;
color: #0066cc;
font-weight: bold;}}
.billing-section {{display: flex;
justify-content: space-between;
margin-bottom: 40px;}}
.billing-box {{flex: 1;
padding: 20px;
background: #f8f9fa;
border-radius: 8px;
margin-right: 20px;}}
.billing-box:last-child {{margin-right: 0;}}
.billing-box h3 {{margin: 0 0 15px 0;
color: #0066cc;
font-size: 16px;
text-transform: uppercase;
letter-spacing: 1px;}}
.items-table {{width: 100%;
border-collapse: collapse;
margin-bottom: 40px;}}
.items-table th {{background: #0066cc;
color: white;
padding: 12px;
text-align: left;
font-weight: 600;}}
.items-table th:last-child {{text-align: right;}}
.totals-section {{display: flex;
justify-content: flex-end;
margin-bottom: 40px;}}
.totals-box {{width: 300px;}}
.total-row {{display: flex;
justify-content: space-between;
padding: 8px 0;
border-bottom: 1px solid #eee;}}
.total-row.final {{border-bottom: none;
border-top: 2px solid #0066cc;
margin-top: 10px;
padding-top: 15px;
font-size: 20px;
font-weight: bold;
color: #0066cc;}}
.payment-terms {{background: #f8f9fa;
padding: 20px;
border-radius: 8px;
margin-bottom: 30px;}}
.payment-terms h3 {{margin: 0 0 10px 0;
color: #0066cc;}}
.footer-note {{text-align: center;
color: #666;
font-size: 14px;
margin-top: 40px;
padding-top: 20px;
border-top: 1px solid #eee;}}
</style>
</head>
<body>
<div class='invoice-container'>
<div class='invoice-header'>
<div class='company-details'>
<h1>{invoice.CompanyName}</h1>
<p>{invoice.CompanyAddress}<br>
{invoice.CompanyCity}, {invoice.CompanyState} {invoice.CompanyZip}<br>
Phone: {invoice.CompanyPhone}<br>
Email: {invoice.CompanyEmail}</p>
</div>
<div class='invoice-details'>
<h2>INVOICE</h2>
<p class='invoice-number'>#{invoice.Number}</p>
<p><strong>Date:</strong> {invoice.Date:MMMM dd, yyyy}<br>
<strong>Due Date:</strong> {invoice.DueDate:MMMM dd, yyyy}</p>
</div>
</div>
<div class='billing-section'>
<div class='billing-box'>
<h3>Bill To</h3>
<p><strong>{invoice.CustomerName}</strong><br>
{invoice.CustomerAddress}<br>
{invoice.CustomerCity}, {invoice.CustomerState} {invoice.CustomerZip}<br>
{invoice.CustomerEmail}</p>
</div>
<div class='billing-box'>
<h3>Payment Information</h3>
<p><strong>Payment Terms:</strong> {invoice.PaymentTerms}<br>
<strong>Invoice Status:</strong> <span style='color: #ff6b6b;'>Unpaid</span><br>
<strong>Amount Due:</strong> ${invoice.Total:F2}</p>
</div>
</div>
<table class='items-table'>
<thead>
<tr>
<th>Description</th>
<th style='text-align: center;'>Quantity</th>
<th style='text-align: right;'>Unit Price</th>
<th style='text-align: right;'>Total</th>
</tr>
</thead>
<tbody>
{itemsHtml}
</tbody>
</table>
<div class='totals-section'>
<div class='totals-box'>
<div class='total-row'>
<span>Subtotal:</span>
<span>${invoice.Subtotal:F2}</span>
</div>
<div class='total-row'>
<span>Tax ({invoice.TaxRate:F0}%):</span>
<span>${invoice.Tax:F2}</span>
</div>
<div class='total-row final'>
<span>Total Due:</span>
<span>${invoice.Total:F2}</span>
</div>
</div>
</div>
<div class='payment-terms'>
<h3>Payment Terms & Conditions</h3>
<p>Payment is due within {invoice.PaymentTerms}. Late payments are subject to a 1.5% monthly service charge.
Please make checks payable to {invoice.CompanyName} or pay online at {invoice.CompanyWebsite}.</p>
</div>
<div class='footer-note'>
<p>Thank you for your business! This invoice was generated automatically using our C# PDF generation system.</p>
<p>Questions? Contact us at {invoice.CompanyEmail} or {invoice.CompanyPhone}</p>
</div>
</div>
</body>
</html>";
}
}
// Invoice model classes
public class Invoice
{
public string Number { get; set; }
public DateTime Date { get; set; }
public DateTime DueDate { get; set; }
public string CompanyName { get; set; }
public string CompanyAddress { get; set; }
public string CompanyCity { get; set; }
public string CompanyState { get; set; }
public string CompanyZip { get; set; }
public string CompanyPhone { get; set; }
public string CompanyEmail { get; set; }
public string CompanyWebsite { get; set; }
public string CustomerName { get; set; }
public string CustomerAddress { get; set; }
public string CustomerCity { get; set; }
public string CustomerState { get; set; }
public string CustomerZip { get; set; }
public string CustomerEmail { get; set; }
public string PaymentTerms { get; set; }
public List<InvoiceItem> Items { get; set; }
public decimal Subtotal => Items.Sum(i => i.Total);
public decimal TaxRate { get; set; }
public decimal Tax => Subtotal * (TaxRate / 100);
public decimal Total => Subtotal + Tax;
}
public class InvoiceItem
{
public string Description { get; set; }
public int Quantity { get; set; }
public decimal UnitPrice { get; set; }
public decimal Total => Quantity * UnitPrice;
}
// Usage example
var generator = new InvoiceGenerator();
var invoice = new Invoice
{
Number = "INV-2024-001",
Date = DateTime.Now,
DueDate = DateTime.Now.AddDays(30),
CompanyName = "Your Company Name",
CompanyAddress = "123 Business Street",
CompanyCity = "New York",
CompanyState = "NY",
CompanyZip = "10001",
CompanyPhone = "(555) 123-4567",
CompanyEmail = "billing@yourcompany.com",
CompanyWebsite = "www.yourcompany.com",
CustomerName = "Acme Corporation",
CustomerAddress = "456 Client Avenue",
CustomerCity = "Los Angeles",
CustomerState = "CA",
CustomerZip = "90001",
CustomerEmail = "accounts@acmecorp.com",
PaymentTerms = "Net 30",
TaxRate = 8.5m,
Items = new List<InvoiceItem>
{
new() { Description = "Professional Services - March 2024", Quantity = 40, UnitPrice = 125.00m },
new() { Description = "Software License (Annual)", Quantity = 1, UnitPrice = 2400.00m },
new() { Description = "Technical Support", Quantity = 10, UnitPrice = 150.00m }
}
};
generator.CreateInvoice(invoice);
using IronPDF;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
public class InvoiceGenerator
{
private readonly ChromePdfRenderer _renderer;
public InvoiceGenerator()
{
_renderer = new ChromePdfRenderer();
ConfigureRenderer();
}
private void ConfigureRenderer()
{
// Professional page setup
_renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
_renderer.RenderingOptions.MarginTop = 25;
_renderer.RenderingOptions.MarginBottom = 25;
_renderer.RenderingOptions.MarginLeft = 25;
_renderer.RenderingOptions.MarginRight = 25;
_renderer.RenderingOptions.PrintHtmlBackgrounds = true;
// Add footer with page numbers
_renderer.RenderingOptions.TextFooter = new TextHeaderFooter
{
Text = "Page {page} of {total-pages} | Invoice generated on {date}",
FontSize = 9,
Font = "Arial",
CenterText = true
};
}
public void CreateInvoice(Invoice invoice)
{
var html = GenerateInvoiceHtml(invoice);
var pdf = _renderer.RenderHtmlAsPdf(html);
// Add metadata to the final document
pdf.MetaData.Title = $"Invoice {invoice.Number}";
pdf.MetaData.Author = "Your Company Name";
pdf.MetaData.Subject = $"Invoice for {invoice.CustomerName}";
pdf.MetaData.Keywords = "invoice, billing, payment";
pdf.MetaData.CreationDate = DateTime.Now;
// Save the PDF document
var fileName = $"Invoice-{invoice.Number}.pdf";
pdf.SaveAs(fileName);
Console.WriteLine($"PDF generated successfully: {fileName}");
}
private string GenerateInvoiceHtml(Invoice invoice)
{
var itemsHtml = string.Join("", invoice.Items.Select(item => @"
<tr>
<td style='padding: 12px; border-bottom: 1px solid #eee;'>{item.Description}</td>
<td style='padding: 12px; border-bottom: 1px solid #eee; text-align: center;'>{item.Quantity}</td>
<td style='padding: 12px; border-bottom: 1px solid #eee; text-align: right;'>${item.UnitPrice:F2}</td>
<td style='padding: 12px; border-bottom: 1px solid #eee; text-align: right;'>${item.Total:F2}</td>
</tr>"));
return @"
<html>
<head>
<style>
* {{box-sizing: border-box;}}
body {{font-family: 'Segoe UI', Arial, sans-serif;
line-height: 1.6;
color: #333;
margin: 0;
padding: 0;}}
.invoice-container {{max-width: 800px;
margin: 0 auto;
padding: 40px;}}
.invoice-header {{display: flex;
justify-content: space-between;
margin-bottom: 40px;
padding-bottom: 20px;
border-bottom: 3px solid #0066cc;}}
.company-details {{flex: 1;}}
.company-details h1 {{color: #0066cc;
margin: 0 0 10px 0;
font-size: 28px;}}
.invoice-details {{flex: 1;
text-align: right;}}
.invoice-details h2 {{margin: 0 0 10px 0;
color: #666;
font-size: 24px;}}
.invoice-number {{font-size: 18px;
color: #0066cc;
font-weight: bold;}}
.billing-section {{display: flex;
justify-content: space-between;
margin-bottom: 40px;}}
.billing-box {{flex: 1;
padding: 20px;
background: #f8f9fa;
border-radius: 8px;
margin-right: 20px;}}
.billing-box:last-child {{margin-right: 0;}}
.billing-box h3 {{margin: 0 0 15px 0;
color: #0066cc;
font-size: 16px;
text-transform: uppercase;
letter-spacing: 1px;}}
.items-table {{width: 100%;
border-collapse: collapse;
margin-bottom: 40px;}}
.items-table th {{background: #0066cc;
color: white;
padding: 12px;
text-align: left;
font-weight: 600;}}
.items-table th:last-child {{text-align: right;}}
.totals-section {{display: flex;
justify-content: flex-end;
margin-bottom: 40px;}}
.totals-box {{width: 300px;}}
.total-row {{display: flex;
justify-content: space-between;
padding: 8px 0;
border-bottom: 1px solid #eee;}}
.total-row.final {{border-bottom: none;
border-top: 2px solid #0066cc;
margin-top: 10px;
padding-top: 15px;
font-size: 20px;
font-weight: bold;
color: #0066cc;}}
.payment-terms {{background: #f8f9fa;
padding: 20px;
border-radius: 8px;
margin-bottom: 30px;}}
.payment-terms h3 {{margin: 0 0 10px 0;
color: #0066cc;}}
.footer-note {{text-align: center;
color: #666;
font-size: 14px;
margin-top: 40px;
padding-top: 20px;
border-top: 1px solid #eee;}}
</style>
</head>
<body>
<div class='invoice-container'>
<div class='invoice-header'>
<div class='company-details'>
<h1>{invoice.CompanyName}</h1>
<p>{invoice.CompanyAddress}<br>
{invoice.CompanyCity}, {invoice.CompanyState} {invoice.CompanyZip}<br>
Phone: {invoice.CompanyPhone}<br>
Email: {invoice.CompanyEmail}</p>
</div>
<div class='invoice-details'>
<h2>INVOICE</h2>
<p class='invoice-number'>#{invoice.Number}</p>
<p><strong>Date:</strong> {invoice.Date:MMMM dd, yyyy}<br>
<strong>Due Date:</strong> {invoice.DueDate:MMMM dd, yyyy}</p>
</div>
</div>
<div class='billing-section'>
<div class='billing-box'>
<h3>Bill To</h3>
<p><strong>{invoice.CustomerName}</strong><br>
{invoice.CustomerAddress}<br>
{invoice.CustomerCity}, {invoice.CustomerState} {invoice.CustomerZip}<br>
{invoice.CustomerEmail}</p>
</div>
<div class='billing-box'>
<h3>Payment Information</h3>
<p><strong>Payment Terms:</strong> {invoice.PaymentTerms}<br>
<strong>Invoice Status:</strong> <span style='color: #ff6b6b;'>Unpaid</span><br>
<strong>Amount Due:</strong> ${invoice.Total:F2}</p>
</div>
</div>
<table class='items-table'>
<thead>
<tr>
<th>Description</th>
<th style='text-align: center;'>Quantity</th>
<th style='text-align: right;'>Unit Price</th>
<th style='text-align: right;'>Total</th>
</tr>
</thead>
<tbody>
{itemsHtml}
</tbody>
</table>
<div class='totals-section'>
<div class='totals-box'>
<div class='total-row'>
<span>Subtotal:</span>
<span>${invoice.Subtotal:F2}</span>
</div>
<div class='total-row'>
<span>Tax ({invoice.TaxRate:F0}%):</span>
<span>${invoice.Tax:F2}</span>
</div>
<div class='total-row final'>
<span>Total Due:</span>
<span>${invoice.Total:F2}</span>
</div>
</div>
</div>
<div class='payment-terms'>
<h3>Payment Terms & Conditions</h3>
<p>Payment is due within {invoice.PaymentTerms}. Late payments are subject to a 1.5% monthly service charge.
Please make checks payable to {invoice.CompanyName} or pay online at {invoice.CompanyWebsite}.</p>
</div>
<div class='footer-note'>
<p>Thank you for your business! This invoice was generated automatically using our C# PDF generation system.</p>
<p>Questions? Contact us at {invoice.CompanyEmail} or {invoice.CompanyPhone}</p>
</div>
</div>
</body>
</html>";
}
}
// Invoice model classes
public class Invoice
{
public string Number { get; set; }
public DateTime Date { get; set; }
public DateTime DueDate { get; set; }
public string CompanyName { get; set; }
public string CompanyAddress { get; set; }
public string CompanyCity { get; set; }
public string CompanyState { get; set; }
public string CompanyZip { get; set; }
public string CompanyPhone { get; set; }
public string CompanyEmail { get; set; }
public string CompanyWebsite { get; set; }
public string CustomerName { get; set; }
public string CustomerAddress { get; set; }
public string CustomerCity { get; set; }
public string CustomerState { get; set; }
public string CustomerZip { get; set; }
public string CustomerEmail { get; set; }
public string PaymentTerms { get; set; }
public List<InvoiceItem> Items { get; set; }
public decimal Subtotal => Items.Sum(i => i.Total);
public decimal TaxRate { get; set; }
public decimal Tax => Subtotal * (TaxRate / 100);
public decimal Total => Subtotal + Tax;
}
public class InvoiceItem
{
public string Description { get; set; }
public int Quantity { get; set; }
public decimal UnitPrice { get; set; }
public decimal Total => Quantity * UnitPrice;
}
// Usage example
var generator = new InvoiceGenerator();
var invoice = new Invoice
{
Number = "INV-2024-001",
Date = DateTime.Now,
DueDate = DateTime.Now.AddDays(30),
CompanyName = "Your Company Name",
CompanyAddress = "123 Business Street",
CompanyCity = "New York",
CompanyState = "NY",
CompanyZip = "10001",
CompanyPhone = "(555) 123-4567",
CompanyEmail = "billing@yourcompany.com",
CompanyWebsite = "www.yourcompany.com",
CustomerName = "Acme Corporation",
CustomerAddress = "456 Client Avenue",
CustomerCity = "Los Angeles",
CustomerState = "CA",
CustomerZip = "90001",
CustomerEmail = "accounts@acmecorp.com",
PaymentTerms = "Net 30",
TaxRate = 8.5m,
Items = new List<InvoiceItem>
{
new() { Description = "Professional Services - March 2024", Quantity = 40, UnitPrice = 125.00m },
new() { Description = "Software License (Annual)", Quantity = 1, UnitPrice = 2400.00m },
new() { Description = "Technical Support", Quantity = 10, UnitPrice = 150.00m }
}
};
generator.CreateInvoice(invoice);
Imports IronPDF
Imports System
Imports System.Collections.Generic
Imports System.Globalization
Imports System.Linq
Public Class InvoiceGenerator
Private ReadOnly _renderer As ChromePdfRenderer
Public Sub New()
_renderer = New ChromePdfRenderer()
ConfigureRenderer()
End Sub
Private Sub ConfigureRenderer()
' Professional page setup
_renderer.RenderingOptions.PaperSize = PdfPaperSize.A4
_renderer.RenderingOptions.MarginTop = 25
_renderer.RenderingOptions.MarginBottom = 25
_renderer.RenderingOptions.MarginLeft = 25
_renderer.RenderingOptions.MarginRight = 25
_renderer.RenderingOptions.PrintHtmlBackgrounds = True
' Add footer with page numbers
_renderer.RenderingOptions.TextFooter = New TextHeaderFooter With {
.Text = "Page {page} of {total-pages} | Invoice generated on {date}",
.FontSize = 9,
.Font = "Arial",
.CenterText = True
}
End Sub
Public Sub CreateInvoice(invoice As Invoice)
Dim html = GenerateInvoiceHtml(invoice)
Dim pdf = _renderer.RenderHtmlAsPdf(html)
' Add metadata to the final document
pdf.MetaData.Title = $"Invoice {invoice.Number}"
pdf.MetaData.Author = "Your Company Name"
pdf.MetaData.Subject = $"Invoice for {invoice.CustomerName}"
pdf.MetaData.Keywords = "invoice, billing, payment"
pdf.MetaData.CreationDate = DateTime.Now
' Save the PDF document
Dim fileName = $"Invoice-{invoice.Number}.pdf"
pdf.SaveAs(fileName)
Console.WriteLine($"PDF generated successfully: {fileName}")
End Sub
Private Function GenerateInvoiceHtml(invoice As Invoice) As String
Dim itemsHtml = String.Join("", invoice.Items.Select(Function(item) $"
<tr>
<td style='padding: 12px; border-bottom: 1px solid #eee;'>{item.Description}</td>
<td style='padding: 12px; border-bottom: 1px solid #eee; text-align: center;'>{item.Quantity}</td>
<td style='padding: 12px; border-bottom: 1px solid #eee; text-align: right;'>${item.UnitPrice:F2}</td>
<td style='padding: 12px; border-bottom: 1px solid #eee; text-align: right;'>${item.Total:F2}</td>
</tr>"))
Return $"
<html>
<head>
<style>
* {{box-sizing: border-box;}}
body {{font-family: 'Segoe UI', Arial, sans-serif;
line-height: 1.6;
color: #333;
margin: 0;
padding: 0;}}
.invoice-container {{max-width: 800px;
margin: 0 auto;
padding: 40px;}}
.invoice-header {{display: flex;
justify-content: space-between;
margin-bottom: 40px;
padding-bottom: 20px;
border-bottom: 3px solid #0066cc;}}
.company-details {{flex: 1;}}
.company-details h1 {{color: #0066cc;
margin: 0 0 10px 0;
font-size: 28px;}}
.invoice-details {{flex: 1;
text-align: right;}}
.invoice-details h2 {{margin: 0 0 10px 0;
color: #666;
font-size: 24px;}}
.invoice-number {{font-size: 18px;
color: #0066cc;
font-weight: bold;}}
.billing-section {{display: flex;
justify-content: space-between;
margin-bottom: 40px;}}
.billing-box {{flex: 1;
padding: 20px;
background: #f8f9fa;
border-radius: 8px;
margin-right: 20px;}}
.billing-box:last-child {{margin-right: 0;}}
.billing-box h3 {{margin: 0 0 15px 0;
color: #0066cc;
font-size: 16px;
text-transform: uppercase;
letter-spacing: 1px;}}
.items-table {{width: 100%;
border-collapse: collapse;
margin-bottom: 40px;}}
.items-table th {{background: #0066cc;
color: white;
padding: 12px;
text-align: left;
font-weight: 600;}}
.items-table th:last-child {{text-align: right;}}
.totals-section {{display: flex;
justify-content: flex-end;
margin-bottom: 40px;}}
.totals-box {{width: 300px;}}
.total-row {{display: flex;
justify-content: space-between;
padding: 8px 0;
border-bottom: 1px solid #eee;}}
.total-row.final {{border-bottom: none;
border-top: 2px solid #0066cc;
margin-top: 10px;
padding-top: 15px;
font-size: 20px;
font-weight: bold;
color: #0066cc;}}
.payment-terms {{background: #f8f9fa;
padding: 20px;
border-radius: 8px;
margin-bottom: 30px;}}
.payment-terms h3 {{margin: 0 0 10px 0;
color: #0066cc;}}
.footer-note {{text-align: center;
color: #666;
font-size: 14px;
margin-top: 40px;
padding-top: 20px;
border-top: 1px solid #eee;}}
</style>
</head>
<body>
<div class='invoice-container'>
<div class='invoice-header'>
<div class='company-details'>
<h1>{invoice.CompanyName}</h1>
<p>{invoice.CompanyAddress}<br>
{invoice.CompanyCity}, {invoice.CompanyState} {invoice.CompanyZip}<br>
Phone: {invoice.CompanyPhone}<br>
Email: {invoice.CompanyEmail}</p>
</div>
<div class='invoice-details'>
<h2>INVOICE</h2>
<p class='invoice-number'>#{invoice.Number}</p>
<p><strong>Date:</strong> {invoice.Date:MMMM dd, yyyy}<br>
<strong>Due Date:</strong> {invoice.DueDate:MMMM dd, yyyy}</p>
</div>
</div>
<div class='billing-section'>
<div class='billing-box'>
<h3>Bill To</h3>
<p><strong>{invoice.CustomerName}</strong><br>
{invoice.CustomerAddress}<br>
{invoice.CustomerCity}, {invoice.CustomerState} {invoice.CustomerZip}<br>
{invoice.CustomerEmail}</p>
</div>
<div class='billing-box'>
<h3>Payment Information</h3>
<p><strong>Payment Terms:</strong> {invoice.PaymentTerms}<br>
<strong>Invoice Status:</strong> <span style='color: #ff6b6b;'>Unpaid</span><br>
<strong>Amount Due:</strong> ${invoice.Total:F2}</p>
</div>
</div>
<table class='items-table'>
<thead>
<tr>
<th>Description</th>
<th style='text-align: center;'>Quantity</th>
<th style='text-align: right;'>Unit Price</th>
<th style='text-align: right;'>Total</th>
</tr>
</thead>
<tbody>
{itemsHtml}
</tbody>
</table>
<div class='totals-section'>
<div class='totals-box'>
<div class='total-row'>
<span>Subtotal:</span>
<span>${invoice.Subtotal:F2}</span>
</div>
<div class='total-row'>
<span>Tax ({invoice.TaxRate:F0}%):</span>
<span>${invoice.Tax:F2}</span>
</div>
<div class='total-row final'>
<span>Total Due:</span>
<span>${invoice.Total:F2}</span>
</div>
</div>
</div>
<div class='payment-terms'>
<h3>Payment Terms & Conditions</h3>
<p>Payment is due within {invoice.PaymentTerms}. Late payments are subject to a 1.5% monthly service charge.
Please make checks payable to {invoice.CompanyName} or pay online at {invoice.CompanyWebsite}.</p>
</div>
<div class='footer-note'>
<p>Thank you for your business! This invoice was generated automatically using our C# PDF generation system.</p>
<p>Questions? Contact us at {invoice.CompanyEmail} or {invoice.CompanyPhone}</p>
</div>
</div>
</body>
</html>"
End Function
End Class
' Invoice model classes
Public Class Invoice
Public Property Number As String
Public Property [Date] As DateTime
Public Property DueDate As DateTime
Public Property CompanyName As String
Public Property CompanyAddress As String
Public Property CompanyCity As String
Public Property CompanyState As String
Public Property CompanyZip As String
Public Property CompanyPhone As String
Public Property CompanyEmail As String
Public Property CompanyWebsite As String
Public Property CustomerName As String
Public Property CustomerAddress As String
Public Property CustomerCity As String
Public Property CustomerState As String
Public Property CustomerZip As String
Public Property CustomerEmail As String
Public Property PaymentTerms As String
Public Property Items As List(Of InvoiceItem)
Public ReadOnly Property Subtotal As Decimal
Get
Return Items.Sum(Function(i) i.Total)
End Get
End Property
Public Property TaxRate As Decimal
Public ReadOnly Property Tax As Decimal
Get
Return Subtotal * (TaxRate / 100)
End Get
End Property
Public ReadOnly Property Total As Decimal
Get
Return Subtotal + Tax
End Get
End Property
End Class
Public Class InvoiceItem
Public Property Description As String
Public Property Quantity As Integer
Public Property UnitPrice As Decimal
Public ReadOnly Property Total As Decimal
Get
Return Quantity * UnitPrice
End Get
End Property
End Class
' Usage example
Dim generator As New InvoiceGenerator()
Dim invoice As New Invoice With {
.Number = "INV-2024-001",
.[Date] = DateTime.Now,
.DueDate = DateTime.Now.AddDays(30),
.CompanyName = "Your Company Name",
.CompanyAddress = "123 Business Street",
.CompanyCity = "New York",
.CompanyState = "NY",
.CompanyZip = "10001",
.CompanyPhone = "(555) 123-4567",
.CompanyEmail = "billing@yourcompany.com",
.CompanyWebsite = "www.yourcompany.com",
.CustomerName = "Acme Corporation",
.CustomerAddress = "456 Client Avenue",
.CustomerCity = "Los Angeles",
.CustomerState = "CA",
.CustomerZip = "90001",
.CustomerEmail = "accounts@acmecorp.com",
.PaymentTerms = "Net 30",
.TaxRate = 8.5D,
.Items = New List(Of InvoiceItem) From {
New InvoiceItem With {.Description = "Professional Services - March 2024", .Quantity = 40, .UnitPrice = 125.0D},
New InvoiceItem With {.Description = "Software License (Annual)", .Quantity = 1, .UnitPrice = 2400.0D},
New InvoiceItem With {.Description = "Technical Support", .Quantity = 10, .UnitPrice = 150.0D}
}
}
generator.CreateInvoice(invoice)
IronPDF Sundukları İleri Düzey PDF Özellikleri Nelerdir?
IronPDF, gelişmiş belge iş akışları ve kurumsal düzeyde işlevsellik sağlayan sofistike özelliklerle C# içinde PDF oluşturmanın ötesine geçer. Bu ileri düzey yetenekler, etkileşimli formlar oluşturmanıza, hassas belgeleri güvence altına almanıza ve mevcut PDF'leri hassas bir şekilde manipüle etmenize olanak tanır .NET içinde PDF oluşturma sırasında. Bu özellikler, dünyadaki 14 milyondan fazla geliştiricinin görev açısından kritik PDF oluşturma ihtiyaçları için IronPDF'ye güvendiğinin nedenidir. Bu özellikleri anlamak, en talepkar gereksinimleri dahi karşılayan kapsamlı PDF çözümleri oluşturmanıza yardımcı olur - doldurulabilir formlar oluşturmadan C# PDF oluşturma projelerinizde kurumsal düzeyde güvenlik uygulamaya kadar.
Etkileşimli PDF Formları Üretin
Programlayarak doldurulabilir PDF formları oluşturma, veri toplama ve belge iş akışlarını otomatikleştirme olasılıklarını açar. IronPDF, kullanıcıların herhangi bir PDF okuyucusunda doldurabileceği etkileşimli PDF formlarına HTML formlarını dönüştürebilir:
// Namespace: IronPDF
using IronPDF;
// Namespace: System
using System;
var renderer = new ChromePdfRenderer();
// Enable form creation from HTML
renderer.RenderingOptions.CreatePdfFormsFromHtml = true;
// Create an interactive form with various input types
var formHtml = @"
<html>
<head>
<style>
body { font-family: Arial, sans-serif; padding: 40px; }
.form-group { margin-bottom: 20px; }
label { display: block; margin-bottom: 5px; font-weight: bold; }
input[type='text'], input[type='email'], select, textarea {
width: 100%;
padding: 8px;
border: 1px solid #ccc;
border-radius: 4px;
font-size: 14px;
}
.checkbox-group { margin: 10px 0; }
.submit-section {
margin-top: 30px;
padding-top: 20px;
border-top: 2px solid #0066cc;
}
</style>
</head>
<body>
# Application Form
<form>
<div class='form-group'>
<label for='fullName'>Full Name:</label>
<input type='text' id='fullName' name='fullName' required />
</div>
<div class='form-group'>
<label for='email'>Email Address:</label>
<input type='email' id='email' name='email' required />
</div>
<div class='form-group'>
<label for='department'>Department:</label>
<select id='department' name='department'>
<option value=''>Select Department</option>
<option value='sales'>Sales</option>
<option value='marketing'>Marketing</option>
<option value='engineering'>Engineering</option>
<option value='hr'>Human Resources</option>
</select>
</div>
<div class='form-group'>
<label>Interests:</label>
<div class='checkbox-group'>
<label><input type='checkbox' name='interests' value='training' /> Professional Training</label>
<label><input type='checkbox' name='interests' value='conferences' /> Industry Conferences</label>
<label><input type='checkbox' name='interests' value='certification' /> Certification Programs</label>
</div>
</div>
<div class='form-group'>
<label for='comments'>Additional Comments:</label>
<textarea id='comments' name='comments' rows='4'></textarea>
</div>
<div class='submit-section'>
<p><em>Please save this form and email to hr@company.com</em></p>
</div>
</form>
</body>
</html>";
// Create the PDF with form fields
var formPdf = renderer.RenderHtmlAsPdf(formHtml);
// Optionally pre-fill form fields programmatically
formPdf.Form.FindFormField("fullName").Value = "John Smith";
formPdf.Form.FindFormField("email").Value = "john.smith@example.com";
formPdf.Form.FindFormField("department").Value = "engineering";
// Save the interactive form
formPdf.SaveAs("application-form.pdf");
// You can also read and process submitted forms
var submittedPdf = PdfDocument.FromFile("submitted-form.pdf");
var name = submittedPdf.Form.FindFormField("fullName").Value;
var email = submittedPdf.Form.FindFormField("email").Value;
Console.WriteLine($"Form submitted by: {name} ({email})");
// Namespace: IronPDF
using IronPDF;
// Namespace: System
using System;
var renderer = new ChromePdfRenderer();
// Enable form creation from HTML
renderer.RenderingOptions.CreatePdfFormsFromHtml = true;
// Create an interactive form with various input types
var formHtml = @"
<html>
<head>
<style>
body { font-family: Arial, sans-serif; padding: 40px; }
.form-group { margin-bottom: 20px; }
label { display: block; margin-bottom: 5px; font-weight: bold; }
input[type='text'], input[type='email'], select, textarea {
width: 100%;
padding: 8px;
border: 1px solid #ccc;
border-radius: 4px;
font-size: 14px;
}
.checkbox-group { margin: 10px 0; }
.submit-section {
margin-top: 30px;
padding-top: 20px;
border-top: 2px solid #0066cc;
}
</style>
</head>
<body>
# Application Form
<form>
<div class='form-group'>
<label for='fullName'>Full Name:</label>
<input type='text' id='fullName' name='fullName' required />
</div>
<div class='form-group'>
<label for='email'>Email Address:</label>
<input type='email' id='email' name='email' required />
</div>
<div class='form-group'>
<label for='department'>Department:</label>
<select id='department' name='department'>
<option value=''>Select Department</option>
<option value='sales'>Sales</option>
<option value='marketing'>Marketing</option>
<option value='engineering'>Engineering</option>
<option value='hr'>Human Resources</option>
</select>
</div>
<div class='form-group'>
<label>Interests:</label>
<div class='checkbox-group'>
<label><input type='checkbox' name='interests' value='training' /> Professional Training</label>
<label><input type='checkbox' name='interests' value='conferences' /> Industry Conferences</label>
<label><input type='checkbox' name='interests' value='certification' /> Certification Programs</label>
</div>
</div>
<div class='form-group'>
<label for='comments'>Additional Comments:</label>
<textarea id='comments' name='comments' rows='4'></textarea>
</div>
<div class='submit-section'>
<p><em>Please save this form and email to hr@company.com</em></p>
</div>
</form>
</body>
</html>";
// Create the PDF with form fields
var formPdf = renderer.RenderHtmlAsPdf(formHtml);
// Optionally pre-fill form fields programmatically
formPdf.Form.FindFormField("fullName").Value = "John Smith";
formPdf.Form.FindFormField("email").Value = "john.smith@example.com";
formPdf.Form.FindFormField("department").Value = "engineering";
// Save the interactive form
formPdf.SaveAs("application-form.pdf");
// You can also read and process submitted forms
var submittedPdf = PdfDocument.FromFile("submitted-form.pdf");
var name = submittedPdf.Form.FindFormField("fullName").Value;
var email = submittedPdf.Form.FindFormField("email").Value;
Console.WriteLine($"Form submitted by: {name} ({email})");
Imports IronPDF
Imports System
Dim renderer As New ChromePdfRenderer()
' Enable form creation from HTML
renderer.RenderingOptions.CreatePdfFormsFromHtml = True
' Create an interactive form with various input types
Dim formHtml As String = "
<html>
<head>
<style>
body { font-family: Arial, sans-serif; padding: 40px; }
.form-group { margin-bottom: 20px; }
label { display: block; margin-bottom: 5px; font-weight: bold; }
input[type='text'], input[type='email'], select, textarea {
width: 100%;
padding: 8px;
border: 1px solid #ccc;
border-radius: 4px;
font-size: 14px;
}
.checkbox-group { margin: 10px 0; }
.submit-section {
margin-top: 30px;
padding-top: 20px;
border-top: 2px solid #0066cc;
}
</style>
</head>
<body>
# Application Form
<form>
<div class='form-group'>
<label for='fullName'>Full Name:</label>
<input type='text' id='fullName' name='fullName' required />
</div>
<div class='form-group'>
<label for='email'>Email Address:</label>
<input type='email' id='email' name='email' required />
</div>
<div class='form-group'>
<label for='department'>Department:</label>
<select id='department' name='department'>
<option value=''>Select Department</option>
<option value='sales'>Sales</option>
<option value='marketing'>Marketing</option>
<option value='engineering'>Engineering</option>
<option value='hr'>Human Resources</option>
</select>
</div>
<div class='form-group'>
<label>Interests:</label>
<div class='checkbox-group'>
<label><input type='checkbox' name='interests' value='training' /> Professional Training</label>
<label><input type='checkbox' name='interests' value='conferences' /> Industry Conferences</label>
<label><input type='checkbox' name='interests' value='certification' /> Certification Programs</label>
</div>
</div>
<div class='form-group'>
<label for='comments'>Additional Comments:</label>
<textarea id='comments' name='comments' rows='4'></textarea>
</div>
<div class='submit-section'>
<p><em>Please save this form and email to hr@company.com</em></p>
</div>
</form>
</body>
</html>"
' Create the PDF with form fields
Dim formPdf = renderer.RenderHtmlAsPdf(formHtml)
' Optionally pre-fill form fields programmatically
formPdf.Form.FindFormField("fullName").Value = "John Smith"
formPdf.Form.FindFormField("email").Value = "john.smith@example.com"
formPdf.Form.FindFormField("department").Value = "engineering"
' Save the interactive form
formPdf.SaveAs("application-form.pdf")
' You can also read and process submitted forms
Dim submittedPdf = PdfDocument.FromFile("submitted-form.pdf")
Dim name = submittedPdf.Form.FindFormField("fullName").Value
Dim email = submittedPdf.Form.FindFormField("email").Value
Console.WriteLine($"Form submitted by: {name} ({email})")
Oluşturulan PDF'lerinizi Güvence Altına Alın
Güvenlik, hassas belgelerle uğraşırken çok önemlidir. IronPDF, PDF'lerinizi yetkisiz erişim veya değişikliklerden korumak için kapsamlı güvenlik özellikleri sağlar:
// Namespace: IronPDF
using IronPDF;
// Namespace: IronPdf.Editing
using IronPdf.Editing;
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Confidential Document</h1><p>Sensitive information...</p>");
// Apply password protection
pdf.SecuritySettings.UserPassword = "user123"; // Required to open
pdf.SecuritySettings.OwnerPassword = "owner456"; // Required to modify
// Set detailed permissions
pdf.SecuritySettings.AllowUserCopyPasteContent = false;
pdf.SecuritySettings.AllowUserAnnotations = false;
pdf.SecuritySettings.AllowUserFormData = true;
pdf.SecuritySettings.AllowUserPrinting = PrintPermissions.LowQualityPrint;
// Add digital signature for authenticity
pdf.SignWithFile(
certificatePath: "certificate.pfx",
certificatePassword: "certpass123",
signingReason: "Document Approval",
signingLocation: "New York, NY",
signatureImage: new Signature("signature.png")
{
Width = 150,
Height = 50
}
);
// Apply redaction to hide sensitive information
pdf.RedactTextOnPage(
pageIndex: 0,
searchText: "SSN: ***-**-****",
replacementText: "[REDACTED]",
caseSensitive: false
);
// Save the secured PDF
pdf.SaveAs("secure-confidential.pdf");
// Namespace: IronPDF
using IronPDF;
// Namespace: IronPdf.Editing
using IronPdf.Editing;
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Confidential Document</h1><p>Sensitive information...</p>");
// Apply password protection
pdf.SecuritySettings.UserPassword = "user123"; // Required to open
pdf.SecuritySettings.OwnerPassword = "owner456"; // Required to modify
// Set detailed permissions
pdf.SecuritySettings.AllowUserCopyPasteContent = false;
pdf.SecuritySettings.AllowUserAnnotations = false;
pdf.SecuritySettings.AllowUserFormData = true;
pdf.SecuritySettings.AllowUserPrinting = PrintPermissions.LowQualityPrint;
// Add digital signature for authenticity
pdf.SignWithFile(
certificatePath: "certificate.pfx",
certificatePassword: "certpass123",
signingReason: "Document Approval",
signingLocation: "New York, NY",
signatureImage: new Signature("signature.png")
{
Width = 150,
Height = 50
}
);
// Apply redaction to hide sensitive information
pdf.RedactTextOnPage(
pageIndex: 0,
searchText: "SSN: ***-**-****",
replacementText: "[REDACTED]",
caseSensitive: false
);
// Save the secured PDF
pdf.SaveAs("secure-confidential.pdf");
Imports IronPDF
Imports IronPdf.Editing
Dim renderer As New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf("<h1>Confidential Document</h1><p>Sensitive information...</p>")
' Apply password protection
pdf.SecuritySettings.UserPassword = "user123" ' Required to open
pdf.SecuritySettings.OwnerPassword = "owner456" ' Required to modify
' Set detailed permissions
pdf.SecuritySettings.AllowUserCopyPasteContent = False
pdf.SecuritySettings.AllowUserAnnotations = False
pdf.SecuritySettings.AllowUserFormData = True
pdf.SecuritySettings.AllowUserPrinting = PrintPermissions.LowQualityPrint
' Add digital signature for authenticity
pdf.SignWithFile(
certificatePath:="certificate.pfx",
certificatePassword:="certpass123",
signingReason:="Document Approval",
signingLocation:="New York, NY",
signatureImage:=New Signature("signature.png") With {
.Width = 150,
.Height = 50
}
)
' Apply redaction to hide sensitive information
pdf.RedactTextOnPage(
pageIndex:=0,
searchText:="SSN: ***-**-****",
replacementText:="[REDACTED]",
caseSensitive:=False
)
' Save the secured PDF
pdf.SaveAs("secure-confidential.pdf")
PDF'leri Birleştirme ve Bölme
Birden fazla PDF'yi birleştirmek veya belirli sayfaları çıkarmak, belge yönetim iş akışları için önemlidir:
// Namespace: IronPDF
using IronPDF;
// Namespace: System
using System;
// Merge multiple PDFs into one document
var coverPage = new ChromePdfRenderer().RenderHtmlAsPdf("<h1>Annual Report 2024</h1>");
var introduction = PdfDocument.FromFile("introduction.pdf");
var financials = PdfDocument.FromFile("financials.pdf");
var appendix = PdfDocument.FromFile("appendix.pdf");
// Merge all documents
var completeReport = PdfDocument.Merge(coverPage, introduction, financials, appendix);
// Add page numbers to the merged document
for (int i = 0; i < completeReport.PageCount; i++)
{
completeReport.AddTextFooterToPage(i,
$"Page {i + 1} of {completeReport.PageCount}",
IronPdf.Font.FontTypes.Arial,
10);
}
completeReport.SaveAs("annual-report-complete.pdf");
// Extract specific pages
var executiveSummary = completeReport.CopyPages(0, 4); // First 5 pages
executiveSummary.SaveAs("executive-summary.pdf");
// Split a large PDF into chapters
var sourcePdf = PdfDocument.FromFile("large-document.pdf");
var chaptersPerFile = 50;
for (int i = 0; i < sourcePdf.PageCount; i += chaptersPerFile)
{
var endPage = Math.Min(i + chaptersPerFile - 1, sourcePdf.PageCount - 1);
var chapter = sourcePdf.CopyPages(i, endPage);
chapter.SaveAs($"chapter-{(i / chaptersPerFile) + 1}.pdf");
}
// Namespace: IronPDF
using IronPDF;
// Namespace: System
using System;
// Merge multiple PDFs into one document
var coverPage = new ChromePdfRenderer().RenderHtmlAsPdf("<h1>Annual Report 2024</h1>");
var introduction = PdfDocument.FromFile("introduction.pdf");
var financials = PdfDocument.FromFile("financials.pdf");
var appendix = PdfDocument.FromFile("appendix.pdf");
// Merge all documents
var completeReport = PdfDocument.Merge(coverPage, introduction, financials, appendix);
// Add page numbers to the merged document
for (int i = 0; i < completeReport.PageCount; i++)
{
completeReport.AddTextFooterToPage(i,
$"Page {i + 1} of {completeReport.PageCount}",
IronPdf.Font.FontTypes.Arial,
10);
}
completeReport.SaveAs("annual-report-complete.pdf");
// Extract specific pages
var executiveSummary = completeReport.CopyPages(0, 4); // First 5 pages
executiveSummary.SaveAs("executive-summary.pdf");
// Split a large PDF into chapters
var sourcePdf = PdfDocument.FromFile("large-document.pdf");
var chaptersPerFile = 50;
for (int i = 0; i < sourcePdf.PageCount; i += chaptersPerFile)
{
var endPage = Math.Min(i + chaptersPerFile - 1, sourcePdf.PageCount - 1);
var chapter = sourcePdf.CopyPages(i, endPage);
chapter.SaveAs($"chapter-{(i / chaptersPerFile) + 1}.pdf");
}
Imports IronPDF
Imports System
' Merge multiple PDFs into one document
Dim coverPage = New ChromePdfRenderer().RenderHtmlAsPdf("<h1>Annual Report 2024</h1>")
Dim introduction = PdfDocument.FromFile("introduction.pdf")
Dim financials = PdfDocument.FromFile("financials.pdf")
Dim appendix = PdfDocument.FromFile("appendix.pdf")
' Merge all documents
Dim completeReport = PdfDocument.Merge(coverPage, introduction, financials, appendix)
' Add page numbers to the merged document
For i As Integer = 0 To completeReport.PageCount - 1
completeReport.AddTextFooterToPage(i, $"Page {i + 1} of {completeReport.PageCount}", IronPdf.Font.FontTypes.Arial, 10)
Next
completeReport.SaveAs("annual-report-complete.pdf")
' Extract specific pages
Dim executiveSummary = completeReport.CopyPages(0, 4) ' First 5 pages
executiveSummary.SaveAs("executive-summary.pdf")
' Split a large PDF into chapters
Dim sourcePdf = PdfDocument.FromFile("large-document.pdf")
Dim chaptersPerFile As Integer = 50
For i As Integer = 0 To sourcePdf.PageCount - 1 Step chaptersPerFile
Dim endPage = Math.Min(i + chaptersPerFile - 1, sourcePdf.PageCount - 1)
Dim chapter = sourcePdf.CopyPages(i, endPage)
chapter.SaveAs($"chapter-{(i \ chaptersPerFile) + 1}.pdf")
Next
Filigranlar ve Damgalar Ekleyin
PDF'lerde filigran ekleme, belge kontrolü ve markalama için önemlidir. IronPDF, hem metin hem de resim filigranlarını destekler:
// Namespace: IronPDF
using IronPDF;
// Namespace: System
using System;
var pdf = PdfDocument.FromFile("document.pdf");
// Add text watermark
pdf.ApplyWatermark(
html: "<h1 style='color: #ff0000; opacity: 0.5; font-size: 100px;'>DRAFT</h1>",
rotation: 45,
opacity: 50,
verticalAlignment: VerticalAlignment.Middle,
horizontalAlignment: HorizontalAlignment.Center
);
// Add image watermark (company logo)
pdf.ApplyWatermark(
html: "<img src='logo-watermark.png' style='width: 300px;' />",
rotation: 0,
opacity: 30,
verticalAlignment: VerticalAlignment.Bottom,
horizontalAlignment: HorizontalAlignment.Right
);
// Add stamps for document status
pdf.StampHtml(
Html: @"<div style='border: 3px solid green; padding: 10px;
background: white; font-weight: bold; color: green;'>
APPROVED<br/>
" + DateTime.Now.ToString("MM/dd/yyyy") + @"
</div>",
X: 400,
Y: 100,
Width: 150,
Height: 60,
PageIndex: 0
);
pdf.SaveAs("watermarked-document.pdf");
// Namespace: IronPDF
using IronPDF;
// Namespace: System
using System;
var pdf = PdfDocument.FromFile("document.pdf");
// Add text watermark
pdf.ApplyWatermark(
html: "<h1 style='color: #ff0000; opacity: 0.5; font-size: 100px;'>DRAFT</h1>",
rotation: 45,
opacity: 50,
verticalAlignment: VerticalAlignment.Middle,
horizontalAlignment: HorizontalAlignment.Center
);
// Add image watermark (company logo)
pdf.ApplyWatermark(
html: "<img src='logo-watermark.png' style='width: 300px;' />",
rotation: 0,
opacity: 30,
verticalAlignment: VerticalAlignment.Bottom,
horizontalAlignment: HorizontalAlignment.Right
);
// Add stamps for document status
pdf.StampHtml(
Html: @"<div style='border: 3px solid green; padding: 10px;
background: white; font-weight: bold; color: green;'>
APPROVED<br/>
" + DateTime.Now.ToString("MM/dd/yyyy") + @"
</div>",
X: 400,
Y: 100,
Width: 150,
Height: 60,
PageIndex: 0
);
pdf.SaveAs("watermarked-document.pdf");
Imports IronPDF
Imports System
Dim pdf = PdfDocument.FromFile("document.pdf")
' Add text watermark
pdf.ApplyWatermark(
html:="<h1 style='color: #ff0000; opacity: 0.5; font-size: 100px;'>DRAFT</h1>",
rotation:=45,
opacity:=50,
verticalAlignment:=VerticalAlignment.Middle,
horizontalAlignment:=HorizontalAlignment.Center
)
' Add image watermark (company logo)
pdf.ApplyWatermark(
html:="<img src='logo-watermark.png' style='width: 300px;' />",
rotation:=0,
opacity:=30,
verticalAlignment:=VerticalAlignment.Bottom,
horizontalAlignment:=HorizontalAlignment.Right
)
' Add stamps for document status
pdf.StampHtml(
Html:="<div style='border: 3px solid green; padding: 10px;
background: white; font-weight: bold; color: green;'>
APPROVED<br/>" & DateTime.Now.ToString("MM/dd/yyyy") & "
</div>",
X:=400,
Y:=100,
Width:=150,
Height:=60,
PageIndex:=0
)
pdf.SaveAs("watermarked-document.pdf")
PDF'leri Ölçekli Olarak Üretirken Performansı Nasıl Optimize Edebilirim?
PDF'leri ölçekli olarak üretirken performans kritik hale gelir. İster binlerce fatura üretiyor olun ister büyük toplu işler işliyorsanız, PDF oluşturma kodunuzu optimize etmek, verimliliği önemli ölçüde artırabilir ve kaynak tüketimini azaltabilir. Modern uygulamalar, C# içinde PDF oluşturmanın verimli olmasını gerektirir ki, bu da işlem hatlarını engellemez veya aşırı bellek tüketmez. .NET içinde PDF'ler üretmeniz gerektiğinde görevinizin ortamını optimize etmenin kanıtlanmış stratejileri işte buradadır.
Asenkron PDF Oluşturma
Modern uygulamalar, yanıt verme kabiliyetini sürdürmek için engelleyici olmayan işlemler gerektirir. IronPDF, tüm ana işlemler için eşzamanlı yöntemler sağlar:
// Namespace: IronPDF
using IronPDF;
// Namespace: System.Threading.Tasks
using System.Threading.Tasks;
// Namespace: System.Collections.Generic
using System.Collections.Generic;
// Namespace: System.Linq
using System.Linq;
// Namespace: System
using System;
// Namespace: System.Threading
using System.Threading;
public class AsyncPdfService
{
private readonly ChromePdfRenderer _renderer;
public AsyncPdfService()
{
_renderer = new ChromePdfRenderer();
// Configure renderer once for reuse
_renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
}
public async Task<byte[]> GeneratePdfAsync(string html)
{
// Non-blocking PDF generation
var pdf = await _renderer.RenderHtmlAsPdfAsync(html);
return pdf.BinaryData;
}
public async Task GenerateBatchAsync(List<string> htmlDocuments)
{
// Process multiple PDFs concurrently
var tasks = htmlDocuments.Select(async (html, index) =>
{
var pdf = await _renderer.RenderHtmlAsPdfAsync(html);
await pdf.SaveAsAsync($"document-{index}.pdf");
});
await Task.WhenAll(tasks);
}
// Async with cancellation support
public async Task<PdfDocument> GenerateWithTimeoutAsync(string html, int timeoutSeconds)
{
using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(timeoutSeconds));
try
{
return await _renderer.RenderHtmlAsPdfAsync(html, cts.Token);
}
catch (OperationCanceledException)
{
throw new TimeoutException("PDF generation exceeded timeout");
}
}
}
// Namespace: IronPDF
using IronPDF;
// Namespace: System.Threading.Tasks
using System.Threading.Tasks;
// Namespace: System.Collections.Generic
using System.Collections.Generic;
// Namespace: System.Linq
using System.Linq;
// Namespace: System
using System;
// Namespace: System.Threading
using System.Threading;
public class AsyncPdfService
{
private readonly ChromePdfRenderer _renderer;
public AsyncPdfService()
{
_renderer = new ChromePdfRenderer();
// Configure renderer once for reuse
_renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
}
public async Task<byte[]> GeneratePdfAsync(string html)
{
// Non-blocking PDF generation
var pdf = await _renderer.RenderHtmlAsPdfAsync(html);
return pdf.BinaryData;
}
public async Task GenerateBatchAsync(List<string> htmlDocuments)
{
// Process multiple PDFs concurrently
var tasks = htmlDocuments.Select(async (html, index) =>
{
var pdf = await _renderer.RenderHtmlAsPdfAsync(html);
await pdf.SaveAsAsync($"document-{index}.pdf");
});
await Task.WhenAll(tasks);
}
// Async with cancellation support
public async Task<PdfDocument> GenerateWithTimeoutAsync(string html, int timeoutSeconds)
{
using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(timeoutSeconds));
try
{
return await _renderer.RenderHtmlAsPdfAsync(html, cts.Token);
}
catch (OperationCanceledException)
{
throw new TimeoutException("PDF generation exceeded timeout");
}
}
}
Imports IronPDF
Imports System.Threading.Tasks
Imports System.Collections.Generic
Imports System.Linq
Imports System
Imports System.Threading
Public Class AsyncPdfService
Private ReadOnly _renderer As ChromePdfRenderer
Public Sub New()
_renderer = New ChromePdfRenderer()
' Configure renderer once for reuse
_renderer.RenderingOptions.PaperSize = PdfPaperSize.A4
End Sub
Public Async Function GeneratePdfAsync(html As String) As Task(Of Byte())
' Non-blocking PDF generation
Dim pdf = Await _renderer.RenderHtmlAsPdfAsync(html)
Return pdf.BinaryData
End Function
Public Async Function GenerateBatchAsync(htmlDocuments As List(Of String)) As Task
' Process multiple PDFs concurrently
Dim tasks = htmlDocuments.Select(Async Function(html, index)
Dim pdf = Await _renderer.RenderHtmlAsPdfAsync(html)
Await pdf.SaveAsAsync($"document-{index}.pdf")
End Function)
Await Task.WhenAll(tasks)
End Function
' Async with cancellation support
Public Async Function GenerateWithTimeoutAsync(html As String, timeoutSeconds As Integer) As Task(Of PdfDocument)
Using cts As New CancellationTokenSource(TimeSpan.FromSeconds(timeoutSeconds))
Try
Return Await _renderer.RenderHtmlAsPdfAsync(html, cts.Token)
Catch ex As OperationCanceledException
Throw New TimeoutException("PDF generation exceeded timeout")
End Try
End Using
End Function
End Class
Toplu İşleme En İyi Uygulamaları
Birden fazla PDF işlerken, doğru kaynak yönetimi ve paralel işlem, performansı önemli ölçüde artırabilir:
using IronPDF;
using System.Threading.Tasks.Dataflow;
public class BatchPdfProcessor
{
private readonly ChromePdfRenderer _renderer;
private readonly ActionBlock<PdfJob> _processingBlock;
public BatchPdfProcessor(int maxConcurrency = 4)
{
_renderer = new ChromePdfRenderer();
// Create a processing pipeline with controlled concurrency
_processingBlock = new ActionBlock<PdfJob>(
async job => await ProcessPdfAsync(job),
new ExecutionDataflowBlockOptions
{
MaxDegreeOfParallelism = maxConcurrency,
BoundedCapacity = maxConcurrency * 2
});
}
private async Task ProcessPdfAsync(PdfJob job)
{
try
{
var pdf = await _renderer.RenderHtmlAsPdfAsync(job.Html);
await pdf.SaveAsAsync(job.OutputPath);
job.OnSuccess?.Invoke();
}
catch (Exception ex)
{
job.OnError?.Invoke(ex);
}
}
public async Task<bool> QueuePdfAsync(PdfJob job)
{
return await _processingBlock.SendAsync(job);
}
public async Task CompleteAsync()
{
_processingBlock.Complete();
await _processingBlock.Completion;
}
}
public class PdfJob
{
public string Html { get; set; }
public string OutputPath { get; set; }
public Action OnSuccess { get; set; }
public Action<Exception> OnError { get; set; }
}
using IronPDF;
using System.Threading.Tasks.Dataflow;
public class BatchPdfProcessor
{
private readonly ChromePdfRenderer _renderer;
private readonly ActionBlock<PdfJob> _processingBlock;
public BatchPdfProcessor(int maxConcurrency = 4)
{
_renderer = new ChromePdfRenderer();
// Create a processing pipeline with controlled concurrency
_processingBlock = new ActionBlock<PdfJob>(
async job => await ProcessPdfAsync(job),
new ExecutionDataflowBlockOptions
{
MaxDegreeOfParallelism = maxConcurrency,
BoundedCapacity = maxConcurrency * 2
});
}
private async Task ProcessPdfAsync(PdfJob job)
{
try
{
var pdf = await _renderer.RenderHtmlAsPdfAsync(job.Html);
await pdf.SaveAsAsync(job.OutputPath);
job.OnSuccess?.Invoke();
}
catch (Exception ex)
{
job.OnError?.Invoke(ex);
}
}
public async Task<bool> QueuePdfAsync(PdfJob job)
{
return await _processingBlock.SendAsync(job);
}
public async Task CompleteAsync()
{
_processingBlock.Complete();
await _processingBlock.Completion;
}
}
public class PdfJob
{
public string Html { get; set; }
public string OutputPath { get; set; }
public Action OnSuccess { get; set; }
public Action<Exception> OnError { get; set; }
}
Imports IronPDF
Imports System.Threading.Tasks.Dataflow
Public Class BatchPdfProcessor
Private ReadOnly _renderer As ChromePdfRenderer
Private ReadOnly _processingBlock As ActionBlock(Of PdfJob)
Public Sub New(Optional maxConcurrency As Integer = 4)
_renderer = New ChromePdfRenderer()
' Create a processing pipeline with controlled concurrency
_processingBlock = New ActionBlock(Of PdfJob)(
Async Function(job) Await ProcessPdfAsync(job),
New ExecutionDataflowBlockOptions With {
.MaxDegreeOfParallelism = maxConcurrency,
.BoundedCapacity = maxConcurrency * 2
})
End Sub
Private Async Function ProcessPdfAsync(job As PdfJob) As Task
Try
Dim pdf = Await _renderer.RenderHtmlAsPdfAsync(job.Html)
Await pdf.SaveAsAsync(job.OutputPath)
job.OnSuccess?.Invoke()
Catch ex As Exception
job.OnError?.Invoke(ex)
End Try
End Function
Public Async Function QueuePdfAsync(job As PdfJob) As Task(Of Boolean)
Return Await _processingBlock.SendAsync(job)
End Function
Public Async Function CompleteAsync() As Task
_processingBlock.Complete()
Await _processingBlock.Completion
End Function
End Class
Public Class PdfJob
Public Property Html As String
Public Property OutputPath As String
Public Property OnSuccess As Action
Public Property OnError As Action(Of Exception)
End Class
Bellek Optimizasyon Teknikleri
Büyük PDF'ler veya yüksek hacimli işleme için bellek yönetimi önemlidir:
using IronPDF;
public class MemoryEfficientPdfGenerator
{
private readonly ChromePdfRenderer _renderer;
public MemoryEfficientPdfGenerator()
{
_renderer = new ChromePdfRenderer();
// Optimize for memory usage
_renderer.RenderingOptions.RenderQuality = 90; // Slightly lower quality for smaller size
_renderer.RenderingOptions.ImageQuality = 85; // Compress images
}
// Stream large PDFs instead of loading into memory
public async Task GenerateLargePdfToStreamAsync(string html, Stream outputStream)
{
var pdf = await _renderer.RenderHtmlAsPdfAsync(html);
// Write directly to stream without keeping in memory
using (pdf)
{
var bytes = pdf.BinaryData;
await outputStream.WriteAsync(bytes, 0, bytes.Length);
}
}
// Process large HTML in chunks
public async Task<PdfDocument> GenerateFromChunksAsync(List<string> htmlChunks)
{
var pdfs = new List<PdfDocument>();
try
{
// Generate each chunk separately
foreach (var chunk in htmlChunks)
{
var chunkPdf = await _renderer.RenderHtmlAsPdfAsync(chunk);
pdfs.Add(chunkPdf);
}
// Merge all chunks
return PdfDocument.Merge(pdfs.ToArray());
}
finally
{
// Ensure all temporary PDFs are disposed
foreach (var pdf in pdfs)
{
pdf?.Dispose();
}
}
}
}
using IronPDF;
public class MemoryEfficientPdfGenerator
{
private readonly ChromePdfRenderer _renderer;
public MemoryEfficientPdfGenerator()
{
_renderer = new ChromePdfRenderer();
// Optimize for memory usage
_renderer.RenderingOptions.RenderQuality = 90; // Slightly lower quality for smaller size
_renderer.RenderingOptions.ImageQuality = 85; // Compress images
}
// Stream large PDFs instead of loading into memory
public async Task GenerateLargePdfToStreamAsync(string html, Stream outputStream)
{
var pdf = await _renderer.RenderHtmlAsPdfAsync(html);
// Write directly to stream without keeping in memory
using (pdf)
{
var bytes = pdf.BinaryData;
await outputStream.WriteAsync(bytes, 0, bytes.Length);
}
}
// Process large HTML in chunks
public async Task<PdfDocument> GenerateFromChunksAsync(List<string> htmlChunks)
{
var pdfs = new List<PdfDocument>();
try
{
// Generate each chunk separately
foreach (var chunk in htmlChunks)
{
var chunkPdf = await _renderer.RenderHtmlAsPdfAsync(chunk);
pdfs.Add(chunkPdf);
}
// Merge all chunks
return PdfDocument.Merge(pdfs.ToArray());
}
finally
{
// Ensure all temporary PDFs are disposed
foreach (var pdf in pdfs)
{
pdf?.Dispose();
}
}
}
}
Imports IronPDF
Public Class MemoryEfficientPdfGenerator
Private ReadOnly _renderer As ChromePdfRenderer
Public Sub New()
_renderer = New ChromePdfRenderer()
' Optimize for memory usage
_renderer.RenderingOptions.RenderQuality = 90 ' Slightly lower quality for smaller size
_renderer.RenderingOptions.ImageQuality = 85 ' Compress images
End Sub
' Stream large PDFs instead of loading into memory
Public Async Function GenerateLargePdfToStreamAsync(html As String, outputStream As Stream) As Task
Dim pdf = Await _renderer.RenderHtmlAsPdfAsync(html)
' Write directly to stream without keeping in memory
Using pdf
Dim bytes = pdf.BinaryData
Await outputStream.WriteAsync(bytes, 0, bytes.Length)
End Using
End Function
' Process large HTML in chunks
Public Async Function GenerateFromChunksAsync(htmlChunks As List(Of String)) As Task(Of PdfDocument)
Dim pdfs = New List(Of PdfDocument)()
Try
' Generate each chunk separately
For Each chunk In htmlChunks
Dim chunkPdf = Await _renderer.RenderHtmlAsPdfAsync(chunk)
pdfs.Add(chunkPdf)
Next
' Merge all chunks
Return PdfDocument.Merge(pdfs.ToArray())
Finally
' Ensure all temporary PDFs are disposed
For Each pdf In pdfs
pdf?.Dispose()
Next
End Try
End Function
End Class
Önbellekleme ve Şablon Optimizasyonu
Ortak öğeleri önbelleğe alarak ve şablonları optimize ederek işlem süresini azaltın:
using IronPDF;
using Microsoft.Extensions.Caching.Memory;
public class CachedPdfService
{
private readonly ChromePdfRenderer _renderer;
private readonly IMemoryCache _cache;
private readonly Dictionary<string, string> _compiledTemplates;
public CachedPdfService(IMemoryCache cache)
{
_renderer = new ChromePdfRenderer();
_cache = cache;
_compiledTemplates = new Dictionary<string, string>();
// Pre-compile common templates
PrecompileTemplates();
}
private void PrecompileTemplates()
{
// Load and cache common CSS
var commonCss = File.ReadAllText("Templates/common.css");
_compiledTemplates["commonCss"] = commonCss;
// Cache logo as Base64
var logoBytes = File.ReadAllBytes("Assets/logo.png");
var logoBase64 = Convert.ToBase64String(logoBytes);
_compiledTemplates["logoData"] = $"data:image/png;base64,{logoBase64}";
}
public async Task<byte[]> GenerateInvoicePdfAsync(string invoiceId, InvoiceData data)
{
// Check cache first
var cacheKey = $"invoice_{invoiceId}";
if (_cache.TryGetValue<byte[]>(cacheKey, out var cachedPdf))
{
return cachedPdf;
}
// Generate PDF with cached templates
var html = BuildHtmlWithCache(data);
var pdf = await _renderer.RenderHtmlAsPdfAsync(html);
var pdfBytes = pdf.BinaryData;
// Cache for 1 hour
_cache.Set(cacheKey, pdfBytes, TimeSpan.FromHours(1));
return pdfBytes;
}
private string BuildHtmlWithCache(InvoiceData data)
{
return @"
<html>
<head>
<style>{_compiledTemplates["commonCss"]}</style>
</head>
<body>
<img src='{_compiledTemplates["logoData"]}' />
</body>
</html>";
}
}
using IronPDF;
using Microsoft.Extensions.Caching.Memory;
public class CachedPdfService
{
private readonly ChromePdfRenderer _renderer;
private readonly IMemoryCache _cache;
private readonly Dictionary<string, string> _compiledTemplates;
public CachedPdfService(IMemoryCache cache)
{
_renderer = new ChromePdfRenderer();
_cache = cache;
_compiledTemplates = new Dictionary<string, string>();
// Pre-compile common templates
PrecompileTemplates();
}
private void PrecompileTemplates()
{
// Load and cache common CSS
var commonCss = File.ReadAllText("Templates/common.css");
_compiledTemplates["commonCss"] = commonCss;
// Cache logo as Base64
var logoBytes = File.ReadAllBytes("Assets/logo.png");
var logoBase64 = Convert.ToBase64String(logoBytes);
_compiledTemplates["logoData"] = $"data:image/png;base64,{logoBase64}";
}
public async Task<byte[]> GenerateInvoicePdfAsync(string invoiceId, InvoiceData data)
{
// Check cache first
var cacheKey = $"invoice_{invoiceId}";
if (_cache.TryGetValue<byte[]>(cacheKey, out var cachedPdf))
{
return cachedPdf;
}
// Generate PDF with cached templates
var html = BuildHtmlWithCache(data);
var pdf = await _renderer.RenderHtmlAsPdfAsync(html);
var pdfBytes = pdf.BinaryData;
// Cache for 1 hour
_cache.Set(cacheKey, pdfBytes, TimeSpan.FromHours(1));
return pdfBytes;
}
private string BuildHtmlWithCache(InvoiceData data)
{
return @"
<html>
<head>
<style>{_compiledTemplates["commonCss"]}</style>
</head>
<body>
<img src='{_compiledTemplates["logoData"]}' />
</body>
</html>";
}
}
Imports IronPDF
Imports Microsoft.Extensions.Caching.Memory
Imports System.IO
Imports System.Threading.Tasks
Public Class CachedPdfService
Private ReadOnly _renderer As ChromePdfRenderer
Private ReadOnly _cache As IMemoryCache
Private ReadOnly _compiledTemplates As Dictionary(Of String, String)
Public Sub New(cache As IMemoryCache)
_renderer = New ChromePdfRenderer()
_cache = cache
_compiledTemplates = New Dictionary(Of String, String)()
' Pre-compile common templates
PrecompileTemplates()
End Sub
Private Sub PrecompileTemplates()
' Load and cache common CSS
Dim commonCss As String = File.ReadAllText("Templates/common.css")
_compiledTemplates("commonCss") = commonCss
' Cache logo as Base64
Dim logoBytes As Byte() = File.ReadAllBytes("Assets/logo.png")
Dim logoBase64 As String = Convert.ToBase64String(logoBytes)
_compiledTemplates("logoData") = $"data:image/png;base64,{logoBase64}"
End Sub
Public Async Function GenerateInvoicePdfAsync(invoiceId As String, data As InvoiceData) As Task(Of Byte())
' Check cache first
Dim cacheKey As String = $"invoice_{invoiceId}"
Dim cachedPdf As Byte() = Nothing
If _cache.TryGetValue(cacheKey, cachedPdf) Then
Return cachedPdf
End If
' Generate PDF with cached templates
Dim html As String = BuildHtmlWithCache(data)
Dim pdf = Await _renderer.RenderHtmlAsPdfAsync(html)
Dim pdfBytes As Byte() = pdf.BinaryData
' Cache for 1 hour
_cache.Set(cacheKey, pdfBytes, TimeSpan.FromHours(1))
Return pdfBytes
End Function
Private Function BuildHtmlWithCache(data As InvoiceData) As String
Return $"
<html>
<head>
<style>{_compiledTemplates("commonCss")}</style>
</head>
<body>
<img src='{_compiledTemplates("logoData")}' />
</body>
</html>"
End Function
End Class
PDF Oluştururken Karşılaşılan Genel Sorunlar ve Bunları Nasıl Çözebilirim?
Güçlü bir .NET PDF kütüphanesi olan IronPDF ile bile, C#'ta PDF oluşturduğunuzda geliştirme veya dağıtım sırasında zorluklarla karşılaşabilirsiniz. Genel sorunları ve çözümlerini anlamak, sorunları hızla çözmenize ve PDF oluşturma işlemlerini sorunsuzca sürdürmenize yardımcı olur. 14 milyondan fazla geliştirici IronPDF'yi C# PDF oluşturucusu olarak kullanırken, muhtemelen çoğu sorun daha önceden karşılaşılmış ve çözülmüştür. Bu sorun giderme kılavuzu, .NET'te PDF oluştururken geliştiricilerin karşılaştığı en yaygın sorunları kapsar ve gerçek dünya deneyimlerine dayanan pratik çözümler sunar. 7/24 destek her zaman PDF oluşturma meseleleriniz için derhal yardım almanız gerekiyorsa mevcuttur.
Sorun 1: Başarısız Rendering veya Boş PDF'ler
En yaygın sorunlardan biri boş görünen veya doğru şekilde render edilmeyen PDF'lerdir. Bu tipik olarak girdilerin zamanında yüklenmemesi veya JavaScript zamanlama sorunları:
// Namespace: IronPDF
using IronPDF;
// Namespace: System.IO
using System.IO;
// Namespace: System
using System;
// Problem: PDF is blank or missing content
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(complexHtml); // Results in blank PDF
// Solution 1: Add render delay for JavaScript-heavy content
renderer.RenderingOptions.RenderDelay = 3000; // Wait 3 seconds
renderer.RenderingOptions.EnableJavaScript = true;
// Solution 2: Wait for specific elements
renderer.RenderingOptions.WaitFor = new WaitFor()
{
JavaScriptQuery = "document.querySelector('#chart-loaded') !== null",
WaitForType = WaitForType.JavaScript,
Timeout = 30000 // 30 second timeout
};
// Solution 3: Use base path for local assets
var basePath = Path.GetFullPath("Assets");
var pdf = renderer.RenderHtmlAsPdf(htmlWithImages, basePath);
// Solution 4: Embed assets as Base64
var imageBase64 = Convert.ToBase64String(File.ReadAllBytes("logo.png"));
var htmlWithEmbedded = $@"<img src='data:image/png;base64,{imageBase64}' />";
// Namespace: IronPDF
using IronPDF;
// Namespace: System.IO
using System.IO;
// Namespace: System
using System;
// Problem: PDF is blank or missing content
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(complexHtml); // Results in blank PDF
// Solution 1: Add render delay for JavaScript-heavy content
renderer.RenderingOptions.RenderDelay = 3000; // Wait 3 seconds
renderer.RenderingOptions.EnableJavaScript = true;
// Solution 2: Wait for specific elements
renderer.RenderingOptions.WaitFor = new WaitFor()
{
JavaScriptQuery = "document.querySelector('#chart-loaded') !== null",
WaitForType = WaitForType.JavaScript,
Timeout = 30000 // 30 second timeout
};
// Solution 3: Use base path for local assets
var basePath = Path.GetFullPath("Assets");
var pdf = renderer.RenderHtmlAsPdf(htmlWithImages, basePath);
// Solution 4: Embed assets as Base64
var imageBase64 = Convert.ToBase64String(File.ReadAllBytes("logo.png"));
var htmlWithEmbedded = $@"<img src='data:image/png;base64,{imageBase64}' />";
Imports IronPDF
Imports System.IO
Imports System
' Problem: PDF is blank or missing content
Dim renderer As New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf(complexHtml) ' Results in blank PDF
' Solution 1: Add render delay for JavaScript-heavy content
renderer.RenderingOptions.RenderDelay = 3000 ' Wait 3 seconds
renderer.RenderingOptions.EnableJavaScript = True
' Solution 2: Wait for specific elements
renderer.RenderingOptions.WaitFor = New WaitFor() With {
.JavaScriptQuery = "document.querySelector('#chart-loaded') !== null",
.WaitForType = WaitForType.JavaScript,
.Timeout = 30000 ' 30 second timeout
}
' Solution 3: Use base path for local assets
Dim basePath As String = Path.GetFullPath("Assets")
pdf = renderer.RenderHtmlAsPdf(htmlWithImages, basePath)
' Solution 4: Embed assets as Base64
Dim imageBase64 As String = Convert.ToBase64String(File.ReadAllBytes("logo.png"))
Dim htmlWithEmbedded As String = $"<img src='data:image/png;base64,{imageBase64}' />"
Sürekli render sorunları için, sorunu tanılamak için kayıt tutma (logging) etkinleştirin:
// Enable detailed logging
IronPdf.Logging.Logger.EnableDebugging = true;
IronPdf.Logging.Logger.LogFilePath = "IronPdf.log";
IronPdf.Logging.Logger.LoggingMode = IronPdf.Logging.Logger.LoggingModes.All;
// Enable detailed logging
IronPdf.Logging.Logger.EnableDebugging = true;
IronPdf.Logging.Logger.LogFilePath = "IronPdf.log";
IronPdf.Logging.Logger.LoggingMode = IronPdf.Logging.Logger.LoggingModes.All;
' Enable detailed logging
IronPdf.Logging.Logger.EnableDebugging = True
IronPdf.Logging.Logger.LogFilePath = "IronPdf.log"
IronPdf.Logging.Logger.LoggingMode = IronPdf.Logging.Logger.LoggingModes.All
Sorun 2: Yavaş İlk Render
İlk PDF oluşumu, başlatma yükü nedeniyle daha yavaş olabilir. IronPDF'nin ilk render'ı, bir masaüstü ortamında Chrome'un açılmasıyla benzer şekilde 2-3 saniye sürebilir ki bu normal bir başlangıç süre zemini:
// Problem: First PDF takes too long to generate
public class PdfService
{
private ChromePdfRenderer _renderer;
// Solution 1: Initialize renderer at startup
public void Initialize()
{
_renderer = new ChromePdfRenderer();
// Warm up the renderer
_ = _renderer.RenderHtmlAsPdf("<p>Warm up</p>");
}
// Solution 2: Use IronPdf.Native packages for faster initialization
// `Install-Package IronPdf.Native.Windows.X64`
// This includes pre-loaded binaries for your platform
// Solution 3: For cloud deployments, use appropriate packages
// For Linux: `Install-Package IronPdf.Linux`
// For Docker: Use IronPdf.Linux with proper dependencies
}
// Solution 4: Skip initialization checks in production
IronPdf.Installation.SkipInitialization = true; // Use only with persistent storage
// Problem: First PDF takes too long to generate
public class PdfService
{
private ChromePdfRenderer _renderer;
// Solution 1: Initialize renderer at startup
public void Initialize()
{
_renderer = new ChromePdfRenderer();
// Warm up the renderer
_ = _renderer.RenderHtmlAsPdf("<p>Warm up</p>");
}
// Solution 2: Use IronPdf.Native packages for faster initialization
// `Install-Package IronPdf.Native.Windows.X64`
// This includes pre-loaded binaries for your platform
// Solution 3: For cloud deployments, use appropriate packages
// For Linux: `Install-Package IronPdf.Linux`
// For Docker: Use IronPdf.Linux with proper dependencies
}
// Solution 4: Skip initialization checks in production
IronPdf.Installation.SkipInitialization = true; // Use only with persistent storage
Imports IronPdf
' Problem: First PDF takes too long to generate
Public Class PdfService
Private _renderer As ChromePdfRenderer
' Solution 1: Initialize renderer at startup
Public Sub Initialize()
_renderer = New ChromePdfRenderer()
' Warm up the renderer
Dim unused = _renderer.RenderHtmlAsPdf("<p>Warm up</p>")
End Sub
' Solution 2: Use IronPdf.Native packages for faster initialization
' `Install-Package IronPdf.Native.Windows.X64`
' This includes pre-loaded binaries for your platform
' Solution 3: For cloud deployments, use appropriate packages
' For Linux: `Install-Package IronPdf.Linux`
' For Docker: Use IronPdf.Linux with proper dependencies
End Class
' Solution 4: Skip initialization checks in production
IronPdf.Installation.SkipInitialization = True ' Use only with persistent storage
Başlangıç performansını optimize etme hakkında daha fazla okuyun
Sorun 3: Linux/Docker Üzerinde Dağıtım Sorunları
IronPDF, minimal Docker imajlarında bulunmayan belirli Linux bağımlılıkları gerektirir. Bunun gibi yaygın dağıtım sorunlarını nasıl çözebilirsiniz:
# Dockerfile for IronPDF on Linux
FROM mcr.microsoft.com/dotnet/aspnet:8.0
# Install required dependencies
RUN apt-get update && apt-get install -y \
libglib2.0-0 \
libnss3 \
libatk1.0-0 \
libatk-bridge2.0-0 \
libcups2 \
libxkbcommon0 \
libxcomposite1 \
libxdamage1 \
libxrandr2 \
libgbm1 \
libpango-1.0-0 \
libcairo2 \
libasound2 \
libxshmfence1 \
libx11-xcb1
# Copy and run your application
WORKDIR /app
COPY . .
ENTRYPOINT [".NET", "YourApp.dll"]
Özellikle Google Cloud Run için:
// Use 2nd generation execution environment
// Deploy with: gcloud run deploy --execution-environment gen2
// In your code, ensure compatibility
IronPdf.Installation.LinuxAndDockerDependenciesAutoConfig = true;
IronPdf.Installation.ChromeGpuMode = IronPdf.Engines.Chrome.ChromeGpuModes.Disabled;
// Use 2nd generation execution environment
// Deploy with: gcloud run deploy --execution-environment gen2
// In your code, ensure compatibility
IronPdf.Installation.LinuxAndDockerDependenciesAutoConfig = true;
IronPdf.Installation.ChromeGpuMode = IronPdf.Engines.Chrome.ChromeGpuModes.Disabled;
' Use 2nd generation execution environment
' Deploy with: gcloud run deploy --execution-environment gen2
' In your code, ensure compatibility
IronPdf.Installation.LinuxAndDockerDependenciesAutoConfig = True
IronPdf.Installation.ChromeGpuMode = IronPdf.Engines.Chrome.ChromeGpuModes.Disabled
Sorun 4: Bellek ve Performans Sorunları
Yüksek hacimli PDF üretimi için, bellek kullanımı ve performansı optimize edin:
// Problem: High memory usage or slow batch processing
public class OptimizedPdfService
{
private readonly ChromePdfRenderer _renderer;
public OptimizedPdfService()
{
_renderer = new ChromePdfRenderer();
// Optimize for performance
_renderer.RenderingOptions.RenderQuality = 90;
_renderer.RenderingOptions.ImageQuality = 85;
// Disable features you don't need
_renderer.RenderingOptions.EnableJavaScript = false; // If not needed
_renderer.RenderingOptions.RenderDelay = 0; // If content is static
}
// Solution 1: Process large documents in chunks
public async Task<PdfDocument> GenerateLargeReportAsync(List<ReportSection> sections)
{
var pdfs = new List<PdfDocument>();
foreach (var section in sections)
{
var sectionHtml = GenerateSectionHtml(section);
var sectionPdf = await _renderer.RenderHtmlAsPdfAsync(sectionHtml);
pdfs.Add(sectionPdf);
// Force garbage collection after each section
if (pdfs.Count % 10 == 0)
{
GC.Collect();
GC.WaitForPendingFinalizers();
}
}
return PdfDocument.Merge(pdfs.ToArray());
}
// Solution 2: Use streaming for large files
public async Task StreamLargePdfAsync(string html, HttpResponse response)
{
response.ContentType = "application/pdf";
response.Headers.Add("Content-Disposition", "attachment; filename=report.pdf");
var pdf = await _renderer.RenderHtmlAsPdfAsync(html);
var bytes = pdf.BinaryData;
await response.Body.WriteAsync(bytes, 0, bytes.Length);
await response.Body.FlushAsync();
}
}
// Problem: High memory usage or slow batch processing
public class OptimizedPdfService
{
private readonly ChromePdfRenderer _renderer;
public OptimizedPdfService()
{
_renderer = new ChromePdfRenderer();
// Optimize for performance
_renderer.RenderingOptions.RenderQuality = 90;
_renderer.RenderingOptions.ImageQuality = 85;
// Disable features you don't need
_renderer.RenderingOptions.EnableJavaScript = false; // If not needed
_renderer.RenderingOptions.RenderDelay = 0; // If content is static
}
// Solution 1: Process large documents in chunks
public async Task<PdfDocument> GenerateLargeReportAsync(List<ReportSection> sections)
{
var pdfs = new List<PdfDocument>();
foreach (var section in sections)
{
var sectionHtml = GenerateSectionHtml(section);
var sectionPdf = await _renderer.RenderHtmlAsPdfAsync(sectionHtml);
pdfs.Add(sectionPdf);
// Force garbage collection after each section
if (pdfs.Count % 10 == 0)
{
GC.Collect();
GC.WaitForPendingFinalizers();
}
}
return PdfDocument.Merge(pdfs.ToArray());
}
// Solution 2: Use streaming for large files
public async Task StreamLargePdfAsync(string html, HttpResponse response)
{
response.ContentType = "application/pdf";
response.Headers.Add("Content-Disposition", "attachment; filename=report.pdf");
var pdf = await _renderer.RenderHtmlAsPdfAsync(html);
var bytes = pdf.BinaryData;
await response.Body.WriteAsync(bytes, 0, bytes.Length);
await response.Body.FlushAsync();
}
}
' Problem: High memory usage or slow batch processing
Public Class OptimizedPdfService
Private ReadOnly _renderer As ChromePdfRenderer
Public Sub New()
_renderer = New ChromePdfRenderer()
' Optimize for performance
_renderer.RenderingOptions.RenderQuality = 90
_renderer.RenderingOptions.ImageQuality = 85
' Disable features you don't need
_renderer.RenderingOptions.EnableJavaScript = False ' If not needed
_renderer.RenderingOptions.RenderDelay = 0 ' If content is static
End Sub
' Solution 1: Process large documents in chunks
Public Async Function GenerateLargeReportAsync(ByVal sections As List(Of ReportSection)) As Task(Of PdfDocument)
Dim pdfs = New List(Of PdfDocument)()
For Each section In sections
Dim sectionHtml = GenerateSectionHtml(section)
Dim sectionPdf = Await _renderer.RenderHtmlAsPdfAsync(sectionHtml)
pdfs.Add(sectionPdf)
' Force garbage collection after each section
If pdfs.Count Mod 10 = 0 Then
GC.Collect()
GC.WaitForPendingFinalizers()
End If
Next section
Return PdfDocument.Merge(pdfs.ToArray())
End Function
' Solution 2: Use streaming for large files
Public Async Function StreamLargePdfAsync(ByVal html As String, ByVal response As HttpResponse) As Task
response.ContentType = "application/pdf"
response.Headers.Add("Content-Disposition", "attachment; filename=report.pdf")
Dim pdf = Await _renderer.RenderHtmlAsPdfAsync(html)
Dim bytes = pdf.BinaryData
Await response.Body.WriteAsync(bytes, 0, bytes.Length)
Await response.Body.FlushAsync()
End Function
End Class
Sorun 5: Yazı Tipi ve Kodlama Sorunları
Uluslararası içerik veya özel yazı tipleri ile çalışırken:
// Problem: Fonts not rendering correctly
var renderer = new ChromePdfRenderer();
// Solution 1: Install fonts on the server
// For Linux/Docker, add to Dockerfile:
// RUN apt-get install -y fonts-liberation fonts-noto
// Solution 2: Embed fonts in HTML
var html = @"
<html>
<head>
<style>
@font-face {
font-family: 'CustomFont';
src: url('data:font/woff2;base64,[base64-encoded-font]') format('woff2');
}
body { font-family: 'CustomFont', Arial, sans-serif; }
</style>
</head>
<body>
<p>Content with custom font</p>
</body>
</html>";
// Solution 3: Use web fonts
var htmlWithWebFont = @"
<html>
<head>
<link href='https://fonts.googleapis.com/css2?family=Noto+Sans+JP' rel='stylesheet'>
<style>
body { font-family: 'Noto Sans JP', sans-serif; }
</style>
</head>
<body>
<p>日本語のテキスト</p>
</body>
</html>";
// Ensure proper encoding
renderer.RenderingOptions.InputEncoding = Encoding.UTF8;
// Problem: Fonts not rendering correctly
var renderer = new ChromePdfRenderer();
// Solution 1: Install fonts on the server
// For Linux/Docker, add to Dockerfile:
// RUN apt-get install -y fonts-liberation fonts-noto
// Solution 2: Embed fonts in HTML
var html = @"
<html>
<head>
<style>
@font-face {
font-family: 'CustomFont';
src: url('data:font/woff2;base64,[base64-encoded-font]') format('woff2');
}
body { font-family: 'CustomFont', Arial, sans-serif; }
</style>
</head>
<body>
<p>Content with custom font</p>
</body>
</html>";
// Solution 3: Use web fonts
var htmlWithWebFont = @"
<html>
<head>
<link href='https://fonts.googleapis.com/css2?family=Noto+Sans+JP' rel='stylesheet'>
<style>
body { font-family: 'Noto Sans JP', sans-serif; }
</style>
</head>
<body>
<p>日本語のテキスト</p>
</body>
</html>";
// Ensure proper encoding
renderer.RenderingOptions.InputEncoding = Encoding.UTF8;
' Problem: Fonts not rendering correctly
Dim renderer = New ChromePdfRenderer()
' Solution 1: Install fonts on the server
' For Linux/Docker, add to Dockerfile:
' RUN apt-get install -y fonts-liberation fonts-noto
' Solution 2: Embed fonts in HTML
Dim html = "
<html>
<head>
<style>
@font-face {
font-family: 'CustomFont';
src: url('data:font/woff2;base64,[base64-encoded-font]') format('woff2');
}
body { font-family: 'CustomFont', Arial, sans-serif; }
</style>
</head>
<body>
<p>Content with custom font</p>
</body>
</html>"
' Solution 3: Use web fonts
Dim htmlWithWebFont = "
<html>
<head>
<link href='https://fonts.googleapis.com/css2?family=Noto+Sans+JP' rel='stylesheet'>
<style>
body { font-family: 'Noto Sans JP', sans-serif; }
</style>
</head>
<body>
<p>日本語のテキスト</p>
</body>
</html>"
' Ensure proper encoding
renderer.RenderingOptions.InputEncoding = Encoding.UTF8
Yardım Alma
Burada ele alınmayan sorunlarla karşılaştığınızda, IronPDF mükemmel destek kaynakları sunar:
- 7/24 Canlı Sohbet Desteği - Mühendislerle gerçek zamanlı olarak 30 saniyede yanıt süresiyle konuşun
- Kapsamlı Belgeler - Detaylı API referansları ve kılavuzlar
- Bilgi Tabanı - Yaygın sorunlara çözümler
- Kod Örnekleri - Kullanıma hazır kod parçacıkları
Destek talep ederken, şunları da ekleyin:
- IronPDF sürümü
- .NET sürümü ve platformu
- Sorunu yeniden üreten minimal kod örneği
- Log dosyaları (varsa)
- Yığın izleme veya hata mesajları
Hangi Platformlar IronPDF için PDF Üretimine Destek Sağlıyor?
IronPDF'nin çapraz platform desteği, PDF oluşturma kodunuzun farklı ortamlarda sorunsuzca çalışmasını sağlar. İster Windows sunuculara, ister Linux konteynerlerine, isterse bulut platformlarına dağıtıyorsanız, IronPDF, .NET'te PDF oluşturucusu için üretim dağıtımları açısından ihtiyaç duyulan esneklik ve güvenilirliği sağlar. Bu evrensel uyumluluk, 50+ ülkede örgütlerin günlük olarak milyonlarca PDF'yi üretmek için IronPDF'ye güvenmelerinin nedenlerinden biridir. Fortune 500 şirketlerinden finansal raporlar oluşturmadan girişimcilere kadar, IronPDF müşteri faturalarını üretmektedir, .NET içinde PDF oluşturma talebini karşılamak için ölçeklenebilir bir yapıya sahiptir. Platforma özgü dikkate alınması gereken hususlar, altyapınız genelinde sorunsuz dağıtımları sağlamak için yardımcı olur - ister yerinde sunucular ister bulut ortamları için olsun, C# ile PDF'ler inşa etmeniz gerektiğinde.
.NET Sürüm Uyumluluğu
IronPDF, tüm modern .NET sürümlerini destekler ve en son sürümleri desteklemek için sürekli güncellenir:
- .NET 8 - Tüm özelliklerle tam destek
- .NET 9 - Tam destekli (şu anki en son sürüm)
- .NET 10 - İlk sürüm desteği mevcut (IronPDF, Kasım 2025 sürümüyle uyumlu durumda)
- .NET 7, 6, 5 - Tam destekli
- .NET Core 3.1+ - Tüm özelliklerle destekli
- .NET Framework 4.6.2+ - Eski destek devam ediyor
İşletim Sistemi Desteği
PDF oluşturma çözümünüzü her büyük işletim sisteminde dağıtın:
Windows
- Windows 11, 10, 8, 7
- Windows Server 2022, 2019, 2016, 2012
Linux
- Ubuntu 20.04, 22.04, 24.04
- Debian 10, 11, 12
- CentOS 7, 8
- Red Hat Enterprise Linux
- Ek yapılandırma ile Alpine Linux
macOS
- macOS 13 (Ventura) ve daha yeni
- Apple Silicon (M1/M2/M3) yerel destek
- Intel tabanlı Mac'ler tamamen desteklenir
Bulut Platformu Dağıtımı
IronPDF tüm büyük bulut platformlarında sorunsuz çalışır:
Microsoft Azure
// Azure App Service configuration
// Use at least B1 tier for optimal performance
// Enable 64-bit platform in Configuration settings
// For Azure Functions
public static class PdfFunction
{
[FunctionName("GeneratePdf")]
public static async Task<IActionResult> Run(
[HttpTrigger(AuthorizationLevel.Function, "post")] HttpRequest req)
{
var renderer = new ChromePdfRenderer();
var html = await new StreamReader(req.Body).ReadToEndAsync();
var pdf = await renderer.RenderHtmlAsPdfAsync(html);
return new FileContentResult(pdf.BinaryData, "application/pdf");
}
}
// Azure App Service configuration
// Use at least B1 tier for optimal performance
// Enable 64-bit platform in Configuration settings
// For Azure Functions
public static class PdfFunction
{
[FunctionName("GeneratePdf")]
public static async Task<IActionResult> Run(
[HttpTrigger(AuthorizationLevel.Function, "post")] HttpRequest req)
{
var renderer = new ChromePdfRenderer();
var html = await new StreamReader(req.Body).ReadToEndAsync();
var pdf = await renderer.RenderHtmlAsPdfAsync(html);
return new FileContentResult(pdf.BinaryData, "application/pdf");
}
}
' Azure App Service configuration
' Use at least B1 tier for optimal performance
' Enable 64-bit platform in Configuration settings
' For Azure Functions
Public Module PdfFunction
<FunctionName("GeneratePdf")>
Public Async Function Run(<HttpTrigger(AuthorizationLevel.Function, "post")> ByVal req As HttpRequest) As Task(Of IActionResult)
Dim renderer = New ChromePdfRenderer()
Dim html = Await (New StreamReader(req.Body)).ReadToEndAsync()
Dim pdf = Await renderer.RenderHtmlAsPdfAsync(html)
Return New FileContentResult(pdf.BinaryData, "application/pdf")
End Function
End Module
Amazon Web Services (AWS)
// AWS Lambda configuration
// Use custom runtime or container deployment
// Ensure Lambda has at least 512MB memory
public class PdfLambdaFunction
{
private readonly ChromePdfRenderer _renderer;
public PdfLambdaFunction()
{
_renderer = new ChromePdfRenderer();
// Configure for Lambda environment
IronPdf.Installation.ChromeGpuMode = IronPdf.Engines.Chrome.ChromeGpuModes.Disabled;
}
public async Task<APIGatewayProxyResponse> FunctionHandler(
APIGatewayProxyRequest request,
ILambdaContext context)
{
var pdf = await _renderer.RenderHtmlAsPdfAsync(request.Body);
return new APIGatewayProxyResponse
{
StatusCode = 200,
Headers = new Dictionary<string, string>
{
{ "Content-Type", "application/pdf" }
},
Body = Convert.ToBase64String(pdf.BinaryData),
IsBase64Encoded = true
};
}
}
// AWS Lambda configuration
// Use custom runtime or container deployment
// Ensure Lambda has at least 512MB memory
public class PdfLambdaFunction
{
private readonly ChromePdfRenderer _renderer;
public PdfLambdaFunction()
{
_renderer = new ChromePdfRenderer();
// Configure for Lambda environment
IronPdf.Installation.ChromeGpuMode = IronPdf.Engines.Chrome.ChromeGpuModes.Disabled;
}
public async Task<APIGatewayProxyResponse> FunctionHandler(
APIGatewayProxyRequest request,
ILambdaContext context)
{
var pdf = await _renderer.RenderHtmlAsPdfAsync(request.Body);
return new APIGatewayProxyResponse
{
StatusCode = 200,
Headers = new Dictionary<string, string>
{
{ "Content-Type", "application/pdf" }
},
Body = Convert.ToBase64String(pdf.BinaryData),
IsBase64Encoded = true
};
}
}
Imports System.Collections.Generic
Imports System.Threading.Tasks
Imports Amazon.Lambda.APIGatewayEvents
Imports Amazon.Lambda.Core
Imports IronPdf
' AWS Lambda configuration
' Use custom runtime or container deployment
' Ensure Lambda has at least 512MB memory
Public Class PdfLambdaFunction
Private ReadOnly _renderer As ChromePdfRenderer
Public Sub New()
_renderer = New ChromePdfRenderer()
' Configure for Lambda environment
IronPdf.Installation.ChromeGpuMode = IronPdf.Engines.Chrome.ChromeGpuModes.Disabled
End Sub
Public Async Function FunctionHandler(
request As APIGatewayProxyRequest,
context As ILambdaContext) As Task(Of APIGatewayProxyResponse)
Dim pdf = Await _renderer.RenderHtmlAsPdfAsync(request.Body)
Return New APIGatewayProxyResponse With {
.StatusCode = 200,
.Headers = New Dictionary(Of String, String) From {
{"Content-Type", "application/pdf"}
},
.Body = Convert.ToBase64String(pdf.BinaryData),
.IsBase64Encoded = True
}
End Function
End Class
Google Cloud Platform
# app.yaml for App Engine
runtime: aspnetcore
env: flex
# Use 2nd generation for Cloud Run
# Deploy with: gcloud run deploy --execution-environment gen2
# app.yaml for App Engine
runtime: aspnetcore
env: flex
# Use 2nd generation for Cloud Run
# Deploy with: gcloud run deploy --execution-environment gen2
Konteyner Dağıtımı (Docker/Kubernetes)
IronPDF, tam Docker ve Kubernetes desteği ile konteyner hazırdır:
# Multi-stage Dockerfile for optimal size
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
WORKDIR /src
COPY ["YourApp.csproj", "./"]
RUN .NET restore
COPY . .
RUN .NET publish -c Release -o /app/publish
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS final
WORKDIR /app
# Install IronPDF dependencies
RUN apt-get update && apt-get install -y \
libglib2.0-0 libnss3 libatk1.0-0 libatk-bridge2.0-0 \
libcups2 libxkbcommon0 libxcomposite1 libxdamage1 \
libxrandr2 libgbm1 libpango-1.0-0 libcairo2 libasound2
COPY --from=build /app/publish .
ENTRYPOINT [".NET", "YourApp.dll"]
Masaüstü Uygulama Desteği
IronPDF, tüm büyük .NET masaüstü çerçeveleri ile çalışır:
WPF (Windows Presentation Foundation)
public partial class MainWindow : Window
{
private async void GeneratePdfButton_Click(object sender, RoutedEventArgs e)
{
var renderer = new ChromePdfRenderer();
var html = HtmlEditor.Text;
var pdf = await renderer.RenderHtmlAsPdfAsync(html);
var saveDialog = new SaveFileDialog
{
Filter = "PDF files (*.pdf)|*.pdf",
DefaultExt = "pdf"
};
if (saveDialog.ShowDialog() == true)
{
pdf.SaveAs(saveDialog.FileName);
MessageBox.Show("PDF saved successfully!");
}
}
}
public partial class MainWindow : Window
{
private async void GeneratePdfButton_Click(object sender, RoutedEventArgs e)
{
var renderer = new ChromePdfRenderer();
var html = HtmlEditor.Text;
var pdf = await renderer.RenderHtmlAsPdfAsync(html);
var saveDialog = new SaveFileDialog
{
Filter = "PDF files (*.pdf)|*.pdf",
DefaultExt = "pdf"
};
if (saveDialog.ShowDialog() == true)
{
pdf.SaveAs(saveDialog.FileName);
MessageBox.Show("PDF saved successfully!");
}
}
}
Partial Public Class MainWindow
Inherits Window
Private Async Sub GeneratePdfButton_Click(ByVal sender As Object, ByVal e As RoutedEventArgs)
Dim renderer = New ChromePdfRenderer()
Dim html = HtmlEditor.Text
Dim pdf = Await renderer.RenderHtmlAsPdfAsync(html)
Dim saveDialog = New SaveFileDialog With {
.Filter = "PDF files (*.pdf)|*.pdf",
.DefaultExt = "pdf"
}
If saveDialog.ShowDialog() = True Then
pdf.SaveAs(saveDialog.FileName)
MessageBox.Show("PDF saved successfully!")
End If
End Sub
End Class
Windows Forms
public partial class PdfGeneratorForm : Form
{
private void btnGeneratePdf_Click(object sender, EventArgs e)
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(txtHtml.Text);
using (var saveDialog = new SaveFileDialog())
{
saveDialog.Filter = "PDF files|*.pdf";
if (saveDialog.ShowDialog() == DialogResult.OK)
{
pdf.SaveAs(saveDialog.FileName);
MessageBox.Show($"PDF saved to {saveDialog.FileName}");
}
}
}
}
public partial class PdfGeneratorForm : Form
{
private void btnGeneratePdf_Click(object sender, EventArgs e)
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(txtHtml.Text);
using (var saveDialog = new SaveFileDialog())
{
saveDialog.Filter = "PDF files|*.pdf";
if (saveDialog.ShowDialog() == DialogResult.OK)
{
pdf.SaveAs(saveDialog.FileName);
MessageBox.Show($"PDF saved to {saveDialog.FileName}");
}
}
}
}
Partial Public Class PdfGeneratorForm
Inherits Form
Private Sub btnGeneratePdf_Click(ByVal sender As Object, ByVal e As EventArgs)
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf(txtHtml.Text)
Using saveDialog = New SaveFileDialog()
saveDialog.Filter = "PDF files|*.pdf"
If saveDialog.ShowDialog() = System.Windows.Forms.DialogResult.OK Then
pdf.SaveAs(saveDialog.FileName)
MessageBox.Show($"PDF saved to {saveDialog.FileName}")
End If
End Using
End Sub
End Class
MAUI (Multi-platform App UI)
public partial class MainPage : ContentPage
{
public async Task GeneratePdfAsync()
{
var renderer = new ChromePdfRenderer();
var pdf = await renderer.RenderHtmlAsPdfAsync(HtmlContent);
// Save to app's document directory
var documentsPath = FileSystem.Current.AppDataDirectory;
var filePath = Path.Combine(documentsPath, "output.pdf");
await File.WriteAllBytesAsync(filePath, pdf.BinaryData);
await DisplayAlert("Success", $"PDF saved to {filePath}", "OK");
}
}
public partial class MainPage : ContentPage
{
public async Task GeneratePdfAsync()
{
var renderer = new ChromePdfRenderer();
var pdf = await renderer.RenderHtmlAsPdfAsync(HtmlContent);
// Save to app's document directory
var documentsPath = FileSystem.Current.AppDataDirectory;
var filePath = Path.Combine(documentsPath, "output.pdf");
await File.WriteAllBytesAsync(filePath, pdf.BinaryData);
await DisplayAlert("Success", $"PDF saved to {filePath}", "OK");
}
}
Partial Public Class MainPage
Inherits ContentPage
Public Async Function GeneratePdfAsync() As Task
Dim renderer = New ChromePdfRenderer()
Dim pdf = Await renderer.RenderHtmlAsPdfAsync(HtmlContent)
' Save to app's document directory
Dim documentsPath = FileSystem.Current.AppDataDirectory
Dim filePath = Path.Combine(documentsPath, "output.pdf")
Await File.WriteAllBytesAsync(filePath, pdf.BinaryData)
Await DisplayAlert("Success", $"PDF saved to {filePath}", "OK")
End Function
End Class
PDF Oluşturmaya Başlama
C# uygulamanızda PDF oluşturmaya hazır mısınız? Kurulumdan ilk oluşturulan PDF'ye kadar adım adım bu kılavuzu izleyin. IronPDF, her adımda kapsamlı kaynaklar ve destek sunarak başlamak için kolaylık sağlar.
Adım 1: IronPDF'i Yükleyin
Geliştirme ortamınıza en uygun kurulum yöntemini seçin:
Visual Studio Paket Yöneticisi** (Önerilir)
- Projenizi Visual Studio'da açın
- Solution Explorer'da projenize sağ tıklayın
- "NuGet Paketlerini Yönet" seçeneğini seçin
- "IronPDF" arayın
- Iron Software tarafından IronPdf paketini yüklemek için Install'a tıklayın
Paket Yöneticisi Konsolu**
Install-Package IronPdf
.NET CLI
.NET add package IronPDF
NuGet paketi, Windows, Linux ve macOS'ta PDF oluşturma için gereken her şeyi içerir. Özel dağıtımlar için, boyutu ve performansı optimize eden bu platforma özgü paketleri düşünün:
IronPdf.Linux- Linux ortamları için optimize edilmiştirIronPdf.MacOs- Yerel Apple Silicon desteğiIronPdf.Slim- Çalışma zamanında bağımlılıkları indiren minimal paket
Adım 2: İlk PDF'inizi Oluşturun
Her şeyin çalıştığını doğrulamak için basit bir örnekle başlayın:
using IronPDF;
class Program
{
static void Main()
{
// Create a new PDF generator instance
var renderer = new ChromePdfRenderer();
// Generate PDF from HTML
var pdf = renderer.RenderHtmlAsPdf(@"
# Welcome to IronPDF!
<p>This is your first generated PDF document.</p>
<p>Created on: " + DateTime.Now + "</p>"
);
// Save the PDF
pdf.SaveAs("my-first-pdf.pdf");
Console.WriteLine("PDF created successfully!");
}
}
using IronPDF;
class Program
{
static void Main()
{
// Create a new PDF generator instance
var renderer = new ChromePdfRenderer();
// Generate PDF from HTML
var pdf = renderer.RenderHtmlAsPdf(@"
# Welcome to IronPDF!
<p>This is your first generated PDF document.</p>
<p>Created on: " + DateTime.Now + "</p>"
);
// Save the PDF
pdf.SaveAs("my-first-pdf.pdf");
Console.WriteLine("PDF created successfully!");
}
}
Imports IronPDF
Class Program
Shared Sub Main()
' Create a new PDF generator instance
Dim renderer = New ChromePdfRenderer()
' Generate PDF from HTML
Dim pdf = renderer.RenderHtmlAsPdf("
# Welcome to IronPDF!
<p>This is your first generated PDF document.</p>
<p>Created on: " & DateTime.Now & "</p>"
)
' Save the PDF
pdf.SaveAs("my-first-pdf.pdf")
Console.WriteLine("PDF created successfully!")
End Sub
End Class
Adım 3: Örnekleri ve Eğiticileri Keşfedin
IronPDF, PDF oluşturma konusunda ustalaşmanıza yardımcı olacak geniş kaynaklar sunar:
- Kod Örnekleri - Sık karşılaşılan senaryolar için kullanılabilir kod parçacıkları
- Eğiticiler - Belirli özellikler için adım adım kılavuzlar
- Nasıl Yapılır Kılavuzları - Gerçek dünya problemlerine pratik çözümler
- API Referansı - Tüm sınıfların ve yöntemlerin kapsamlı belgeleri
Adım 4: Gerektiğinde Yardım Alın
IronPDF, başarınızı garanti altına almak için birden fazla destek kanalı sunar:
- 7/24 Canlı Sohbet Desteği - Anında yardım için mühendislerle gerçek zamanlı sohbet
- E-posta Desteği - Karmaşık sorulara ayrıntılı yanıtlar alın
- Stack Overflow - Topluluk desteği ve çözümler
Adım 5: Geliştirme ve Dağıtım
Ücretsiz Geliştirme Lisansı
IronPDF, geliştirme ve test için ücretsizdir. Geliştirme sırasında hiçbir kısıtlama olmadan tüm özellikleri keşfedebilirsiniz. Geliştirme modunda oluşturulan PDF'lerde filigranlar görünür, ancak işlevselliği etkilemez.
Üretim Dağıtım Seçenekleri
Üretime dağıtmaya hazır olduğunuzda, IronPDF esnek lisanslama sunar:
- Ücretsiz Deneme - 30 günlük deneme lisansı ile üretimde filigransız test yapın
- Ticari Lisanslar - Tek proje dağıtımı için $999'dan başlayan fiyatlarla
- Kurumsal Çözümler - Büyük organizasyonlar için özel paketler
Koduza lisans uygulamak için:
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
Adım 6: Güncel Kalın
PDF oluşturma yeteneklerinizi güncel tutun:
- Güncellemelere Abone Olun - Yeni özellikler ve iyileştirmeler hakkında bildirim alın
- Blogu Takip Edin - En iyi uygulamalar ve yeni teknikler hakkında bilgi edinin
- Değişiklik Günlüğünü Kontrol Edin - Her sürümde nelerin yeni olduğunu görün
Düzenli güncellemeler, .NET'in en son sürümleriyle uyumluluğu sağlar ve performans iyileştirmeleri, yeni özellikler ve güvenlik güncellemelerini içerir.
Neden C#'da PDF Oluşturma İçin IronPDF'i Seçmelisiniz?
C#'da PDF oluşturmanın çeşitli yaklaşımlarını keşfettikten sonra, IronPDF'in pek çok geliştirici için tercih edilen seçim olmasının nedenlerini merak edebilirsiniz. Sadece özelliklerle ilgili değil - bu tüm geliştirici deneyimi ile ilgili, başlangıçtan uzun vadeli bakım aşamasına kadar .NET'te PDF oluşturmanız gerektiğinde. 14 milyonun üzerinde geliştirici'nin IronPDF'i küresel olarak C# PDF oluşturucusu olarak kullanmasıyla, .NET uygulamalarında PDF oluşturmada fiili standart haline gelmiştir. C#'da PDF oluşturma ihtiyaçlarınız için geliştiricilerin neden IronPDF'i seçtiğine bir bakalım.
Piksel Mükemmelinde Görselleştirme
HTML tasarımlarınızın yaklaşımlarını üreten diğer PDF kütüphanelerinin aksine, IronPDF gerçek Chromium motoru kullanarak PDF'lerinizi tam olarak modern bir web tarayıcısında nasıl görüneceğini gibi olmalarını sağlar. Bu piksel mükemmelinde görselleştirme yeteneğidir, finansal kurumların, doğruluğun önemli olduğu düzenleyici raporlar oluşturmak için IronPDF'e güvenmelerinin sebebi. Tüm CSS Grid düzenleriniz, flexbox tasarımlarınız ve JavaScript ile oluşturulmuş içerikleriniz mükemmel çalışır. Proprietery düzen motorlarıyla savaşmanız veya "yeterince yakın" sonuçları kabul etmeniz gerekmezken PDF belgeleri oluşturursunuz.
Geliştirici Dostu API
IronPDF'in API'si geliştiriciler tarafından geliştiriciler için tasarlanmıştır. API'nin sadeliği, yeni kurulan şirketlerin PDF oluşturma işlerini saatler içinde değil, günler içinde çalıştırmalarının sebebidir. Karmaşık PDF spesifikasyonlarını öğrenmek yerine, tanıdık kavramlarla çalışırsınız:
using IronPDF;
// Other libraries might require this:
// document.Add(new Paragraph("Hello World"));
// document.Add(new Table(3, 2));
// cell.SetBackgroundColor(ColorConstants.LIGHT_GRAY);
// With IronPDF, just use HTML:
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(@"
# Hello World
<table>
<tr style='background: lightgray;'>
<td>Simple</td>
<td>Intuitive</td>
</tr>
</table>
");
### Enterprise-Ready Features
IronPDF includes features that **enterprise applications demand**, which is why Fortune 500 companies rely on it for mission-critical *document generation*:
- **Security:** Encryption, digital signatures, and permission controls protect sensitive documents
- **Compliance:** [PDF/A](/how-to/pdfa/) and [PDF/UA](/how-to/pdfua/) support ensures your *generated PDFs* meet regulatory requirements
- **Performance:** Async operations and batch processing handle millions of documents efficiently
- **Reliability:** Extensive error handling and logging help maintain uptime in production
### Outstanding Support
When you need help, IronPDF's support team consists of **actual engineers** who understand your challenges. With **24/7 live chat support** and typical response times **under 30 seconds**, you're never stuck waiting for answers. This level of support is why developers consistently rate IronPDF as having the best support in the industry. The support team can help with everything from basic questions to complex implementation challenges, ensuring your *PDF generation* projects succeed.
### Transparent Pricing
**No hidden fees**, **no surprise costs**, **no per-server licensing complications**. IronPDF's straightforward licensing model means you know exactly what you're paying for. Development is **always free**, and production licenses are **perpetual** - you own them forever. This transparency is refreshing in an industry known for complex licensing schemes.
### Active Development
IronPDF is **continuously improved** with monthly updates that add features, enhance performance, and ensure compatibility with the latest .NET releases. The team actively monitors customer feedback and implements requested features regularly. Recent additions include [enhanced form handling](/examples/form-data/), improved [PDF editing capabilities](/examples/editing-pdfs/), and optimizations for cloud deployments.
### Real-World Success Stories
**Thousands of companies** across industries trust IronPDF for mission-critical ***PDF generation*:
- **Finance:** Banks *generate millions of statements* and reports monthly using IronPDF's secure document features
- **Healthcare:** Hospitals ***create patient records*** and lab results with HIPAA-compliant security settings
- **E-commerce:** Online retailers produce invoices and shipping labels at scale, handling peak loads effortlessly
- **Government:** Agencies ***generate official documents*** and forms with digital signatures and encryption
These organizations choose IronPDF because it delivers consistent results at scale - whether *generating* a single invoice or processing millions of documents daily.
## How Does IronPDF Compare to Other C# PDF Libraries?
Choosing the right **PDF library** is crucial for your project's success when you need to ***generate PDFs in C#***. Let's look at how IronPDF compares to other popular options in the **.NET ecosystem** for **PDF creation**. This comparison is based on real-world usage, developer feedback, and technical capabilities for those looking to **build PDFs in .NET**. Understanding these differences helps you choose the best **C# PDF generator** for your specific needs.
### Comparison Table
<style>
.comparison-platform-pricing-table *,.comparison-platform-pricing-table *::before,.comparison-platform-pricing-table *::after{box-sizing:border-box;margin:0;padding:0;}
.comparison-platform-pricing-table{font-family:var(--ff-gotham);background:#f4f5f7;margin:24px 0;-webkit-font-smoothing:antialiased;}
.comparison-platform-pricing-table .card{
width:100%;max-width:1380px;
background:#fff;
border:1px solid #e2e5ea;
border-radius:10px;
overflow:hidden;
box-shadow:0 1px 3px rgba(0,0,0,.04),0 4px 16px rgba(0,0,0,.04);
}
.comparison-platform-pricing-table .scroll{overflow-x:auto;}
.comparison-platform-pricing-table ::-webkit-scrollbar{height:3px;}
.comparison-platform-pricing-table ::-webkit-scrollbar-track{background:#f0f0f0;}
.comparison-platform-pricing-table ::-webkit-scrollbar-thumb{background:#c7cdd6;border-radius:2px;}
.comparison-platform-pricing-table table{
border-collapse:collapse;
width:max-content;min-width:100%;
table-layout:fixed;
}
.comparison-platform-pricing-table col.c0{width:196px;}
.comparison-platform-pricing-table col.c1{width:140px;}
.comparison-platform-pricing-table col.cx{width:110px;}
.comparison-platform-pricing-table .s0{position:sticky;left:0;z-index:20;}
.comparison-platform-pricing-table .s1{position:sticky;left:196px;z-index:20;}
.comparison-platform-pricing-table thead th{
position:sticky;top:0;z-index:30;
padding:14px 12px 12px;
text-align:center;
border-bottom:1px solid #e2e5ea;
background:#fff;
vertical-align:bottom;
}
.comparison-platform-pricing-table thead th.s0{text-align:left;z-index:40;padding-left:18px;}
.comparison-platform-pricing-table thead th.s1{z-index:40;background:#f0f5ff;border-bottom:2px solid #2563eb;}
.comparison-platform-pricing-table .th-inner{display:flex;flex-direction:column;align-items:center;gap:5px;}
.comparison-platform-pricing-table .th-badge{
display:inline-block;
font-family:'JetBrains Mono',monospace;
font-size:7px;font-weight:700;letter-spacing:.12em;text-transform:uppercase;
background:#2563eb;color:#fff;
padding:2px 7px;border-radius:2px;
}
.comparison-platform-pricing-table .th-name{
font-size:12.5px;font-weight:700;
color:#1e2b3c;line-height:1.25;
}
.comparison-platform-pricing-table .th-name-comp{font-size:11px;font-weight:600;color:#374151;line-height:1.3;text-align:center;}
.comparison-platform-pricing-table .th-pct{
font-family:'JetBrains Mono',monospace;
font-size:11px;font-weight:600;
color:#2563eb;
}
.comparison-platform-pricing-table .th-pct-comp{font-family:'JetBrains Mono',monospace;font-size:10px;font-weight:500;color:#9ca3af;}
.comparison-platform-pricing-table .th-bar{width:48px;height:2px;background:#e5e7eb;border-radius:1px;overflow:hidden;margin:0 auto;}
.comparison-platform-pricing-table .th-bar-fill{height:100%;border-radius:1px;}
.comparison-platform-pricing-table .feat-label-row td.s0{background:#fff;}
.comparison-platform-pricing-table .feat-label{
font-size:12.5px;font-weight:600;
color:#1e2b3c;line-height:1.35;
padding:11px 18px;
}
.comparison-platform-pricing-table .sec-row td{
background:#f9fafb;
border-top:1px solid #e2e5ea;
border-bottom:1px solid #e8eaed;
padding:7px 18px;
}
.comparison-platform-pricing-table .sec-row td.s1{
background:#edf3ff;
border-left:2px solid #2563eb;
border-right:2px solid #2563eb;
}
.comparison-platform-pricing-table .sec-label{
font-family:'JetBrains Mono',monospace;
font-size:8.5px;font-weight:700;letter-spacing:.16em;text-transform:uppercase;
color:#9ca3af;
display:flex;align-items:center;gap:8px;
}
.comparison-platform-pricing-table .sec-label::after{content:'';flex:1;height:1px;background:#e5e7eb;}
.comparison-platform-pricing-table .data-row td{
border-bottom:1px solid #f0f1f3;
padding:10px 12px;
text-align:center;
vertical-align:middle;
background:#fff;
}
.comparison-platform-pricing-table .data-row:last-of-type td{border-bottom:none;}
.comparison-platform-pricing-table .data-row td.s0{background:#fff;text-align:left;}
.comparison-platform-pricing-table .data-row td.s1{
background:#f5f9ff;
border-left:2px solid #2563eb;
border-right:2px solid #2563eb;
}
.comparison-platform-pricing-table .data-row:hover td{background:#fafbfc!important;}
.comparison-platform-pricing-table .data-row:hover td.s1{background:#eef5ff!important;}
.comparison-platform-pricing-table .data-row:hover td.s0{background:#fafbfc!important;}
.comparison-platform-pricing-table .cell{
display:inline-flex;flex-direction:column;align-items:center;gap:2px;
max-width:100%;
}
.comparison-platform-pricing-table .chip{
font-family:'JetBrains Mono',monospace;
font-size:9.5px;font-weight:500;
padding:3px 9px;border-radius:100px;
border:1px solid transparent;
white-space:nowrap;line-height:1.45;
}
.comparison-platform-pricing-table .chip-sub{
font-family:'JetBrains Mono',monospace;
font-size:7.5px;color:#9ca3af;
text-align:center;line-height:1.4;max-width:96px;
}
.comparison-platform-pricing-table .chip-best{
font-family:'JetBrains Mono',monospace;
font-size:7px;font-weight:700;letter-spacing:.1em;text-transform:uppercase;
background:#dbeafe;color:#1d4ed8;border:1px solid #bfdbfe;
padding:1px 6px;border-radius:2px;
}
.comparison-platform-pricing-table .yes{background:#f0fdf4;color:#15803d;border-color:#bbf7d0;}
.comparison-platform-pricing-table .no{background:#fafafa;color:#9ca3af;border-color:#e5e7eb;}
.comparison-platform-pricing-table .part{background:#fffbeb;color:#b45309;border-color:#fde68a;}
.comparison-platform-pricing-table .best{background:#eff6ff;color:#1d4ed8;border-color:#bfdbfe;}
.comparison-platform-pricing-table .warn{background:#fff7ed;color:#c2410c;border-color:#fed7aa;}
.comparison-platform-pricing-table .neu{background:#f3f4f6;color:#374151;border-color:#e5e7eb;}
</style>
<div class='comparison-platform-pricing-table'>
<div class="card">
<div class="scroll">
<table id="t">
<colgroup>
<col class="c0"/>
<col class="c1"/>
<col class="cx"/><col class="cx"/><col class="cx"/>
<col class="cx"/><col class="cx"/><col class="cx"/>
<col class="cx"/><col class="cx"/><col class="cx"/>
<col class="cx"/>
</colgroup>
<thead id="thead"></thead>
<tbody id="tbody"></tbody>
</table>
</div>
</div>
<script>
// ── Competitors from ironpdf.com/features/create/ ─────────────────────────────
const COMPS = [
{k:"wkhtml", l:"wkhtmltopdf"},
{k:"itext", l:"iText 7"},
{k:"aspose", l:"Aspose.PDF"},
{k:"sync", l:"Syncfusion"},
{k:"apryse", l:"Apryse"},
{k:"select", l:"SelectPdf"},
{k:"spire", l:"Spire.PDF"},
{k:"pdfsharp",l:"PDFsharp"},
{k:"quest", l:"QuestPDF"},
{k:"itext7j", l:"iText 7 (Java)"},
];
// pill builders
const Y = (s,sub) => ({t:"yes", s,sub});
const N = (s) => ({t:"no", s:s||"No"});
const P = (s,sub) => ({t:"part", s,sub});
const B = (s,sub) => ({t:"best", s,sub,best:true});
const W = (s,sub) => ({t:"warn", s,sub});
const NU= (s,sub) => ({t:"neu", s,sub});
// ── Rows ─────────────────────────────────────────────────────────────────────
const sections = [
{
label:"Create PDF from Scratch",
rows:[
{name:"Create Blank PDF",
iron:B("Yes","Native API"),
wkhtml:N(), itext:Y("Yes"), aspose:Y("Yes"),
sync:Y("Yes"), apryse:Y("Yes"), select:Y("Yes"),
spire:Y("Yes"), pdfsharp:Y("Yes"), quest:Y("Yes"),
itext7j:Y("Yes")},
{name:"Add Texts & Images",
iron:B("Yes","HTML + Direct API"),
wkhtml:P("HTML Only"), itext:Y("Yes"), aspose:Y("Yes"),
sync:Y("Yes"), apryse:Y("Yes"), select:Y("Yes"),
spire:Y("Yes"), pdfsharp:Y("Yes"), quest:Y("Yes"),
itext7j:Y("Yes")},
{name:"Add Headers / Footers",
iron:B("HTML / Text / Image","Best-in-Class"),
wkhtml:P("Limited"), itext:Y("Yes"), aspose:P("Via Events"),
sync:P("Via Events"), apryse:Y("Yes"), select:NU("Templates"),
spire:NU("Manual"), pdfsharp:NU("Manual Only"), quest:Y("First-Class Slots"),
itext7j:Y("Yes")},
{name:"Add Page Numbers",
iron:B("Dynamic","Merge Fields"),
wkhtml:P("Limited"), itext:Y("Yes"), aspose:Y("Yes"),
sync:Y("Yes"), apryse:Y("Yes"), select:Y("Yes"),
spire:NU("Manual"), pdfsharp:NU("Manual Only"), quest:Y("Yes"),
itext7j:Y("Yes")},
]
},
{
label:"Make Full PDF Customization Easy",
rows:[
{name:"Orientation",
iron:Y("Portrait & Landscape"),
wkhtml:Y("Yes"), itext:Y("Yes"), aspose:Y("Yes"),
sync:Y("Yes"), apryse:Y("Yes"), select:Y("Yes"),
spire:Y("Yes"), pdfsharp:Y("Yes"), quest:Y("Yes"),
itext7j:Y("Yes")},
{name:"Custom Paper Size",
iron:Y("Yes"),
wkhtml:Y("Yes"), itext:Y("Yes"), aspose:Y("Yes"),
sync:Y("Yes"), apryse:Y("Yes"), select:Y("Yes"),
spire:Y("Yes"), pdfsharp:Y("Yes"), quest:Y("Yes"),
itext7j:Y("Yes")},
{name:"Set PDF Metadata",
iron:B("Yes","Author, Title, Keywords, Date"),
wkhtml:N(), itext:Y("Yes"), aspose:Y("Yes"),
sync:Y("Yes"), apryse:Y("Yes"), select:Y("Yes"),
spire:Y("Yes"), pdfsharp:Y("Yes"), quest:Y("Yes"),
itext7j:Y("Yes")},
]
},
{
label:"Enhance PDF Standard, Accessibility & Compliance",
rows:[
{name:"PDF 1.2 to PDF 1.7",
iron:Y("Yes","Full Version Range"),
wkhtml:N(), itext:Y("Yes"), aspose:Y("Yes"),
sync:Y("Yes"), apryse:Y("Yes"), select:Y("Yes"),
spire:Y("Yes"), pdfsharp:Y("Yes"), quest:Y("Yes"),
itext7j:Y("Yes")},
{name:"PDF/UA",
iron:B("Yes","Auto-Tag via API"),
wkhtml:N(), itext:Y("Yes"), aspose:Y("Yes"),
sync:Y("Yes"), apryse:Y("Yes"), select:N(),
spire:P("Partial"), pdfsharp:Y("Yes"), quest:P("Limited"),
itext7j:Y("Yes")},
{name:"PDF/A",
iron:Y("PDF/A-3B","A-1 through A-4"),
wkhtml:N(), itext:Y("Full PDF/A"), aspose:Y("Validate & Create"),
sync:P("Native SDK Req."), apryse:Y("PDFACompliance"), select:N(),
spire:Y("Yes"), pdfsharp:P("Limited"), quest:Y("PDF/A-2× & 3×"),
itext7j:Y("Full PDF/A")},
]
},
{
label:"Platform & Developer Experience",
rows:[
{name:"Cross-Platform",
iron:B("Win · Linux · macOS","All 3 — Native"),
wkhtml:P("Depends","On Binaries"), itext:NU(".NET Std 2.0"), aspose:P("Linux","Extra Setup"),
sync:P("Blink +",".NET Server"), apryse:NU("Native SDK"), select:W("Windows","Only"),
spire:P("Limited","Linux Docs"), pdfsharp:P("Windows","Focused"), quest:Y("Win / Linux / macOS"),
itext7j:NU("JVM","Any OS")},
{name:"Cloud & Docker Deploy",
iron:B("Azure · AWS · Docker","Best-in-Class"),
wkhtml:W("Complex","Legacy"), itext:P("Multi-Pkg"), aspose:P("Partial","Containers"),
sync:P("Blink Extras","Needed"), apryse:P("Native Deps"), select:W("Windows","Only"),
spire:P("Limited Info"), pdfsharp:Y("Simple","Lightweight"), quest:Y("Docker / K8s","Local"),
itext7j:Y("Docker","JVM")},
]
},
{
label:"Support & Documentation",
rows:[
{name:"Documentation",
iron:B("Extensive","Copy-Paste Ready"),
wkhtml:P("Partial","CLI Docs"), itext:Y("Extensive","KB"), aspose:Y("Broad","GitHub"),
sync:Y("Help Center"), apryse:Y("Cross-Language","Catalog"), select:P("Getting Started","Guides"),
spire:P("Program Guide"), pdfsharp:P("Community Guides"), quest:Y("Structured","Companion App"),
itext7j:Y("Extensive","KB")},
{name:"Developer Support",
iron:B("24/7 Engineers","Best-in-Class"),
wkhtml:P("Community","Only"), itext:Y("Sub.","Included"), aspose:P("Forum + Paid"),
sync:Y("24/5","Direct-Trac"), apryse:Y("Commercial"), select:P("Email"),
spire:P("Forum + Email"), pdfsharp:P("Community","Only"), quest:P("Community","+ GitHub"),
itext7j:Y("Sub.","Included")},
]
},
{
label:"Licensing & Pricing",
rows:[
{name:"License Model",
iron:Y("Perpetual"),
wkhtml:Y("Open Source","LGPLv3"), itext:W("AGPL","/ Sub."), aspose:Y("Perpetual"),
sync:W("Annual","Subscription"), apryse:W("Custom","Consumption"), select:Y("Perpetual"),
spire:W("Annual","Subscription"), pdfsharp:Y("Free","MIT"), quest:Y("MIT","/ Paid Tiers"),
itext7j:W("AGPL","/ Sub.")},
{name:"Starting Price",
iron:B("$999+","Perpetual · 1 Dev"),
wkhtml:Y("Free"), itext:W("~$45K/yr","Custom Quote"), aspose:W("$1,175+","Per Developer"),
sync:P("$995/yr","Free <$1M"), apryse:W("~$9K+/yr","Custom Quote"), select:Y("$499+","Perpetual"),
spire:W("$999/yr","Annual Sub."), pdfsharp:Y("Free"), quest:Y("Free","MIT < $1M"),
itext7j:W("~$45K/yr","Custom Quote")},
{name:"Free Trial",
iron:B("30 Days","Full Features · No Limits"),
wkhtml:Y("N/A","Always Free"), itext:P("30 Days","Watermarked"), aspose:P("Watermarked"),
sync:Y("Community","< $1M Rev."), apryse:Y("Unlimited","Trial"), select:P("5-Page","Limit"),
spire:P("10-Page","Limit"), pdfsharp:Y("N/A","Always Free"), quest:Y("N/A","MIT Free < $1M"),
itext7j:P("30 Days","Watermarked")},
{name:"Pricing Transparency",
iron:B("Published & Clear"),
wkhtml:Y("Free / Open"), itext:W("Custom","Quote Only"), aspose:P("On Request"),
sync:Y("Published"), apryse:W("Custom","Quote Only"), select:Y("Published"),
spire:P("Partial"), pdfsharp:Y("Free / Open"), quest:Y("Published"),
itext7j:W("Custom","Quote Only")},
]
},
];
// ── Score calc ─────────────────────────────────────────────────────────────────
const allKeys = ["iron",...COMPS.map(c=>c.k)];
const scores = {};
allKeys.forEach(k=>{
let full=0,part=0,total=0;
sections.forEach(sec=>sec.rows.forEach(row=>{
const v = k==="iron"?row.iron:row[k];
if(!v) return;
total++;
if(v.t==="yes"||v.t==="best") full++;
else if(v.t==="part"||v.t==="neu") part++;
}));
scores[k]={full,part,total,pct:total?Math.round((full+part*.5)/total*100):0};
});
// ── Chip HTML ─────────────────────────────────────────────────────────────────
function chip(v){
if(!v) return `<span style="color:#d1d5db;font-size:10px">—</span>`;
return `<div class="cell">
<span class="chip ${v.t}">${v.s}</span>
${v.sub?`<span class="chip-sub">${v.sub}</span>`:""}
${v.best?`<span class="chip-best">BEST</span>`:""}
</div>`;
}
// ── Build thead ───────────────────────────────────────────────────────────────
const thead = document.getElementById("thead");
const tr0 = document.createElement("tr");
// Feature col
const th0 = document.createElement("th");
th0.className="s0";
th0.style.cssText="text-align:left;padding-left:18px;";
th0.innerHTML=`<span style="font-family:'JetBrains Mono',monospace;font-size:8.5px;font-weight:600;letter-spacing:.14em;text-transform:uppercase;color:#9ca3af">Feature</span>`;
tr0.appendChild(th0);
// IronPDF
const thI = document.createElement("th");
thI.className="s1";
const sc = scores.iron;
thI.innerHTML=`<div class="th-inner">
<span class="th-badge">★ Recommended</span>
<span class="th-name">IronPDF</span>
<div class="th-bar"><div class="th-bar-fill" style="width:${sc.pct}%;background:#2563eb"></div></div>
<span class="th-pct">${sc.pct}%</span>
</div>`;
tr0.appendChild(thI);
// Competitors
COMPS.forEach(c=>{
const th = document.createElement("th");
const s = scores[c.k];
th.innerHTML=`<div class="th-inner">
<span class="th-name-comp">${c.l}</span>
<div class="th-bar"><div class="th-bar-fill" style="width:${s.pct}%;background:#c7cdd6"></div></div>
<span class="th-pct-comp">${s.pct}%</span>
</div>`;
tr0.appendChild(th);
});
thead.appendChild(tr0);
// ── Build tbody ───────────────────────────────────────────────────────────────
const tbody = document.getElementById("tbody");
sections.forEach(sec=>{
// Section header
const secTr = document.createElement("tr");
secTr.className="sec-row";
const tdS0 = document.createElement("td");
tdS0.className="s0";
tdS0.innerHTML=`<span class="sec-label">${sec.label}</span>`;
secTr.appendChild(tdS0);
const tdSI = document.createElement("td");
tdSI.className="s1";
secTr.appendChild(tdSI);
COMPS.forEach(()=>{const td=document.createElement("td");secTr.appendChild(td);});
tbody.appendChild(secTr);
// Data rows
sec.rows.forEach(row=>{
const tr = document.createElement("tr");
tr.className="data-row";
const tdN = document.createElement("td");
tdN.className="s0";
tdN.innerHTML=`<span class="feat-label">${row.name}</span>`;
tr.appendChild(tdN);
const tdI = document.createElement("td");
tdI.className="s1";
tdI.innerHTML=chip(row.iron);
tr.appendChild(tdI);
COMPS.forEach(c=>{
const td=document.createElement("td");
td.innerHTML=chip(row[c.k]);
tr.appendChild(td);
});
tbody.appendChild(tr);
});
});
</script>
</div>
### Detaylı Karşılaştırmalar
#### IronPDF vs wkhtmltopdf
- wkhtmltopdf ücretsizdir, ancak 2020 yılında terk edilmiştir ve eski görünümlü PDF'ler üretir
- Dağıtımı zorlaştıran platforma özgü çalıştırılabilir dosyalar gerektirir
- JavaScript desteğinin olmaması, modern web uygulamalarının doğru şekilde render edilemeyeceği anlamına gelir
- IronPDF, harici bağımlılık olmadan modern render sunar
#### IronPDF vs QuestPDF
- QuestPDF, PDF'lerin tamamen C# kodunda oluşturulmasını gerektirir ve HTML desteği sunmaz
- Programatik PDF oluşturma için iyidir, ancak karmaşık düzenler için zaman alıcıdır
- Yakın zamanda MIT lisansından ticari lisansa geçmiştir
- IronPDF, zaten sahip olduğunuz HTML/CSS becerilerini kullanmanıza olanak tanır
#### IronPDF vs iText
- iText, kod tabanınızı "kirletebilecek" bir AGPL lisansına sahiptir
- Ticari lisanslar karmaşık bir fiyatlandırmayla $1,999'dan başlar
- Zayıf CSS desteğiyle sınırlı HTML'den PDF'e dönüştürme yeteneklerine sahiptir
- IronPDF, daha düşük bir fiyata üstün HTML render sağlar
#### IronPDF vs PDFSharp
- PDFSharp, düşük seviyeli PDF manipülasyonu için harikadır, ancak hiç HTML desteği yoktur
- Sayfadaki her öğenin manuel olarak konumlandırılmasını gerektirir
- Ücretsiz ve açık kaynaklıdır, ancak özellikler açısından çok sınırlıdır
- IronPDF, hem yüksek seviyeli HTML hem de düşük seviyeli PDF işlemlerini yönetir
#### IronPDF vs Syncfusion/Aspose.PDF
- Her ikisi de iyi özelliklere sahip ancak daha yüksek fiyatlı kurumsal seçeneklerdir
- Syncfusion $2,995'ten, Aspose ise $2,499'dan başlar
- Hiçbiri IronPDF ile aynı piksel mükemmelliğinde HTML render'ına ulaşamaz
- IronPDF, karşılaştırılabilir kurumsal özelliklerle daha iyi bir değer sunar
### Geçiş Yolları
Birçok geliştirici diğer kütüphanelerden IronPDF'e geçiş yapıyor. İşte nedeni:
#### wkhtmltopdf'ten
- "Platforma özgü ikili dosyalarla ve eski render teknolojisiyle uğraşmaktan bıkmıştık"
- "IronPDF bize modern CSS desteği sağladı ve Docker ile ilgili baş ağrılarımızı ortadan kaldırdı"
#### iText/iText 7'den
- "Öğrenme eğrisi verimliliğimizi öldürüyordu - IronPDF bunun yerine HTML kullanmamıza olanak tanıdı"
- "AGPL lisansı, ticari ürünümüz için kabul edilemez bir engeldi"
#### PDFSharp'tan
- "HTML'den PDF'e dönüştürmeye ihtiyacımız vardı, ancak PDFSharp bunu basitçe yapmıyor"
- "Her öğeyi manuel olarak konumlandırmak sonsuza kadar sürüyordu"
#### QuestPDF'ten
- "C# kodunda düzen oluşturmak, HTML/CSS kullanmaya kıyasla sıkıcıydı"
- "Yakın zamandaki lisans değişikliği, seçeneklerimizi yeniden gözden geçirmemize neden oldu"
## Sonuç
***C#'da PDF Oluşturmak*** karmaşık olmak zorunda değildir. IronPDF ile, zaten sahip olduğunuz HTML ve CSS becerilerini kullanarak **profesyonel PDF belgeleri oluşturabilirsiniz**. İster basit raporlar ister grafikler ve formlar içeren karmaşık belgeler oluşturuyor olun, IronPDF ağır işi halleder, böylece siz **uygulama mantığınıza odaklanabilirsiniz**. IronPDF'i **C# PDF üreticisi** olarak güvenilir ve verimli bir şekilde ***PDF üretmek*** için tercih eden **dünya çapında 14 milyon geliştiriciye** katılın.
Bu kılavuz boyunca, HTML dizgilerinden ve URL'lerden Word belgeleri ve Markdown gibi mevcut dosyaları dönüştürmeye kadar birçok farklı yaklaşım kullanarak ***PDF belgeleri oluşturmayı*** inceledik. IronPDF'in **modern Chromium tabanlı render motorunun**, eski bir yazıcı çıktısı gibi değil, gerçekten web tasarımlarınıza benzeyen **piksel mükemmelliğinde sonuçlar** ürettiğini gördük. **PDF belgelerini** programatik olarak **işleme**, güvenlik özellikleri ekleme ve performansı optimize etme yeteneği, IronPDF'i .NET'teki tüm ***PDF üretim görevleriniz*** için **eksiksiz bir çözüm** haline getirir.
IronPDF'i farklı kılan şey, **geliştirici odaklı yaklaşımıdır**. Sadece üç satır kodla, ***ilk PDF'inizi oluşturabilirsiniz***. Sezgisel API, tescilli bir PDF sözdizimini öğrenmek için **daha az zaman** harcamanız ve özellik geliştirmek için **daha fazla zaman** harcamanız anlamına gelir. [Gerçek mühendislerden](#live-chat-support) **mükemmel destek**, **şeffaf fiyatlandırma** ve (.NET 10 için ön sürüm desteği dahil) **sürekli güncellemelerle** birleştiğinde, IronPDF, ***C#'da PDF oluşturmanın*** bugün ve gelecekte çalışacağına dair size güven verir.
Bugün ***PDF oluşturmaya*** başlayın - **[ücretsiz deneme lisansınızı alın](trial-license)** ve ***.NET'te PDF üretiminin*** uygulamalarınızda ne kadar kolay olabileceğini görün. IronPDF ile, saatler içinde değil, dakikalar içinde ***profesyonel PDF'ler üretiyor*** olacaksınız.
**İlk PDF'inizi oluşturmaya hazır mısınız?** **[IronPDF ile Başlayın](trial-license)** - geliştirme için ücretsizdir ve dakikalar içinde ***C# ile PDF oluşturuyor*** olacaksınız.
Lütfen dikkate alınAspose, iText, wkhtmltopdf, QuestPDF, PDFSharp ve Syncfusion, ilgili sahiplerinin tescilli ticari markalarıdır. Bu site Aspose, iText, wkhtmltopdf, QuestPDF, PDFSharp veya Syncfusion ile bağlantılı değildir, onlar tarafından onaylanmamış veya desteklenmemektedir. Tüm ürün adları, logolar ve markalar ilgili sahiplerinin mülkiyetindedir. Karşılaştırmalar yalnızca bilgilendirme amaçlıdır ve yazım sırasında kamuya açık olan bilgilere dayanmaktadır.
using IronPDF;
// Other libraries might require this:
// document.Add(new Paragraph("Hello World"));
// document.Add(new Table(3, 2));
// cell.SetBackgroundColor(ColorConstants.LIGHT_GRAY);
// With IronPDF, just use HTML:
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(@"
# Hello World
<table>
<tr style='background: lightgray;'>
<td>Simple</td>
<td>Intuitive</td>
</tr>
</table>
");
### Enterprise-Ready Features
IronPDF includes features that **enterprise applications demand**, which is why Fortune 500 companies rely on it for mission-critical *document generation*:
- **Security:** Encryption, digital signatures, and permission controls protect sensitive documents
- **Compliance:** [PDF/A](/how-to/pdfa/) and [PDF/UA](/how-to/pdfua/) support ensures your *generated PDFs* meet regulatory requirements
- **Performance:** Async operations and batch processing handle millions of documents efficiently
- **Reliability:** Extensive error handling and logging help maintain uptime in production
### Outstanding Support
When you need help, IronPDF's support team consists of **actual engineers** who understand your challenges. With **24/7 live chat support** and typical response times **under 30 seconds**, you're never stuck waiting for answers. This level of support is why developers consistently rate IronPDF as having the best support in the industry. The support team can help with everything from basic questions to complex implementation challenges, ensuring your *PDF generation* projects succeed.
### Transparent Pricing
**No hidden fees**, **no surprise costs**, **no per-server licensing complications**. IronPDF's straightforward licensing model means you know exactly what you're paying for. Development is **always free**, and production licenses are **perpetual** - you own them forever. This transparency is refreshing in an industry known for complex licensing schemes.
### Active Development
IronPDF is **continuously improved** with monthly updates that add features, enhance performance, and ensure compatibility with the latest .NET releases. The team actively monitors customer feedback and implements requested features regularly. Recent additions include [enhanced form handling](/examples/form-data/), improved [PDF editing capabilities](/examples/editing-pdfs/), and optimizations for cloud deployments.
### Real-World Success Stories
**Thousands of companies** across industries trust IronPDF for mission-critical ***PDF generation*:
- **Finance:** Banks *generate millions of statements* and reports monthly using IronPDF's secure document features
- **Healthcare:** Hospitals ***create patient records*** and lab results with HIPAA-compliant security settings
- **E-commerce:** Online retailers produce invoices and shipping labels at scale, handling peak loads effortlessly
- **Government:** Agencies ***generate official documents*** and forms with digital signatures and encryption
These organizations choose IronPDF because it delivers consistent results at scale - whether *generating* a single invoice or processing millions of documents daily.
## How Does IronPDF Compare to Other C# PDF Libraries?
Choosing the right **PDF library** is crucial for your project's success when you need to ***generate PDFs in C#***. Let's look at how IronPDF compares to other popular options in the **.NET ecosystem** for **PDF creation**. This comparison is based on real-world usage, developer feedback, and technical capabilities for those looking to **build PDFs in .NET**. Understanding these differences helps you choose the best **C# PDF generator** for your specific needs.
### Comparison Table
<style>
.comparison-platform-pricing-table *,.comparison-platform-pricing-table *::before,.comparison-platform-pricing-table *::after{box-sizing:border-box;margin:0;padding:0;}
.comparison-platform-pricing-table{font-family:var(--ff-gotham);background:#f4f5f7;margin:24px 0;-webkit-font-smoothing:antialiased;}
.comparison-platform-pricing-table .card{
width:100%;max-width:1380px;
background:#fff;
border:1px solid #e2e5ea;
border-radius:10px;
overflow:hidden;
box-shadow:0 1px 3px rgba(0,0,0,.04),0 4px 16px rgba(0,0,0,.04);
}
.comparison-platform-pricing-table .scroll{overflow-x:auto;}
.comparison-platform-pricing-table ::-webkit-scrollbar{height:3px;}
.comparison-platform-pricing-table ::-webkit-scrollbar-track{background:#f0f0f0;}
.comparison-platform-pricing-table ::-webkit-scrollbar-thumb{background:#c7cdd6;border-radius:2px;}
.comparison-platform-pricing-table table{
border-collapse:collapse;
width:max-content;min-width:100%;
table-layout:fixed;
}
.comparison-platform-pricing-table col.c0{width:196px;}
.comparison-platform-pricing-table col.c1{width:140px;}
.comparison-platform-pricing-table col.cx{width:110px;}
.comparison-platform-pricing-table .s0{position:sticky;left:0;z-index:20;}
.comparison-platform-pricing-table .s1{position:sticky;left:196px;z-index:20;}
.comparison-platform-pricing-table thead th{
position:sticky;top:0;z-index:30;
padding:14px 12px 12px;
text-align:center;
border-bottom:1px solid #e2e5ea;
background:#fff;
vertical-align:bottom;
}
.comparison-platform-pricing-table thead th.s0{text-align:left;z-index:40;padding-left:18px;}
.comparison-platform-pricing-table thead th.s1{z-index:40;background:#f0f5ff;border-bottom:2px solid #2563eb;}
.comparison-platform-pricing-table .th-inner{display:flex;flex-direction:column;align-items:center;gap:5px;}
.comparison-platform-pricing-table .th-badge{
display:inline-block;
font-family:'JetBrains Mono',monospace;
font-size:7px;font-weight:700;letter-spacing:.12em;text-transform:uppercase;
background:#2563eb;color:#fff;
padding:2px 7px;border-radius:2px;
}
.comparison-platform-pricing-table .th-name{
font-size:12.5px;font-weight:700;
color:#1e2b3c;line-height:1.25;
}
.comparison-platform-pricing-table .th-name-comp{font-size:11px;font-weight:600;color:#374151;line-height:1.3;text-align:center;}
.comparison-platform-pricing-table .th-pct{
font-family:'JetBrains Mono',monospace;
font-size:11px;font-weight:600;
color:#2563eb;
}
.comparison-platform-pricing-table .th-pct-comp{font-family:'JetBrains Mono',monospace;font-size:10px;font-weight:500;color:#9ca3af;}
.comparison-platform-pricing-table .th-bar{width:48px;height:2px;background:#e5e7eb;border-radius:1px;overflow:hidden;margin:0 auto;}
.comparison-platform-pricing-table .th-bar-fill{height:100%;border-radius:1px;}
.comparison-platform-pricing-table .feat-label-row td.s0{background:#fff;}
.comparison-platform-pricing-table .feat-label{
font-size:12.5px;font-weight:600;
color:#1e2b3c;line-height:1.35;
padding:11px 18px;
}
.comparison-platform-pricing-table .sec-row td{
background:#f9fafb;
border-top:1px solid #e2e5ea;
border-bottom:1px solid #e8eaed;
padding:7px 18px;
}
.comparison-platform-pricing-table .sec-row td.s1{
background:#edf3ff;
border-left:2px solid #2563eb;
border-right:2px solid #2563eb;
}
.comparison-platform-pricing-table .sec-label{
font-family:'JetBrains Mono',monospace;
font-size:8.5px;font-weight:700;letter-spacing:.16em;text-transform:uppercase;
color:#9ca3af;
display:flex;align-items:center;gap:8px;
}
.comparison-platform-pricing-table .sec-label::after{content:'';flex:1;height:1px;background:#e5e7eb;}
.comparison-platform-pricing-table .data-row td{
border-bottom:1px solid #f0f1f3;
padding:10px 12px;
text-align:center;
vertical-align:middle;
background:#fff;
}
.comparison-platform-pricing-table .data-row:last-of-type td{border-bottom:none;}
.comparison-platform-pricing-table .data-row td.s0{background:#fff;text-align:left;}
.comparison-platform-pricing-table .data-row td.s1{
background:#f5f9ff;
border-left:2px solid #2563eb;
border-right:2px solid #2563eb;
}
.comparison-platform-pricing-table .data-row:hover td{background:#fafbfc!important;}
.comparison-platform-pricing-table .data-row:hover td.s1{background:#eef5ff!important;}
.comparison-platform-pricing-table .data-row:hover td.s0{background:#fafbfc!important;}
.comparison-platform-pricing-table .cell{
display:inline-flex;flex-direction:column;align-items:center;gap:2px;
max-width:100%;
}
.comparison-platform-pricing-table .chip{
font-family:'JetBrains Mono',monospace;
font-size:9.5px;font-weight:500;
padding:3px 9px;border-radius:100px;
border:1px solid transparent;
white-space:nowrap;line-height:1.45;
}
.comparison-platform-pricing-table .chip-sub{
font-family:'JetBrains Mono',monospace;
font-size:7.5px;color:#9ca3af;
text-align:center;line-height:1.4;max-width:96px;
}
.comparison-platform-pricing-table .chip-best{
font-family:'JetBrains Mono',monospace;
font-size:7px;font-weight:700;letter-spacing:.1em;text-transform:uppercase;
background:#dbeafe;color:#1d4ed8;border:1px solid #bfdbfe;
padding:1px 6px;border-radius:2px;
}
.comparison-platform-pricing-table .yes{background:#f0fdf4;color:#15803d;border-color:#bbf7d0;}
.comparison-platform-pricing-table .no{background:#fafafa;color:#9ca3af;border-color:#e5e7eb;}
.comparison-platform-pricing-table .part{background:#fffbeb;color:#b45309;border-color:#fde68a;}
.comparison-platform-pricing-table .best{background:#eff6ff;color:#1d4ed8;border-color:#bfdbfe;}
.comparison-platform-pricing-table .warn{background:#fff7ed;color:#c2410c;border-color:#fed7aa;}
.comparison-platform-pricing-table .neu{background:#f3f4f6;color:#374151;border-color:#e5e7eb;}
</style>
<div class='comparison-platform-pricing-table'>
<div class="card">
<div class="scroll">
<table id="t">
<colgroup>
<col class="c0"/>
<col class="c1"/>
<col class="cx"/><col class="cx"/><col class="cx"/>
<col class="cx"/><col class="cx"/><col class="cx"/>
<col class="cx"/><col class="cx"/><col class="cx"/>
<col class="cx"/>
</colgroup>
<thead id="thead"></thead>
<tbody id="tbody"></tbody>
</table>
</div>
</div>
<script>
// ── Competitors from ironpdf.com/features/create/ ─────────────────────────────
const COMPS = [
{k:"wkhtml", l:"wkhtmltopdf"},
{k:"itext", l:"iText 7"},
{k:"aspose", l:"Aspose.PDF"},
{k:"sync", l:"Syncfusion"},
{k:"apryse", l:"Apryse"},
{k:"select", l:"SelectPdf"},
{k:"spire", l:"Spire.PDF"},
{k:"pdfsharp",l:"PDFsharp"},
{k:"quest", l:"QuestPDF"},
{k:"itext7j", l:"iText 7 (Java)"},
];
// pill builders
const Y = (s,sub) => ({t:"yes", s,sub});
const N = (s) => ({t:"no", s:s||"No"});
const P = (s,sub) => ({t:"part", s,sub});
const B = (s,sub) => ({t:"best", s,sub,best:true});
const W = (s,sub) => ({t:"warn", s,sub});
const NU= (s,sub) => ({t:"neu", s,sub});
// ── Rows ─────────────────────────────────────────────────────────────────────
const sections = [
{
label:"Create PDF from Scratch",
rows:[
{name:"Create Blank PDF",
iron:B("Yes","Native API"),
wkhtml:N(), itext:Y("Yes"), aspose:Y("Yes"),
sync:Y("Yes"), apryse:Y("Yes"), select:Y("Yes"),
spire:Y("Yes"), pdfsharp:Y("Yes"), quest:Y("Yes"),
itext7j:Y("Yes")},
{name:"Add Texts & Images",
iron:B("Yes","HTML + Direct API"),
wkhtml:P("HTML Only"), itext:Y("Yes"), aspose:Y("Yes"),
sync:Y("Yes"), apryse:Y("Yes"), select:Y("Yes"),
spire:Y("Yes"), pdfsharp:Y("Yes"), quest:Y("Yes"),
itext7j:Y("Yes")},
{name:"Add Headers / Footers",
iron:B("HTML / Text / Image","Best-in-Class"),
wkhtml:P("Limited"), itext:Y("Yes"), aspose:P("Via Events"),
sync:P("Via Events"), apryse:Y("Yes"), select:NU("Templates"),
spire:NU("Manual"), pdfsharp:NU("Manual Only"), quest:Y("First-Class Slots"),
itext7j:Y("Yes")},
{name:"Add Page Numbers",
iron:B("Dynamic","Merge Fields"),
wkhtml:P("Limited"), itext:Y("Yes"), aspose:Y("Yes"),
sync:Y("Yes"), apryse:Y("Yes"), select:Y("Yes"),
spire:NU("Manual"), pdfsharp:NU("Manual Only"), quest:Y("Yes"),
itext7j:Y("Yes")},
]
},
{
label:"Make Full PDF Customization Easy",
rows:[
{name:"Orientation",
iron:Y("Portrait & Landscape"),
wkhtml:Y("Yes"), itext:Y("Yes"), aspose:Y("Yes"),
sync:Y("Yes"), apryse:Y("Yes"), select:Y("Yes"),
spire:Y("Yes"), pdfsharp:Y("Yes"), quest:Y("Yes"),
itext7j:Y("Yes")},
{name:"Custom Paper Size",
iron:Y("Yes"),
wkhtml:Y("Yes"), itext:Y("Yes"), aspose:Y("Yes"),
sync:Y("Yes"), apryse:Y("Yes"), select:Y("Yes"),
spire:Y("Yes"), pdfsharp:Y("Yes"), quest:Y("Yes"),
itext7j:Y("Yes")},
{name:"Set PDF Metadata",
iron:B("Yes","Author, Title, Keywords, Date"),
wkhtml:N(), itext:Y("Yes"), aspose:Y("Yes"),
sync:Y("Yes"), apryse:Y("Yes"), select:Y("Yes"),
spire:Y("Yes"), pdfsharp:Y("Yes"), quest:Y("Yes"),
itext7j:Y("Yes")},
]
},
{
label:"Enhance PDF Standard, Accessibility & Compliance",
rows:[
{name:"PDF 1.2 to PDF 1.7",
iron:Y("Yes","Full Version Range"),
wkhtml:N(), itext:Y("Yes"), aspose:Y("Yes"),
sync:Y("Yes"), apryse:Y("Yes"), select:Y("Yes"),
spire:Y("Yes"), pdfsharp:Y("Yes"), quest:Y("Yes"),
itext7j:Y("Yes")},
{name:"PDF/UA",
iron:B("Yes","Auto-Tag via API"),
wkhtml:N(), itext:Y("Yes"), aspose:Y("Yes"),
sync:Y("Yes"), apryse:Y("Yes"), select:N(),
spire:P("Partial"), pdfsharp:Y("Yes"), quest:P("Limited"),
itext7j:Y("Yes")},
{name:"PDF/A",
iron:Y("PDF/A-3B","A-1 through A-4"),
wkhtml:N(), itext:Y("Full PDF/A"), aspose:Y("Validate & Create"),
sync:P("Native SDK Req."), apryse:Y("PDFACompliance"), select:N(),
spire:Y("Yes"), pdfsharp:P("Limited"), quest:Y("PDF/A-2× & 3×"),
itext7j:Y("Full PDF/A")},
]
},
{
label:"Platform & Developer Experience",
rows:[
{name:"Cross-Platform",
iron:B("Win · Linux · macOS","All 3 — Native"),
wkhtml:P("Depends","On Binaries"), itext:NU(".NET Std 2.0"), aspose:P("Linux","Extra Setup"),
sync:P("Blink +",".NET Server"), apryse:NU("Native SDK"), select:W("Windows","Only"),
spire:P("Limited","Linux Docs"), pdfsharp:P("Windows","Focused"), quest:Y("Win / Linux / macOS"),
itext7j:NU("JVM","Any OS")},
{name:"Cloud & Docker Deploy",
iron:B("Azure · AWS · Docker","Best-in-Class"),
wkhtml:W("Complex","Legacy"), itext:P("Multi-Pkg"), aspose:P("Partial","Containers"),
sync:P("Blink Extras","Needed"), apryse:P("Native Deps"), select:W("Windows","Only"),
spire:P("Limited Info"), pdfsharp:Y("Simple","Lightweight"), quest:Y("Docker / K8s","Local"),
itext7j:Y("Docker","JVM")},
]
},
{
label:"Support & Documentation",
rows:[
{name:"Documentation",
iron:B("Extensive","Copy-Paste Ready"),
wkhtml:P("Partial","CLI Docs"), itext:Y("Extensive","KB"), aspose:Y("Broad","GitHub"),
sync:Y("Help Center"), apryse:Y("Cross-Language","Catalog"), select:P("Getting Started","Guides"),
spire:P("Program Guide"), pdfsharp:P("Community Guides"), quest:Y("Structured","Companion App"),
itext7j:Y("Extensive","KB")},
{name:"Developer Support",
iron:B("24/7 Engineers","Best-in-Class"),
wkhtml:P("Community","Only"), itext:Y("Sub.","Included"), aspose:P("Forum + Paid"),
sync:Y("24/5","Direct-Trac"), apryse:Y("Commercial"), select:P("Email"),
spire:P("Forum + Email"), pdfsharp:P("Community","Only"), quest:P("Community","+ GitHub"),
itext7j:Y("Sub.","Included")},
]
},
{
label:"Licensing & Pricing",
rows:[
{name:"License Model",
iron:Y("Perpetual"),
wkhtml:Y("Open Source","LGPLv3"), itext:W("AGPL","/ Sub."), aspose:Y("Perpetual"),
sync:W("Annual","Subscription"), apryse:W("Custom","Consumption"), select:Y("Perpetual"),
spire:W("Annual","Subscription"), pdfsharp:Y("Free","MIT"), quest:Y("MIT","/ Paid Tiers"),
itext7j:W("AGPL","/ Sub.")},
{name:"Starting Price",
iron:B("$999+","Perpetual · 1 Dev"),
wkhtml:Y("Free"), itext:W("~$45K/yr","Custom Quote"), aspose:W("$1,175+","Per Developer"),
sync:P("$995/yr","Free <$1M"), apryse:W("~$9K+/yr","Custom Quote"), select:Y("$499+","Perpetual"),
spire:W("$999/yr","Annual Sub."), pdfsharp:Y("Free"), quest:Y("Free","MIT < $1M"),
itext7j:W("~$45K/yr","Custom Quote")},
{name:"Free Trial",
iron:B("30 Days","Full Features · No Limits"),
wkhtml:Y("N/A","Always Free"), itext:P("30 Days","Watermarked"), aspose:P("Watermarked"),
sync:Y("Community","< $1M Rev."), apryse:Y("Unlimited","Trial"), select:P("5-Page","Limit"),
spire:P("10-Page","Limit"), pdfsharp:Y("N/A","Always Free"), quest:Y("N/A","MIT Free < $1M"),
itext7j:P("30 Days","Watermarked")},
{name:"Pricing Transparency",
iron:B("Published & Clear"),
wkhtml:Y("Free / Open"), itext:W("Custom","Quote Only"), aspose:P("On Request"),
sync:Y("Published"), apryse:W("Custom","Quote Only"), select:Y("Published"),
spire:P("Partial"), pdfsharp:Y("Free / Open"), quest:Y("Published"),
itext7j:W("Custom","Quote Only")},
]
},
];
// ── Score calc ─────────────────────────────────────────────────────────────────
const allKeys = ["iron",...COMPS.map(c=>c.k)];
const scores = {};
allKeys.forEach(k=>{
let full=0,part=0,total=0;
sections.forEach(sec=>sec.rows.forEach(row=>{
const v = k==="iron"?row.iron:row[k];
if(!v) return;
total++;
if(v.t==="yes"||v.t==="best") full++;
else if(v.t==="part"||v.t==="neu") part++;
}));
scores[k]={full,part,total,pct:total?Math.round((full+part*.5)/total*100):0};
});
// ── Chip HTML ─────────────────────────────────────────────────────────────────
function chip(v){
if(!v) return `<span style="color:#d1d5db;font-size:10px">—</span>`;
return `<div class="cell">
<span class="chip ${v.t}">${v.s}</span>
${v.sub?`<span class="chip-sub">${v.sub}</span>`:""}
${v.best?`<span class="chip-best">BEST</span>`:""}
</div>`;
}
// ── Build thead ───────────────────────────────────────────────────────────────
const thead = document.getElementById("thead");
const tr0 = document.createElement("tr");
// Feature col
const th0 = document.createElement("th");
th0.className="s0";
th0.style.cssText="text-align:left;padding-left:18px;";
th0.innerHTML=`<span style="font-family:'JetBrains Mono',monospace;font-size:8.5px;font-weight:600;letter-spacing:.14em;text-transform:uppercase;color:#9ca3af">Feature</span>`;
tr0.appendChild(th0);
// IronPDF
const thI = document.createElement("th");
thI.className="s1";
const sc = scores.iron;
thI.innerHTML=`<div class="th-inner">
<span class="th-badge">★ Recommended</span>
<span class="th-name">IronPDF</span>
<div class="th-bar"><div class="th-bar-fill" style="width:${sc.pct}%;background:#2563eb"></div></div>
<span class="th-pct">${sc.pct}%</span>
</div>`;
tr0.appendChild(thI);
// Competitors
COMPS.forEach(c=>{
const th = document.createElement("th");
const s = scores[c.k];
th.innerHTML=`<div class="th-inner">
<span class="th-name-comp">${c.l}</span>
<div class="th-bar"><div class="th-bar-fill" style="width:${s.pct}%;background:#c7cdd6"></div></div>
<span class="th-pct-comp">${s.pct}%</span>
</div>`;
tr0.appendChild(th);
});
thead.appendChild(tr0);
// ── Build tbody ───────────────────────────────────────────────────────────────
const tbody = document.getElementById("tbody");
sections.forEach(sec=>{
// Section header
const secTr = document.createElement("tr");
secTr.className="sec-row";
const tdS0 = document.createElement("td");
tdS0.className="s0";
tdS0.innerHTML=`<span class="sec-label">${sec.label}</span>`;
secTr.appendChild(tdS0);
const tdSI = document.createElement("td");
tdSI.className="s1";
secTr.appendChild(tdSI);
COMPS.forEach(()=>{const td=document.createElement("td");secTr.appendChild(td);});
tbody.appendChild(secTr);
// Data rows
sec.rows.forEach(row=>{
const tr = document.createElement("tr");
tr.className="data-row";
const tdN = document.createElement("td");
tdN.className="s0";
tdN.innerHTML=`<span class="feat-label">${row.name}</span>`;
tr.appendChild(tdN);
const tdI = document.createElement("td");
tdI.className="s1";
tdI.innerHTML=chip(row.iron);
tr.appendChild(tdI);
COMPS.forEach(c=>{
const td=document.createElement("td");
td.innerHTML=chip(row[c.k]);
tr.appendChild(td);
});
tbody.appendChild(tr);
});
});
</script>
</div>
### Detaylı Karşılaştırmalar
#### IronPDF vs wkhtmltopdf
- wkhtmltopdf ücretsizdir, ancak 2020 yılında terk edilmiştir ve eski görünümlü PDF'ler üretir
- Dağıtımı zorlaştıran platforma özgü çalıştırılabilir dosyalar gerektirir
- JavaScript desteğinin olmaması, modern web uygulamalarının doğru şekilde render edilemeyeceği anlamına gelir
- IronPDF, harici bağımlılık olmadan modern render sunar
#### IronPDF vs QuestPDF
- QuestPDF, PDF'lerin tamamen C# kodunda oluşturulmasını gerektirir ve HTML desteği sunmaz
- Programatik PDF oluşturma için iyidir, ancak karmaşık düzenler için zaman alıcıdır
- Yakın zamanda MIT lisansından ticari lisansa geçmiştir
- IronPDF, zaten sahip olduğunuz HTML/CSS becerilerini kullanmanıza olanak tanır
#### IronPDF vs iText
- iText, kod tabanınızı "kirletebilecek" bir AGPL lisansına sahiptir
- Ticari lisanslar karmaşık bir fiyatlandırmayla $1,999'dan başlar
- Zayıf CSS desteğiyle sınırlı HTML'den PDF'e dönüştürme yeteneklerine sahiptir
- IronPDF, daha düşük bir fiyata üstün HTML render sağlar
#### IronPDF vs PDFSharp
- PDFSharp, düşük seviyeli PDF manipülasyonu için harikadır, ancak hiç HTML desteği yoktur
- Sayfadaki her öğenin manuel olarak konumlandırılmasını gerektirir
- Ücretsiz ve açık kaynaklıdır, ancak özellikler açısından çok sınırlıdır
- IronPDF, hem yüksek seviyeli HTML hem de düşük seviyeli PDF işlemlerini yönetir
#### IronPDF vs Syncfusion/Aspose.PDF
- Her ikisi de iyi özelliklere sahip ancak daha yüksek fiyatlı kurumsal seçeneklerdir
- Syncfusion $2,995'ten, Aspose ise $2,499'dan başlar
- Hiçbiri IronPDF ile aynı piksel mükemmelliğinde HTML render'ına ulaşamaz
- IronPDF, karşılaştırılabilir kurumsal özelliklerle daha iyi bir değer sunar
### Geçiş Yolları
Birçok geliştirici diğer kütüphanelerden IronPDF'e geçiş yapıyor. İşte nedeni:
#### wkhtmltopdf'ten
- "Platforma özgü ikili dosyalarla ve eski render teknolojisiyle uğraşmaktan bıkmıştık"
- "IronPDF bize modern CSS desteği sağladı ve Docker ile ilgili baş ağrılarımızı ortadan kaldırdı"
#### iText/iText 7'den
- "Öğrenme eğrisi verimliliğimizi öldürüyordu - IronPDF bunun yerine HTML kullanmamıza olanak tanıdı"
- "AGPL lisansı, ticari ürünümüz için kabul edilemez bir engeldi"
#### PDFSharp'tan
- "HTML'den PDF'e dönüştürmeye ihtiyacımız vardı, ancak PDFSharp bunu basitçe yapmıyor"
- "Her öğeyi manuel olarak konumlandırmak sonsuza kadar sürüyordu"
#### QuestPDF'ten
- "C# kodunda düzen oluşturmak, HTML/CSS kullanmaya kıyasla sıkıcıydı"
- "Yakın zamandaki lisans değişikliği, seçeneklerimizi yeniden gözden geçirmemize neden oldu"
## Sonuç
***C#'da PDF Oluşturmak*** karmaşık olmak zorunda değildir. IronPDF ile, zaten sahip olduğunuz HTML ve CSS becerilerini kullanarak **profesyonel PDF belgeleri oluşturabilirsiniz**. İster basit raporlar ister grafikler ve formlar içeren karmaşık belgeler oluşturuyor olun, IronPDF ağır işi halleder, böylece siz **uygulama mantığınıza odaklanabilirsiniz**. IronPDF'i **C# PDF üreticisi** olarak güvenilir ve verimli bir şekilde ***PDF üretmek*** için tercih eden **dünya çapında 14 milyon geliştiriciye** katılın.
Bu kılavuz boyunca, HTML dizgilerinden ve URL'lerden Word belgeleri ve Markdown gibi mevcut dosyaları dönüştürmeye kadar birçok farklı yaklaşım kullanarak ***PDF belgeleri oluşturmayı*** inceledik. IronPDF'in **modern Chromium tabanlı render motorunun**, eski bir yazıcı çıktısı gibi değil, gerçekten web tasarımlarınıza benzeyen **piksel mükemmelliğinde sonuçlar** ürettiğini gördük. **PDF belgelerini** programatik olarak **işleme**, güvenlik özellikleri ekleme ve performansı optimize etme yeteneği, IronPDF'i .NET'teki tüm ***PDF üretim görevleriniz*** için **eksiksiz bir çözüm** haline getirir.
IronPDF'i farklı kılan şey, **geliştirici odaklı yaklaşımıdır**. Sadece üç satır kodla, ***ilk PDF'inizi oluşturabilirsiniz***. Sezgisel API, tescilli bir PDF sözdizimini öğrenmek için **daha az zaman** harcamanız ve özellik geliştirmek için **daha fazla zaman** harcamanız anlamına gelir. [Gerçek mühendislerden](#live-chat-support) **mükemmel destek**, **şeffaf fiyatlandırma** ve (.NET 10 için ön sürüm desteği dahil) **sürekli güncellemelerle** birleştiğinde, IronPDF, ***C#'da PDF oluşturmanın*** bugün ve gelecekte çalışacağına dair size güven verir.
Bugün ***PDF oluşturmaya*** başlayın - **[ücretsiz deneme lisansınızı alın](trial-license)** ve ***.NET'te PDF üretiminin*** uygulamalarınızda ne kadar kolay olabileceğini görün. IronPDF ile, saatler içinde değil, dakikalar içinde ***profesyonel PDF'ler üretiyor*** olacaksınız.
**İlk PDF'inizi oluşturmaya hazır mısınız?** **[IronPDF ile Başlayın](trial-license)** - geliştirme için ücretsizdir ve dakikalar içinde ***C# ile PDF oluşturuyor*** olacaksınız.
Lütfen dikkate alınAspose, iText, wkhtmltopdf, QuestPDF, PDFSharp ve Syncfusion, ilgili sahiplerinin tescilli ticari markalarıdır. Bu site Aspose, iText, wkhtmltopdf, QuestPDF, PDFSharp veya Syncfusion ile bağlantılı değildir, onlar tarafından onaylanmamış veya desteklenmemektedir. Tüm ürün adları, logolar ve markalar ilgili sahiplerinin mülkiyetindedir. Karşılaştırmalar yalnızca bilgilendirme amaçlıdır ve yazım sırasında kamuya açık olan bilgilere dayanmaktadır.
Imports IronPDF
' Other libraries might require this:
' document.Add(New Paragraph("Hello World"))
' document.Add(New Table(3, 2))
' cell.SetBackgroundColor(ColorConstants.LIGHT_GRAY)
' With IronPDF, just use HTML:
Dim renderer As New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf("
# Hello World
<table>
<tr style='background: lightgray;'>
<td>Simple</td>
<td>Intuitive</td>
</tr>
</table>
")
Sıkça Sorulan Sorular
C#'ta HTML içeriğinden nasıl PDF oluşturabilirim?
IronPDF'in RenderHtmlAsPdf metodunu kullanarak HTML içeriğinden PDF oluşturabilirsiniz. Bu, HTML dizgilerini veya URL'leri doğrudan PDF belgelerine dönüştürmenizi sağlar.
Ücretli bir PDF kütüphanesi kullanmanın ücretsiz bir kütüphaneye göre avantajları nelerdir?
IronPDF gibi ücretli PDF kütüphaneleri, JavaScript, CSS3 ve duyarlı düzenler için tam destek gibi güçlü özellikler sunar. Güvenilir performans, düzenli güncellemeler, kapsamlı destek sağlarlar ve yüksek kaliteli PDF'ler oluşturmak için optimize edilmişlerdir.
IronPDF, ASP.NET MVC uygulamalarında PDF üretimi için kullanılabilir mi?
Evet, IronPDF, Razor görünümlerini veya HTML şablonlarını PDF'ye dönüştürmek için ASP.NET MVC uygulamalarında kullanılabilir ve web uygulamalarınıza PDF üretimini sorunsuz bir şekilde entegre etmenizi sağlar.
C# kullanarak PDF belgelerime resimler ve CSS nasıl entegre ederim?
IronPDF'i kullanarak, PDF belgelerinize kolayca resimler ve CSS entegre edebilirsiniz. Bunu, HTML içeriğinizdeki resim etiketleri ve CSS stillerini dahil ederek ve ardından IronPDF'in renderlama yetenekleriyle PDF'ye dönüştürerek gerçekleştirebilirsiniz.
C# ile PDF'lere başlıklar, altbilgiler ve sayfa numaraları eklemek mümkün mü?
Evet, IronPDF, PDF belgelerinize başlıklar, altbilgiler ve sayfa numaralandırma eklemenizi sağlayan gelişmiş özellikler sunar. Bu, HTML içeriğinizin renderlanmasından önce PDF ayarlarını yapılandırarak yapılabilir.
C# ile PDF üretiminde XML verilerini nasıl işleyebilirim?
IronPDF ile, XML verilerinizi HTML'ye dönüştürerek veya XSLT kullanarak stile dönüştürerek XML'i işleyebilirsiniz, bu daha sonra IronPDF'in RenderHtmlAsPdf yöntemiyle PDF belgesine dönüştürülebilir.
C#'ta PDF oluştururken karşılaşılan yaygın zorluklar nelerdir?
Yaygın zorluklar arasında düzen tutarlılığını sağlama, karmaşık CSS ve JavaScript işleme ve web teknolojilerinin kesin renderlaması yer alır. IronPDF, modern Chromium motoru ve HTML5 ve CSS3 standartları için geniş desteği ile bu zorlukların üstesinden gelir.
C# ile büyük PDF'leri verimli bir şekilde nasıl oluşturabilirim?
IronPDF, büyük PDF oluşturma işlemlerini verimli bir şekilde yönetmek için tasarlanmıştır. Yüksek performanslı bir renderleme motoru kullanır ve büyük belgeleri kolayca yönetmek için asenkron işlemleri destekler.
IronPDF'i ticari bir lisans olmadan test edebilir miyim?
Evet, IronPDF, geliştirme ve test amaçları için ücretsiz bir lisans sunar, bu da bir üretim kullanımı için ticari lisans satın almadan önce özelliklerini değerlendirmenizi sağlar.
.NET 10 Uyumluluğu: IronPDF'i .NET 10 ile kullanabilir miyim ve özel bir husus var mı?
Evet, IronPDF .NET 10 ile tamamen uyumludur. Windows, Linux, kapsayıcı ortamlar ve web yapıları hedefleyen projeler dahil, kutudan çıktığı gibi .NET 10'i destekler. Özel bir yapılandırma gerektirmez—sadece en yeni IronPDF NuGet paketini yükleyin ve .NET 10 ile sorunsuz çalışacaktır.

