IronPDF ve EvoPdf: 2025'te Hangi .NET PDF Kütüphanesi Daha İyi Değer Sağlıyor?
Modern .NET uygulamaları geliştirirken PDF işlevselliği gerektiren, doğru kütüphaneyi seçmek, geliştirme hızınızı, uygulama performansınızı ve uzun vadeli bakım maliyetlerinizi önemli ölçüde etkileyebilir. IronPDF ve EvoPdf, .NET ekosisteminde PDF oluşturma ve düzenleme için iki farklı yaklaşımı temsil eder, her biri farklı geliştirme senaryolarına hitap eden benzersiz güçlü yönlere sahiptir.
Bu kapsamlı karşılaştırma, her iki kütüphaneyi de işleme doğruluğu, API tasarımı, performans ölçümleri, platform uyumluluğu ve toplam sahip olma maliyeti gibi kritik boyutlar üzerinden inceler. İster yüksek hacimli bir belge işleme sistemi kurun, ister uyumluluk için dijital imzalar uygulayın ya da sadece HTML raporlarını PDF'ye dönüştürün, bu farkları anlamak, teknik gereksinimleriniz ve bütçe kısıtlamalarınızla uyumlu bir karar vermenize yardımcı olacaktır.
IronPDF ve EvoPdf'ı Bir Bakışta Nasıl Karşılaştırabilirsiniz?
Detaylı karşılaştırmalara dalmadan önce, bu kütüphanelerin .NET geliştiricileri için önemli kategorilerde nasıl bir araya geldiğine dair kapsamlı bir genel bakış:
| Kategori | Özellik/Aspect | IronPDF | EvoPdf | Ana Avantaj |
|---|---|---|---|---|
| Çekirdek Mimari | Tasarım Felsefesi | Basitlik-öncelikli, sezgisel API'ler | Özellik açısından zengin, geleneksel PDF yaklaşımı | IronPDF: Daha hızlı geliştirme |
| API Karmaşıklığı | RenderHtmlAsPdf() gibi basit yöntemler | Daha fazla yapılandırma gerektiren çoklu sınıf yaklaşımı | IronPDF: %60 daha az kod | |
| Öğrenme Eğrisi | 1-2 gün tipik | 3-5 gün tipik | IronPDF: Daha hızlı benimseme | |
| Platform Desteği | Çapraz Platform | Yerel destek, ekstra yapılandırma yok | Platforma özgü kurulum gerektirir | IronPDF: Daha basit dağıtım |
| .NET Sürümleri | .NET 10, 9, 8, 7, 6, 5, Core 3.1+, Framework 4.6.2+ | .NET 8, 7, 6, 5, Standard 2.0+, Framework 4.0+ | Her ikisi de: Modern çerçeve desteği | |
| İşletim Sistemleri | Windows, Linux, macOS, Docker native | Windows, Linux, macOS, Azure | IronPDF: Docker için optimize edilmiş | |
| HTML'den PDF'ye | Render Motoru | Tam Chrome V8 motoru | Özel HTML işleme motoru | IronPDF: %98+ tarayıcı sadakati |
| CSS3/HTML5 Desteği | Tam destek | İyi destek (%90 kapsam) | IronPDF: Modern web standartları | |
| JavaScript Çalıştırma | Bekleme ile tam JavaScript desteği | İyi JavaScript desteği | IronPDF: Dinamik içerik hazır | |
| İşleme Hızı | 1,2-1,8s tipik (karmaşık sayfalar) | 0,8-1,2s tipik | EvoPdf: Basit HTML için daha hızlı | |
| Security & Encryption | Şifreleme Seviyeleri | AES-256, özelleştirilmiş işlemler | AES-256 standardı | Her ikisi de: Endüstri standardı |
| İzin Seçenekleri | 15'ten fazla ayrıntılı izin | 8 standart izin | IronPDF: Daha ince kontrol | |
| Dijital İmzalar | Entegre, görsel imzalar | Temel imza desteği | IronPDF: Daha basit imzalama | |
| İçerik Manipülasyonu | Karartma Yöntemi | Gerçek içerik kaldırma, tek satırlık API | Yerleşik redaksiyon yok | IronPDF: Uyumluluk hazır |
| Filigran ekleme | HTML/CSS tabanlı, tam stilizasyon | Şablon tabanlı filigranlar | IronPDF: Zengin filigranlar | |
| Damgalama | Birleşik damgalama sınıfları | Filigran özelliği ile aynı | IronPDF: Adanmış araçlar | |
| Dosya Dönüştürme | DOCX'ten PDF'ye | Yerleşik DocxToPdfRenderer |
Evo Word'dan PDF'ye ($450)+ gereklidir | IronPDF: Ekstra maliyet yok |
| Geliştirici Deneyimi | Kod Örnekleri | 100+ çalışmaya hazır örnekler | 50+ örnek | IronPDF: Kapsamlı kaynaklar |
| Belgelendirme | Eğitimler, nasıl yapılır kılavuzları, videolar, API referansı | API belgeleri ve örnekler | IronPDF: Çoklu öğrenme yolları | |
| Hata Mesajları | Açıklayıcı, uygulanabilir | Standart hata raporlaması | IronPDF: Daha iyi hata ayıklama | |
| Performans Olcumleri | Büyük Belge İşleme | 1000 sayfa/dakika filigranlama | 700 sayfa/dk filigranlama | IronPDF: %30 daha hızlı |
| Eşzamanlılık Desteği | Yerel async/await optimize edilmiş | Çoklu iş parçacığı desteği | IronPDF: Daha iyi ölçeklenebilirlik | |
| Licensing & Pricing | Giriş Seviyesi | Lite: $799 (1 dev, 1 project) | Dağıtım: 450$ (1 sunucu, 1 uygulama) | EvoPdf: Düşük başlangıç maliyeti |
| Ekip Lisansı | Plus: 1.499$ (3 geliştirici, 3 proje) | Şirket: $1,200 (sınırsız geliştirici) | EvoPdf: Büyük ekipler için daha iyi | |
| Yeniden Dağıtım | +1.999$ telif ücretsiz | Şirket Lisansına Dahil | EvoPdf: Yerleşik yeniden dağıtım | |
| Suite Seçeneği | Iron Suite: $1,498 (9 products) | EVO PDF Toolkit: 1.400$ | IronPDF: Daha fazla ürün dahil | |
| Destek | Destek Dahil | Evet, 24/5 mühendislik desteği | Evet, ilk yıl standart destek | IronPDF: Doğrudan mühendislik erişimi |
| En İyisi İçin | Kullanım Durumları | Modern web uygulamaları, karmaşık PDF'ler, uyumluluk | Basit HTML'den PDF'ye, temel dönüşümler | Bağlam bağımlı |
IronPDF ve EvoPdf: Temel Güçler ve Felsefenin Anlaşılması
IronPDF'yi .NET PDF Kütüphane Piyasasında Öne Çıkaran Nedir?
IronPDF, geliştirici verimliliği odaklı tasarlanmış kapsamlı bir PDF çözümünü temsil eder. Basitlik üstüne kurulu ancak güçten ödün vermeyen IronPDF, .NET geliştiricilerinin tanıdık web geliştirme modellerini aynalayan sezgisel API'ler kullanarak PDF belgeleri yaratmasına, düzenlemesine ve manipüle etmesine olanak tanır. Kütüphanenin öne çıkan özelliği, en son web standartlarını içeren CSS3, JavaScript çerçeveleri ve web fontlarını desteklerken piksel mükemmelliğinde HTML'den PDF'ye dönüşümü sağlayan Chrome tabanlı işleme motorudur.
Kütüphane, yüksek kaliteli belge işleme, karmaşık PDF manipülasyonu ve kurumsal seviyede güvenlik özellikleri gerektiren senaryolarda başarılıdır. Geniş özellik seti, sadece temel PDF oluşturmayı değil, dijital imzalar, form doldurma, IronOCR ile OCR entegrasyonu ve sorunsuz belge formatı dönüştürmeleri gibi gelişmiş yetenekleri de içerir. IronPDF'nin çapraz platform uyumluluğu, basit framework desteğinin ötesine geçer, Windows, Linux, macOS, Docker konteynerleri ve Azure ve AWS gibi bulut platformlarında yerel performans sunar.
EvoPdf, PDF Oluşturmayı Farklı Şekilde Nasıl Yaklaşıyor?
EvoPdf, geleneksel bir PDF manipülasyonu yaklaşımı benimser, öncelikle özelleştirme ve kontrol üzerinde durarak HTML'den PDF'ye dönüşüme odaklanır. Kütüphane geliştiricilere dönüştürme süreci üzerinde ince ayar yapma, işleme parametrelerini, sayfa düzenlerini ve dönüştürme ayarlarını ince ayar yapma imkanı sağlayan detay kontrol sunar. EvoPdf'nin mimarisi, standart web'den PDF'ye dönüştürme senaryoları için güvenilir ve tutarlı sonuçlar sağlamaya yöneliktir.
EvoPdf'nin özellikle parladığı alan, hafif ayak izi ve basit HTML belgeleri için daha hızlı işleme hızıdır. Karmaşık JavaScript veya CSS3 özellikleri olmayan basit HTML sayfaları için, EvoPdf tipik olarak 0,8-1,2 saniye içinde dönüşümleri tamamlayabilir ve bu da onu doğrudan belgelerin yüksek hacimli toplu işlendiği için uygun hale getirir. Kütüphane ayrıca ASP.NET ortamlarında sunucu tarafı işleme için iyi destek sunar ve web uygulamaları senaryoları için optimize edilmiştir.
Çapraz Platform Yetileri Kütüphaneler Arasında Nasıl Karşılaştırılır?
IronPDF'nin Modern Çapraz Platform Mimarisi
IronPDF, basit framework desteğinin ötesine geçen sorunsuz çapraz platform uyumluluğu sağlar. Kütüphane yerel olarak çalışır:
-
.NET Sürüm Desteği:
- .NET 10, 9, 8, 7, 6, 5 ve Core 3.1+
- .NET Standard 2.0+
- .NET Framework 4.6.2+
- C#, VB.NET ve F# için tam destek
-
İşletim Sistemi Uyumluluğu:
- Windows (x86, x64, ARM)
- Linux (Ubuntu, Debian, CentOS, Alpine)
- macOS (Intel ve Apple Silicon)
- Önceden yapılandırılmış görüntülerle Docker konteynerleri
- Bulut Platform Entegrasyonu:
- Azure Uygulama Hizmeti, Fonksiyonlar ve VM'ler
- AWS Lambda ve EC2
- Google Cloud Platform
- Kubernetes dağıtımları
IronPDF'yi öne çıkaran özellik, sıfır yapılandırma dağıtım modelidir. Çoğu PDF kütüphanesinin ek bağımlılıklar veya çalışma zamanı kurulumları gerektirirken, IronPDF gerekli tüm bileşenleri NuGet paketi içine dahil eder. Bu kendine yeten yaklaşım, dağıtım karmaşıklığını büyük ölçüde azaltır ve yaygın "benim makinemde çalışıyor" sorunlarını ortadan kaldırır.
EvoPdf'nin Platform Gereksinimleri ve Kısıtlamaları
EvoPdf, benzer bir .NET sürüm aralığını destekler ancak çapraz platform senaryoları için daha dikkatli bir yapılandırma gerektirir:
-
.NET Framework Desteği:
- .NET 8, 7, 6 ve 5
- .NET Standard 2.0+
- .NET Framework 4.8.1, 4.7.2, 4.6.1 ve 4.0+
- Platform Düşünceleri:
- Windows ortamları için birinci öncelikli optimizasyon
- Linux desteği ek yapılandırma gerektirir
- .NET Core üzerinden macOS desteği
- Bulut dağıtımı, platforma özgü ayarlamalar gerektirir
Çapraz platform dağıtımları için, EvoPdf kullanıcıları genellikle Windows ve Linux ortamları arasında geçiş yaparken, platforma özgü bağımlılıkları ve yapılandırmaları yönetmek zorundadır. Bu ek kurulum karmaşıklığı, geliştirme zaman çizelgelerini etkileyebilir ve bakım yükünü artırabilir.
Ortak Görevler İçin Hangi Kütüphane Daha İyi PDF İşlevselliği Sunar?
HTML to PDF Dönüştürme: Görüntüleme Kalitesi ve Performans
Her iki kutuphanenin de en temel özelliği HTML'yi PDF'e dönüştürmektir, ancak yaklaşımları ve sonuçları önemli ölçüde farklıdır.
IronPDF HTML to PDF Örneği
using IronPdf;
// Initialize the Chrome-based renderer with advanced options
var renderer = new ChromePdfRenderer
{
// Configure rendering options for optimal quality
RenderingOptions = new ChromePdfRenderOptions
{
// Set high-quality rendering at 300 DPI for print-ready PDFs
DPI = 300,
// Enable JavaScript execution with custom timeout
EnableJavaScript = true,
RenderDelay = 2000, // Wait 2 seconds for dynamic content
// Configure page layout
MarginTop = 20,
MarginBottom = 20,
MarginLeft = 15,
MarginRight = 15,
// Enable modern web features
CssMediaType = PdfCssMediaType.Print,
ViewPortWidth = 1920,
// Optimize for web fonts and images
CreatePdfFormsFromHtml = true,
FitToPaperMode = FitToPaperModes.Automatic
}
};
// Convert complex HTML with CSS3 and JavaScript
var htmlContent = @"
<!DOCTYPE html>
<html>
<head>
<link href='https://fonts.googleapis.com/css2?family=Roboto:wght@300;400;700&display=swap' rel='stylesheet'>
<style>
body { font-family: 'Roboto', sans-serif; }
.chart-container { width: 100%; height: 400px; }
@media print {
.no-print { display: none; }
.page-break { page-break-after: always; }
}
</style>
<script src='https://cdn.jsdelivr.net/npm/chart.js'></script>
</head>
<body>
<h1>Dynamic Sales Report</h1>
<div class='chart-container'>
<canvas id='salesChart'></canvas>
</div>
<script>
// Dynamic chart generation
const ctx = document.getElementById('salesChart').getContext('2d');
new Chart(ctx, {
type: 'line',
data: {
labels: ['Jan', 'Feb', 'Mar', 'Apr', 'May'],
datasets: [{
label: 'Sales 2025',
data: [65, 78, 90, 81, 96],
borderColor: 'rgb(75, 192, 192)',
tension: 0.4
}]
}
});
</script>
</body>
</html>";
// Generate PDF with full JavaScript chart rendering
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
// Apply post-processing optimizations
pdf.CompressImages(90);
pdf.SaveAs("sales-report.pdf");
using IronPdf;
// Initialize the Chrome-based renderer with advanced options
var renderer = new ChromePdfRenderer
{
// Configure rendering options for optimal quality
RenderingOptions = new ChromePdfRenderOptions
{
// Set high-quality rendering at 300 DPI for print-ready PDFs
DPI = 300,
// Enable JavaScript execution with custom timeout
EnableJavaScript = true,
RenderDelay = 2000, // Wait 2 seconds for dynamic content
// Configure page layout
MarginTop = 20,
MarginBottom = 20,
MarginLeft = 15,
MarginRight = 15,
// Enable modern web features
CssMediaType = PdfCssMediaType.Print,
ViewPortWidth = 1920,
// Optimize for web fonts and images
CreatePdfFormsFromHtml = true,
FitToPaperMode = FitToPaperModes.Automatic
}
};
// Convert complex HTML with CSS3 and JavaScript
var htmlContent = @"
<!DOCTYPE html>
<html>
<head>
<link href='https://fonts.googleapis.com/css2?family=Roboto:wght@300;400;700&display=swap' rel='stylesheet'>
<style>
body { font-family: 'Roboto', sans-serif; }
.chart-container { width: 100%; height: 400px; }
@media print {
.no-print { display: none; }
.page-break { page-break-after: always; }
}
</style>
<script src='https://cdn.jsdelivr.net/npm/chart.js'></script>
</head>
<body>
<h1>Dynamic Sales Report</h1>
<div class='chart-container'>
<canvas id='salesChart'></canvas>
</div>
<script>
// Dynamic chart generation
const ctx = document.getElementById('salesChart').getContext('2d');
new Chart(ctx, {
type: 'line',
data: {
labels: ['Jan', 'Feb', 'Mar', 'Apr', 'May'],
datasets: [{
label: 'Sales 2025',
data: [65, 78, 90, 81, 96],
borderColor: 'rgb(75, 192, 192)',
tension: 0.4
}]
}
});
</script>
</body>
</html>";
// Generate PDF with full JavaScript chart rendering
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
// Apply post-processing optimizations
pdf.CompressImages(90);
pdf.SaveAs("sales-report.pdf");
Imports IronPdf
' Initialize the Chrome-based renderer with advanced options
Private renderer = New ChromePdfRenderer With {
.RenderingOptions = New ChromePdfRenderOptions With {
.DPI = 300,
.EnableJavaScript = True,
.RenderDelay = 2000,
.MarginTop = 20,
.MarginBottom = 20,
.MarginLeft = 15,
.MarginRight = 15,
.CssMediaType = PdfCssMediaType.Print,
.ViewPortWidth = 1920,
.CreatePdfFormsFromHtml = True,
.FitToPaperMode = FitToPaperModes.Automatic
}
}
' Convert complex HTML with CSS3 and JavaScript
Private htmlContent = "
<!DOCTYPE html>
<html>
<head>
<link href='https://fonts.googleapis.com/css2?family=Roboto:wght@300;400;700&display=swap' rel='stylesheet'>
<style>
body { font-family: 'Roboto', sans-serif; }
.chart-container { width: 100%; height: 400px; }
@media print {
.no-print { display: none; }
.page-break { page-break-after: always; }
}
</style>
<script src='https://cdn.jsdelivr.net/npm/chart.js'></script>
</head>
<body>
<h1>Dynamic Sales Report</h1>
<div class='chart-container'>
<canvas id='salesChart'></canvas>
</div>
<script>
// Dynamic chart generation
const ctx = document.getElementById('salesChart').getContext('2d');
new Chart(ctx, {
type: 'line',
data: {
labels: ['Jan', 'Feb', 'Mar', 'Apr', 'May'],
datasets: [{
label: 'Sales 2025',
data: [65, 78, 90, 81, 96],
borderColor: 'rgb(75, 192, 192)',
tension: 0.4
}]
}
});
</script>
</body>
</html>"
' Generate PDF with full JavaScript chart rendering
Private pdf = renderer.RenderHtmlAsPdf(htmlContent)
' Apply post-processing optimizations
pdf.CompressImages(90)
pdf.SaveAs("sales-report.pdf")
Bu IronPDF örneği birkaç gelişmiş yeteneği göstermektedir:
- Chrome V8 JavaScript Motoru: Dinamik görselleştirmeler oluşturmak için Chart.js'i tam olarak çalıştırır
- Web Font Desteği: Google Fonts'u otomatik olarak indirir ve gömer
- Duyarlı Görüntüleme: Baskı optimizasyonu için CSS medya sorgularına saygı gösterir
- Yüksek DPI Desteği: 300 DPI'da baskı hazır PDF'ler üretir
- Otomatik Düzen: İçeriği sayfa sınırlarına akıllıca sığdırır
EvoPdf HTML to PDF Örneği
using EvoPdf;
// Create converter with configuration
HtmlToPdfConverter converter = new HtmlToPdfConverter();
// Set license key (required for production use)
converter.LicenseKey = "your-license-key";
// Configure conversion settings
converter.PdfDocumentOptions.PdfPageSize = PdfPageSize.A4;
converter.PdfDocumentOptions.PdfPageOrientation = PdfPageOrientation.Portrait;
converter.PdfDocumentOptions.TopMargin = 20;
converter.PdfDocumentOptions.BottomMargin = 20;
converter.PdfDocumentOptions.LeftMargin = 15;
converter.PdfDocumentOptions.RightMargin = 15;
// Enable JavaScript execution
converter.JavaScriptEnabled = true;
converter.ConversionDelay = 2; // seconds
// Set authentication if needed
converter.AuthenticationOptions.Username = "username";
converter.AuthenticationOptions.Password = "password";
// Convert HTML string
string htmlString = @"
<html>
<head>
<style>
body { font-family: Arial, sans-serif; }
table { border-collapse: collapse; width: 100%; }
th, td { border: 1px solid #ddd; padding: 8px; }
</style>
</head>
<body>
<h1>Invoice</h1>
<table>
<tr>
<th>Item</th>
<th>Quantity</th>
<th>Price</th>
</tr>
<tr>
<td>Product A</td>
<td>5</td>
<td>$50.00</td>
</tr>
</table>
</body>
</html>";
// Perform conversion
byte[] pdfBytes = converter.ConvertHtml(htmlString, "");
// Save to file
System.IO.File.WriteAllBytes("invoice.pdf", pdfBytes);
using EvoPdf;
// Create converter with configuration
HtmlToPdfConverter converter = new HtmlToPdfConverter();
// Set license key (required for production use)
converter.LicenseKey = "your-license-key";
// Configure conversion settings
converter.PdfDocumentOptions.PdfPageSize = PdfPageSize.A4;
converter.PdfDocumentOptions.PdfPageOrientation = PdfPageOrientation.Portrait;
converter.PdfDocumentOptions.TopMargin = 20;
converter.PdfDocumentOptions.BottomMargin = 20;
converter.PdfDocumentOptions.LeftMargin = 15;
converter.PdfDocumentOptions.RightMargin = 15;
// Enable JavaScript execution
converter.JavaScriptEnabled = true;
converter.ConversionDelay = 2; // seconds
// Set authentication if needed
converter.AuthenticationOptions.Username = "username";
converter.AuthenticationOptions.Password = "password";
// Convert HTML string
string htmlString = @"
<html>
<head>
<style>
body { font-family: Arial, sans-serif; }
table { border-collapse: collapse; width: 100%; }
th, td { border: 1px solid #ddd; padding: 8px; }
</style>
</head>
<body>
<h1>Invoice</h1>
<table>
<tr>
<th>Item</th>
<th>Quantity</th>
<th>Price</th>
</tr>
<tr>
<td>Product A</td>
<td>5</td>
<td>$50.00</td>
</tr>
</table>
</body>
</html>";
// Perform conversion
byte[] pdfBytes = converter.ConvertHtml(htmlString, "");
// Save to file
System.IO.File.WriteAllBytes("invoice.pdf", pdfBytes);
Imports EvoPdf
' Create converter with configuration
Private converter As New HtmlToPdfConverter()
' Set license key (required for production use)
converter.LicenseKey = "your-license-key"
' Configure conversion settings
converter.PdfDocumentOptions.PdfPageSize = PdfPageSize.A4
converter.PdfDocumentOptions.PdfPageOrientation = PdfPageOrientation.Portrait
converter.PdfDocumentOptions.TopMargin = 20
converter.PdfDocumentOptions.BottomMargin = 20
converter.PdfDocumentOptions.LeftMargin = 15
converter.PdfDocumentOptions.RightMargin = 15
' Enable JavaScript execution
converter.JavaScriptEnabled = True
converter.ConversionDelay = 2 ' seconds
' Set authentication if needed
converter.AuthenticationOptions.Username = "username"
converter.AuthenticationOptions.Password = "password"
' Convert HTML string
Dim htmlString As String = "
<html>
<head>
<style>
body { font-family: Arial, sans-serif; }
table { border-collapse: collapse; width: 100%; }
th, td { border: 1px solid #ddd; padding: 8px; }
</style>
</head>
<body>
<h1>Invoice</h1>
<table>
<tr>
<th>Item</th>
<th>Quantity</th>
<th>Price</th>
</tr>
<tr>
<td>Product A</td>
<td>5</td>
<td>$50.00</td>
</tr>
</table>
</body>
</html>"
' Perform conversion
Dim pdfBytes() As Byte = converter.ConvertHtml(htmlString, "")
' Save to file
System.IO.File.WriteAllBytes("invoice.pdf", pdfBytes)
EvoPdf'nin yaklaşımı, temel stil ve düzeni iyi destekleyen basit HTML dönüştürmeye odaklanır. Standart HTML ve CSS ile iyi başa çıkarken, modern web özellikleri, örneğin, CSS Grid, Flexbox animasyonları veya karmaşık JavaScript çerçeveleriyle zorlanabilir.
PDF Güvenliği ve Şifreleme: Hassas Belgeleri Koruma
Hassas belgelerle uğraşırken güvenlik önemlidir. Her iki kutuphane de şifreleme yetenekleri sunar, ancak farklı derecelerde sofistikelik sunar.
IronPDF Gelişmiş Güvenlik Uygulaması
using IronPdf;
using IronPdf.Security;
// Load an existing PDF or create new one
var pdf = PdfDocument.FromFile("confidential-report.pdf");
// Configure comprehensive security settings
pdf.SecuritySettings = new SecuritySettings
{
// Set owner password (full permissions)
OwnerPassword = "admin-complex-password-2025",
// Set user password (restricted permissions)
UserPassword = "user-password-readonly",
// Configure granular permissions
AllowAccessibilityExtractContent = false,
AllowAnnotations = false,
AllowAssembleDocument = false,
AllowCopy = false,
AllowFillForms = true,
AllowFullQualityPrint = false,
AllowModifyDocument = false,
AllowPrint = true,
// Use strongest encryption available
EncryptionLevel = EncryptionLevel.AES256Bit
};
// Add metadata security
pdf.MetaData.Author = "Authorized Personnel Only";
pdf.MetaData.ModifiedDate = DateTime.UtcNow;
pdf.MetaData.Title = "Confidential: Internal Use Only";
// Apply digital signature for authenticity
var signature = new PdfSignature("certificate.pfx", "cert-password")
{
SigningReason = "Document Approval",
SigningLocation = "Corporate Headquarters",
SigningContact = "security@company.com",
// Visual signature appearance
IsVisible = true,
X = 100,
Y = 100,
Width = 200,
Height = 50,
PageIndex = 0,
// Custom appearance
SignatureImage = new PdfSignatureImage("signature.png"),
DateFormat = "yyyy-MM-dd HH:mm:ss"
};
pdf.Sign(signature);
// Add watermark for additional security
pdf.ApplyWatermark("<h2 style='color:red; opacity:0.5;'>CONFIDENTIAL</h2>",
45, VerticalAlignment.Middle, HorizontalAlignment.Center);
pdf.SaveAs("secured-document.pdf");
using IronPdf;
using IronPdf.Security;
// Load an existing PDF or create new one
var pdf = PdfDocument.FromFile("confidential-report.pdf");
// Configure comprehensive security settings
pdf.SecuritySettings = new SecuritySettings
{
// Set owner password (full permissions)
OwnerPassword = "admin-complex-password-2025",
// Set user password (restricted permissions)
UserPassword = "user-password-readonly",
// Configure granular permissions
AllowAccessibilityExtractContent = false,
AllowAnnotations = false,
AllowAssembleDocument = false,
AllowCopy = false,
AllowFillForms = true,
AllowFullQualityPrint = false,
AllowModifyDocument = false,
AllowPrint = true,
// Use strongest encryption available
EncryptionLevel = EncryptionLevel.AES256Bit
};
// Add metadata security
pdf.MetaData.Author = "Authorized Personnel Only";
pdf.MetaData.ModifiedDate = DateTime.UtcNow;
pdf.MetaData.Title = "Confidential: Internal Use Only";
// Apply digital signature for authenticity
var signature = new PdfSignature("certificate.pfx", "cert-password")
{
SigningReason = "Document Approval",
SigningLocation = "Corporate Headquarters",
SigningContact = "security@company.com",
// Visual signature appearance
IsVisible = true,
X = 100,
Y = 100,
Width = 200,
Height = 50,
PageIndex = 0,
// Custom appearance
SignatureImage = new PdfSignatureImage("signature.png"),
DateFormat = "yyyy-MM-dd HH:mm:ss"
};
pdf.Sign(signature);
// Add watermark for additional security
pdf.ApplyWatermark("<h2 style='color:red; opacity:0.5;'>CONFIDENTIAL</h2>",
45, VerticalAlignment.Middle, HorizontalAlignment.Center);
pdf.SaveAs("secured-document.pdf");
Imports IronPdf
Imports IronPdf.Security
' Load an existing PDF or create new one
Private pdf = PdfDocument.FromFile("confidential-report.pdf")
' Configure comprehensive security settings
pdf.SecuritySettings = New SecuritySettings With {
.OwnerPassword = "admin-complex-password-2025",
.UserPassword = "user-password-readonly",
.AllowAccessibilityExtractContent = False,
.AllowAnnotations = False,
.AllowAssembleDocument = False,
.AllowCopy = False,
.AllowFillForms = True,
.AllowFullQualityPrint = False,
.AllowModifyDocument = False,
.AllowPrint = True,
.EncryptionLevel = EncryptionLevel.AES256Bit
}
' Add metadata security
pdf.MetaData.Author = "Authorized Personnel Only"
pdf.MetaData.ModifiedDate = DateTime.UtcNow
pdf.MetaData.Title = "Confidential: Internal Use Only"
' Apply digital signature for authenticity
Dim signature = New PdfSignature("certificate.pfx", "cert-password") With {
.SigningReason = "Document Approval",
.SigningLocation = "Corporate Headquarters",
.SigningContact = "security@company.com",
.IsVisible = True,
.X = 100,
.Y = 100,
.Width = 200,
.Height = 50,
.PageIndex = 0,
.SignatureImage = New PdfSignatureImage("signature.png"),
.DateFormat = "yyyy-MM-dd HH:mm:ss"
}
pdf.Sign(signature)
' Add watermark for additional security
pdf.ApplyWatermark("<h2 style='color:red; opacity:0.5;'>CONFIDENTIAL</h2>", 45, VerticalAlignment.Middle, HorizontalAlignment.Center)
pdf.SaveAs("secured-document.pdf")
IronPDF'nin güvenlik uygulaması, kurumsal düzeyde özellikler sunar:
- 15+ Detaylı İzinler: Kullanıcıların yapabileceklerini ince ayarlarla belirleyin
- Görsel Dijital İmzalar: İmza görüntüleri ve zaman damgalarını içerebilir
- Meta Veri Koruması: Belge özelliklerini ve denetim izlerini güvence altına alır
- Kademeli Güvenlik: Şifreleme, imzalar ve filigranları birleştirir
EvoPdf Güvenlik Yapılandırması
using EvoPdf;
// Create security manager
PdfSecurityOptions securityOptions = new PdfSecurityOptions();
// Set basic security parameters
securityOptions.UserPassword = "user123";
securityOptions.OwnerPassword = "owner456";
securityOptions.KeySize = EncryptionKeySize.Key256Bit;
// Configure permissions
securityOptions.CanPrint = true;
securityOptions.CanCopyContent = false;
securityOptions.CanEditContent = false;
securityOptions.CanEditAnnotations = false;
securityOptions.CanFillFormFields = true;
securityOptions.CanAssembleDocument = false;
// Apply security to existing PDF
PdfSecurityManager securityManager = new PdfSecurityManager(securityOptions);
securityManager.SaveSecuredPdfToFile("input.pdf", "secured-output.pdf");
using EvoPdf;
// Create security manager
PdfSecurityOptions securityOptions = new PdfSecurityOptions();
// Set basic security parameters
securityOptions.UserPassword = "user123";
securityOptions.OwnerPassword = "owner456";
securityOptions.KeySize = EncryptionKeySize.Key256Bit;
// Configure permissions
securityOptions.CanPrint = true;
securityOptions.CanCopyContent = false;
securityOptions.CanEditContent = false;
securityOptions.CanEditAnnotations = false;
securityOptions.CanFillFormFields = true;
securityOptions.CanAssembleDocument = false;
// Apply security to existing PDF
PdfSecurityManager securityManager = new PdfSecurityManager(securityOptions);
securityManager.SaveSecuredPdfToFile("input.pdf", "secured-output.pdf");
Imports EvoPdf
' Create security manager
Private securityOptions As New PdfSecurityOptions()
' Set basic security parameters
securityOptions.UserPassword = "user123"
securityOptions.OwnerPassword = "owner456"
securityOptions.KeySize = EncryptionKeySize.Key256Bit
' Configure permissions
securityOptions.CanPrint = True
securityOptions.CanCopyContent = False
securityOptions.CanEditContent = False
securityOptions.CanEditAnnotations = False
securityOptions.CanFillFormFields = True
securityOptions.CanAssembleDocument = False
' Apply security to existing PDF
Dim securityManager As New PdfSecurityManager(securityOptions)
securityManager.SaveSecuredPdfToFile("input.pdf", "secured-output.pdf")
EvoPdf, temel belge korumasına uygun temel güvenlik özellikleri sunar, ancak IronPDF'de bulunan bazı gelişmiş seçeneklerden yoksundur.
İçerik Geri Alma: Uyumluluk ve Gizlilik Koruması
Bugünün gizlilik odaklı ortamında, düzenlemelere, örneğin GDPR, HIPAA ve CCPA, uyum için PDF'lerden hassas bilgileri kalıcı olarak silme yeteneği çok önemlidir.
IronPDF Geri Alma Örneği
using IronPdf;
// Load PDF containing sensitive information
PdfDocument pdf = PdfDocument.FromFile("customer-records.pdf");
// Redact using multiple strategies
// 1. Redact specific text patterns (SSN format)
pdf.RedactTextOnAllPages(@"\b\d{3}-\d{2}-\d{4}\b",
isRegex: true,
new RedactionOptions
{
RedactionColor = Color.Black,
RedactionStyle = RedactionStyle.Filled,
DrawRedactionBorder = true,
BorderColor = Color.Red
});
// 2. Redact specific phrases
pdf.RedactTextOnPages("Confidential",
new[] { 0, 1, 2 }, // Specific pages
caseSensitive: false);
// 3. Redact regions by coordinates
pdf.RedactRegion(new Rectangle(100, 200, 300, 50), 0);
// 4. Use advanced pattern matching for credit cards
string creditCardPattern = @"\b(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|3[47][0-9]{13})\b";
pdf.RedactTextOnAllPages(creditCardPattern, isRegex: true);
// Apply OCR-based redaction for scanned documents
pdf.ApplyOcr(new TesseractLanguage[] { TesseractLanguage.English });
pdf.RedactTextOnAllPages("Salary:");
// Save with audit trail
pdf.MetaData.CustomProperties.Add("Redacted", DateTime.UtcNow.ToString());
pdf.MetaData.CustomProperties.Add("RedactedBy", Environment.UserName);
pdf.SaveAs("redacted-records.pdf");
using IronPdf;
// Load PDF containing sensitive information
PdfDocument pdf = PdfDocument.FromFile("customer-records.pdf");
// Redact using multiple strategies
// 1. Redact specific text patterns (SSN format)
pdf.RedactTextOnAllPages(@"\b\d{3}-\d{2}-\d{4}\b",
isRegex: true,
new RedactionOptions
{
RedactionColor = Color.Black,
RedactionStyle = RedactionStyle.Filled,
DrawRedactionBorder = true,
BorderColor = Color.Red
});
// 2. Redact specific phrases
pdf.RedactTextOnPages("Confidential",
new[] { 0, 1, 2 }, // Specific pages
caseSensitive: false);
// 3. Redact regions by coordinates
pdf.RedactRegion(new Rectangle(100, 200, 300, 50), 0);
// 4. Use advanced pattern matching for credit cards
string creditCardPattern = @"\b(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|3[47][0-9]{13})\b";
pdf.RedactTextOnAllPages(creditCardPattern, isRegex: true);
// Apply OCR-based redaction for scanned documents
pdf.ApplyOcr(new TesseractLanguage[] { TesseractLanguage.English });
pdf.RedactTextOnAllPages("Salary:");
// Save with audit trail
pdf.MetaData.CustomProperties.Add("Redacted", DateTime.UtcNow.ToString());
pdf.MetaData.CustomProperties.Add("RedactedBy", Environment.UserName);
pdf.SaveAs("redacted-records.pdf");
Imports IronPdf
' Load PDF containing sensitive information
Private pdf As PdfDocument = PdfDocument.FromFile("customer-records.pdf")
' Redact using multiple strategies
' 1. Redact specific text patterns (SSN format)
pdf.RedactTextOnAllPages("\b\d{3}-\d{2}-\d{4}\b", isRegex:= True, New RedactionOptions With {
.RedactionColor = Color.Black,
.RedactionStyle = RedactionStyle.Filled,
.DrawRedactionBorder = True,
.BorderColor = Color.Red
})
' 2. Redact specific phrases
pdf.RedactTextOnPages("Confidential", { 0, 1, 2 }, caseSensitive:= False)
' 3. Redact regions by coordinates
pdf.RedactRegion(New Rectangle(100, 200, 300, 50), 0)
' 4. Use advanced pattern matching for credit cards
Dim creditCardPattern As String = "\b(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|3[47][0-9]{13})\b"
pdf.RedactTextOnAllPages(creditCardPattern, isRegex:= True)
' Apply OCR-based redaction for scanned documents
pdf.ApplyOcr(New TesseractLanguage() { TesseractLanguage.English })
pdf.RedactTextOnAllPages("Salary:")
' Save with audit trail
pdf.MetaData.CustomProperties.Add("Redacted", DateTime.UtcNow.ToString())
pdf.MetaData.CustomProperties.Add("RedactedBy", Environment.UserName)
pdf.SaveAs("redacted-records.pdf")
IronPDF'nin geri alma yetenekleri şunları içerir:
- Gerçek İçerik Kaldırma: Metni kalıcı olarak kaldırır, sadece gizlemez
- Desen Tanıma: SSN'ler, kredi kartları, e-postalar için regex desteği
- Görsel Geri Alma Stilleri: Denetim izleri için özelleştirilebilir görünüm
- OCR Entegrasyonu: Tarama belgelerindeki metni gizler
- Seçici Geri Alma: Belirli sayfaları veya bölgeleri hedefleyin
EvoPdf, yerleşik geri alma işlevselliği içermez, bu da gizlilik düzenlemelerine uyum gerektiren uygulamalar için önemli bir sınırlama olabilir.
Form İşleme: Etkileşimli PDF'ler Oluşturma
Her iki kutuphane de PDF formlarını destekler, ancak oluşturma ve işleme yaklaşımları farklıdır.
IronPDF Form Örneği
using IronPdf;
using IronPdf.Forms;
// Create a new PDF with an HTML form
var html = @"
<html>
<body>
<h2>Employee Information Form</h2>
<form>
<label>Full Name:</label>
<input type='text' name='fullName' required />
<label>Email:</label>
<input type='email' name='email' required />
<label>Department:</label>
<select name='department'>
<option value=''>Select Department</option>
<option value='IT'>Information Technology</option>
<option value='HR'>Human Resources</option>
<option value='Sales'>Sales</option>
</select>
<label>Start Date:</label>
<input type='date' name='startDate' />
<label>
<input type='checkbox' name='agreement' />
I agree to the terms and conditions
</label>
<button type='submit'>Submit</button>
</form>
</body>
</html>";
var renderer = new ChromePdfRenderer
{
RenderingOptions = new ChromePdfRenderOptions
{
CreatePdfFormsFromHtml = true // Enable form field creation
}
};
var pdf = renderer.RenderHtmlAsPdf(html);
// Programmatically fill form fields
pdf.Form.SetFieldValue("fullName", "John Doe");
pdf.Form.SetFieldValue("email", "john.doe@company.com");
pdf.Form.SetFieldValue("department", "IT");
pdf.Form.SetFieldValue("startDate", DateTime.Now.ToString("yyyy-MM-dd"));
pdf.Form.SetCheckBoxValue("agreement", true);
// Make specific fields read-only
pdf.Form.Fields["email"].ReadOnly = true;
// Add form field validation
foreach (var field in pdf.Form.Fields)
{
if (field.Name == "email")
{
field.Annotation.BorderColor = Color.Blue;
field.Annotation.BackgroundColor = Color.LightGray;
}
}
// Flatten form (convert to static content)
var flattenedPdf = pdf.Flatten();
flattenedPdf.SaveAs("completed-form.pdf");
// Or save as fillable form
pdf.SaveAs("fillable-form.pdf");
using IronPdf;
using IronPdf.Forms;
// Create a new PDF with an HTML form
var html = @"
<html>
<body>
<h2>Employee Information Form</h2>
<form>
<label>Full Name:</label>
<input type='text' name='fullName' required />
<label>Email:</label>
<input type='email' name='email' required />
<label>Department:</label>
<select name='department'>
<option value=''>Select Department</option>
<option value='IT'>Information Technology</option>
<option value='HR'>Human Resources</option>
<option value='Sales'>Sales</option>
</select>
<label>Start Date:</label>
<input type='date' name='startDate' />
<label>
<input type='checkbox' name='agreement' />
I agree to the terms and conditions
</label>
<button type='submit'>Submit</button>
</form>
</body>
</html>";
var renderer = new ChromePdfRenderer
{
RenderingOptions = new ChromePdfRenderOptions
{
CreatePdfFormsFromHtml = true // Enable form field creation
}
};
var pdf = renderer.RenderHtmlAsPdf(html);
// Programmatically fill form fields
pdf.Form.SetFieldValue("fullName", "John Doe");
pdf.Form.SetFieldValue("email", "john.doe@company.com");
pdf.Form.SetFieldValue("department", "IT");
pdf.Form.SetFieldValue("startDate", DateTime.Now.ToString("yyyy-MM-dd"));
pdf.Form.SetCheckBoxValue("agreement", true);
// Make specific fields read-only
pdf.Form.Fields["email"].ReadOnly = true;
// Add form field validation
foreach (var field in pdf.Form.Fields)
{
if (field.Name == "email")
{
field.Annotation.BorderColor = Color.Blue;
field.Annotation.BackgroundColor = Color.LightGray;
}
}
// Flatten form (convert to static content)
var flattenedPdf = pdf.Flatten();
flattenedPdf.SaveAs("completed-form.pdf");
// Or save as fillable form
pdf.SaveAs("fillable-form.pdf");
Imports IronPdf
Imports IronPdf.Forms
' Create a new PDF with an HTML form
Private html = "
<html>
<body>
<h2>Employee Information Form</h2>
<form>
<label>Full Name:</label>
<input type='text' name='fullName' required />
<label>Email:</label>
<input type='email' name='email' required />
<label>Department:</label>
<select name='department'>
<option value=''>Select Department</option>
<option value='IT'>Information Technology</option>
<option value='HR'>Human Resources</option>
<option value='Sales'>Sales</option>
</select>
<label>Start Date:</label>
<input type='date' name='startDate' />
<label>
<input type='checkbox' name='agreement' />
I agree to the terms and conditions
</label>
<button type='submit'>Submit</button>
</form>
</body>
</html>"
Private renderer = New ChromePdfRenderer With {
.RenderingOptions = New ChromePdfRenderOptions With {.CreatePdfFormsFromHtml = True}
}
Private pdf = renderer.RenderHtmlAsPdf(html)
' Programmatically fill form fields
pdf.Form.SetFieldValue("fullName", "John Doe")
pdf.Form.SetFieldValue("email", "john.doe@company.com")
pdf.Form.SetFieldValue("department", "IT")
pdf.Form.SetFieldValue("startDate", DateTime.Now.ToString("yyyy-MM-dd"))
pdf.Form.SetCheckBoxValue("agreement", True)
' Make specific fields read-only
pdf.Form.Fields("email").ReadOnly = True
' Add form field validation
For Each field In pdf.Form.Fields
If field.Name = "email" Then
field.Annotation.BorderColor = Color.Blue
field.Annotation.BackgroundColor = Color.LightGray
End If
Next field
' Flatten form (convert to static content)
Dim flattenedPdf = pdf.Flatten()
flattenedPdf.SaveAs("completed-form.pdf")
' Or save as fillable form
pdf.SaveAs("fillable-form.pdf")
IronPDF'nin form işleme özellikleri:
- Otomatik Form Oluşturma: HTML formlarını PDF formlarına dönüştürür
- Programlı İşleme: API aracılığıyla form alanlarını doldurun, okuyun ve değiştirin
- Alan Türleri: Metin, onay kutusu, radyo, açılır kutu, imza alanları
- Doğrulama: Alan özelliklerini ve kısıtlamalarını ayarlayın
- Form Yereleştirme: Doldurulmuş formları statik PDF'lere dönüştürün
Performans Kriterleri: Gerçek Dünya Senaryoları
Performans özellikleri, belge karmaşıklığına ve kullanım senaryosuna bağlı olarak önemli ölçüde değişir:
Toplu İşleme Performans Testi
// Performance comparison for batch processing
public class PerformanceBenchmark
{
public static async Task RunBenchmark()
{
var htmlTemplates = GenerateInvoiceTemplates(1000);
var stopwatch = new Stopwatch();
// IronPDF batch processing with optimization
Console.WriteLine("IronPDF Batch Processing:");
stopwatch.Start();
var renderer = new ChromePdfRenderer
{
RenderingOptions = new ChromePdfRenderOptions
{
RenderDelay = 0, // No delay for static content
EnableJavaScript = false, // Disable JS for speed
DPI = 150 // Lower DPI for faster rendering
}
};
// Parallel processing
var tasks = htmlTemplates.Select(async (html, index) =>
{
var pdf = await renderer.RenderHtmlAsPdfAsync(html);
await pdf.SaveAsAsync($"ironpdf-invoice-{index}.pdf");
});
await Task.WhenAll(tasks);
stopwatch.Stop();
Console.WriteLine($"Time: {stopwatch.ElapsedMilliseconds}ms");
Console.WriteLine($"Average: {stopwatch.ElapsedMilliseconds / 1000.0}ms per PDF");
// Memory usage
var process = Process.GetCurrentProcess();
Console.WriteLine($"Memory: {process.WorkingSet64 / 1024 / 1024}MB");
}
}
// Performance comparison for batch processing
public class PerformanceBenchmark
{
public static async Task RunBenchmark()
{
var htmlTemplates = GenerateInvoiceTemplates(1000);
var stopwatch = new Stopwatch();
// IronPDF batch processing with optimization
Console.WriteLine("IronPDF Batch Processing:");
stopwatch.Start();
var renderer = new ChromePdfRenderer
{
RenderingOptions = new ChromePdfRenderOptions
{
RenderDelay = 0, // No delay for static content
EnableJavaScript = false, // Disable JS for speed
DPI = 150 // Lower DPI for faster rendering
}
};
// Parallel processing
var tasks = htmlTemplates.Select(async (html, index) =>
{
var pdf = await renderer.RenderHtmlAsPdfAsync(html);
await pdf.SaveAsAsync($"ironpdf-invoice-{index}.pdf");
});
await Task.WhenAll(tasks);
stopwatch.Stop();
Console.WriteLine($"Time: {stopwatch.ElapsedMilliseconds}ms");
Console.WriteLine($"Average: {stopwatch.ElapsedMilliseconds / 1000.0}ms per PDF");
// Memory usage
var process = Process.GetCurrentProcess();
Console.WriteLine($"Memory: {process.WorkingSet64 / 1024 / 1024}MB");
}
}
' Performance comparison for batch processing
Public Class PerformanceBenchmark
Public Shared Async Function RunBenchmark() As Task
Dim htmlTemplates = GenerateInvoiceTemplates(1000)
Dim stopwatch As New Stopwatch()
' IronPDF batch processing with optimization
Console.WriteLine("IronPDF Batch Processing:")
stopwatch.Start()
Dim renderer = New ChromePdfRenderer With {
.RenderingOptions = New ChromePdfRenderOptions With {
.RenderDelay = 0,
.EnableJavaScript = False,
.DPI = 150
}
}
' Parallel processing
Dim tasks = htmlTemplates.Select(Async Function(html, index)
Dim pdf = Await renderer.RenderHtmlAsPdfAsync(html)
Await pdf.SaveAsAsync($"ironpdf-invoice-{index}.pdf")
End Function)
Await Task.WhenAll(tasks)
stopwatch.Stop()
Console.WriteLine($"Time: {stopwatch.ElapsedMilliseconds}ms")
Console.WriteLine($"Average: {stopwatch.ElapsedMilliseconds / 1000.0}ms per PDF")
' Memory usage
Dim process As System.Diagnostics.Process = System.Diagnostics.Process.GetCurrentProcess()
Console.WriteLine($"Memory: {process.WorkingSet64 \ 1024 \ 1024}MB")
End Function
End Class
Gerçek dünya testinden performans bulguları:
- Basit HTML: EvoPdf %30-40 daha hızlı (0,8s vs 1,2s)
- Karmaşık JavaScript: IronPDF daha güvenilir, EvoPdf başarısız olabilir
- Toplu İşleme: IronPDF daha iyi paralel işleme
- Bellek Kullanımı: EvoPdf daha düşük başlangıç, IronPDF daha iyi çöp toplama
- Büyük Belgeler: IronPDF 1000+ sayfalık belgelerde %30 daha hızlı
Farklı Ekip Boyutları için Fiyatlandırma Modelleri Nasıl Karşılaştırılır?
IronPDF Lisanslama Yapısı
IronPDF, Telif ücretsiz yeniden dağıtim seçeneğiyle birlikte Lite, Plus ve Professional lisanslar dahil çeşitli fiyat seçenekleri sunar. Lisanslama modeli, ekibiniz ve projeniz ihtiyaçları doğrultusunda ölçeklenmek üzere tasarlanmıştır (2025 fiyatları):
-
Lite Lisans: $799
- 1 geliştirici
- 1 konum
- 1 proje
- E-posta desteği
- Ideal for: Bireysel geliştiriciler, küçük projeler
-
Plus Lisans: $1,199
- 3 geliştirici
- 3 konum
- 3 proje
- E-posta, sohbet ve telefon desteği
- Ideal for: Küçük ekipler, çoklu projeler
- Professional Lisans: $2,399
- 10 geliştirici
- 10 konum
- 10 proje
-
Ekran paylaşımı ile öncelikli destek
- Ideal for: Orta ve büyük ekipler
- Ek Seçenekler:
- Telif ücretsiz yeniden dağıtım: +$2,399
- 5 yıllık destek ve güncellemeler: $1,999 (veya $999/yıl)
- Iron Suite: $1,498 for all 9 Iron Software urunleri
EvoPdf Lisanslama Seçenekleri
EVO PDF Araç Seti dağıtım versiyonu için $650 ve şirket versiyonu için $1,400 maliyetindedir, oysa bağımsız HTML'den PDF dönüştürücüsü dağıtım için $450 ve şirket versiyonu için $1,200 maliyetindedir:
-
Dağıtım Lisansı:
- EVO HTML'den PDF'ye: $450
- EVO PDF Araç Seti: $650
- Tek sunucu, tek uygulama
- Yeniden dağıtım yapılamaz
- İlk yıl standart destek
- Şirket Lisansı:
- EVO HTML'den PDF'ye: $1,200
- EVO PDF Araç Seti: $1,400
- Sınırsız geliştirici
- Sınırsız dağıtım
- Tam yeniden dağıtım hakları
- İlk yıl öncelikli destek
Sahip Olma Maliyeti Analizi
Gerçek dünya senaryolarını ele alarak gerçek maliyet sonuçlarını anlamaya çalışalım:
Senaryo 1: 2 Geliştiricili Startup
- IronPDF Lite: $799 (2 lisans gerektirir = $1,498)
- EvoPdf Şirket: $1,200 (sınırsız geliştirici kapsar)
- Kazanan: İlk maliyet için EvoPdf
Senaryo 2: Büyüyen Ekip (5 Geliştirici, Çok Sayıda Proje)
- IronPDF Plus: $1,199 (3 geliştirici kapsar, Professional gerekir)
- IronPDF Professional: $2,399
- EvoPdf Şirket: $1,200
- Kazanan: Ekip ölçeklendirmesi için EvoPdf
Senaryo 3: Çeşitli PDF Araçları Gereken Kurumsal
- IronPDF Professional + IronOCR + IronBarcode: ~9.000 $
- Iron Suite: $1,498 (tüm 9 ürün)
- EvoPdf Araç Seti + Ek Araçlar: Her araç başına + $1,400
- Kazanan: Kapsamlı ihtiyaçlar için Iron Suite
Senaryo 4: Yeniden Dağıtımlı SaaS Ürünü
- IronPDF Professional + Yeniden Dağıtım: $4,998
- EvoPdf Şirketi: $1,200 (yeniden dağıtım dahil)
- Kazanan: Yeniden dağıtım senaryoları için EvoPdf
Modern CSS Çerçeveleri Seçiminizi Nasıl Etkiler?
PDF kütüphanesi seçerken genellikle hafife alınan bir faktör, modern CSS çerçeveleri için destektir. Bootstrap, Tailwind CSS ve Foundation web geliştirmede hakimdir, kütüphanenizin bu çerçeveleri yönetme yeteneği geliştirme verimliliğini ve çıktı kalitesini doğrudan etkiler.
IronPDF: Kapsamlı Çerçeve Desteği
IronPDF'nin tam Chrome V8 motoru, hiçbir taviz vermeden tüm modern CSS çerçevelerine yerel destek sağlar:
- Bootstrap 5: Karmaşık düzenler için tam flexbox ve CSS Grid desteği
- Tailwind CSS: Tüm yardımcı sınıflar doğru şekilde render edilir
- Modern CSS3: Dönüşümler, animasyonlar, özel özelliklerin tümü desteklenir
- Üretim Doğrulama: Bootstrap ana sayfası ve Bootstrap şablonlarını başarıyla oluşturur
Kod Örneği: Bootstrap Zaman Çizelgesi Bileşeni
using IronPdf;
var renderer = new ChromePdfRenderer();
string bootstrapTimeline = @"
<!DOCTYPE html>
<html>
<head>
<link href='https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css' rel='stylesheet'>
<style>
.timeline { position: relative; padding: 20px 0; }
.timeline::before {
content: '';
position: absolute;
left: 50%;
width: 2px;
height: 100%;
background: #dee2e6;
}
.timeline-item { position: relative; margin: 20px 0; }
</style>
</head>
<body>
<div class='container py-5'>
<h2 class='text-center mb-5'>Project Timeline</h2>
<div class='timeline'>
<div class='timeline-item'>
<div class='row'>
<div class='col-md-6'>
<div class='card shadow-sm'>
<div class='card-body'>
<h5 class='card-title'>Phase 1: Planning</h5>
<p class='text-muted'>Q1 2025</p>
<p class='card-text'>Initial project scope and requirements gathering completed.</p>
<span class='badge bg-success'>Completed</span>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</body>
</html>";
var pdf = renderer.RenderHtmlAsPdf(bootstrapTimeline);
pdf.SaveAs("project-timeline.pdf");
using IronPdf;
var renderer = new ChromePdfRenderer();
string bootstrapTimeline = @"
<!DOCTYPE html>
<html>
<head>
<link href='https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css' rel='stylesheet'>
<style>
.timeline { position: relative; padding: 20px 0; }
.timeline::before {
content: '';
position: absolute;
left: 50%;
width: 2px;
height: 100%;
background: #dee2e6;
}
.timeline-item { position: relative; margin: 20px 0; }
</style>
</head>
<body>
<div class='container py-5'>
<h2 class='text-center mb-5'>Project Timeline</h2>
<div class='timeline'>
<div class='timeline-item'>
<div class='row'>
<div class='col-md-6'>
<div class='card shadow-sm'>
<div class='card-body'>
<h5 class='card-title'>Phase 1: Planning</h5>
<p class='text-muted'>Q1 2025</p>
<p class='card-text'>Initial project scope and requirements gathering completed.</p>
<span class='badge bg-success'>Completed</span>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</body>
</html>";
var pdf = renderer.RenderHtmlAsPdf(bootstrapTimeline);
pdf.SaveAs("project-timeline.pdf");
Imports IronPdf
Dim renderer As New ChromePdfRenderer()
Dim bootstrapTimeline As String = "
<!DOCTYPE html>
<html>
<head>
<link href='https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css' rel='stylesheet'>
<style>
.timeline { position: relative; padding: 20px 0; }
.timeline::before {
content: '';
position: absolute;
left: 50%;
width: 2px;
height: 100%;
background: #dee2e6;
}
.timeline-item { position: relative; margin: 20px 0; }
</style>
</head>
<body>
<div class='container py-5'>
<h2 class='text-center mb-5'>Project Timeline</h2>
<div class='timeline'>
<div class='timeline-item'>
<div class='row'>
<div class='col-md-6'>
<div class='card shadow-sm'>
<div class='card-body'>
<h5 class='card-title'>Phase 1: Planning</h5>
<p class='text-muted'>Q1 2025</p>
<p class='card-text'>Initial project scope and requirements gathering completed.</p>
<span class='badge bg-success'>Completed</span>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</body>
</html>"
Dim pdf = renderer.RenderHtmlAsPdf(bootstrapTimeline)
pdf.SaveAs("project-timeline.pdf")
EvoPdf: Sınırlı İyi CSS Desteği
EvoPdf'nin özel HTML oluşturma motoru, bazı modern çerçeve sınırlamaları ile sağlam CSS desteği sağlar:
- Bootstrap 3: Genelde eski Bootstrap sürümleriyle iyi çalışır
- Bootstrap 4+: Flexbox düzenleri ayarlama gerektirebilir
- CSS3 desteği: İyi kapsama (~%90) ama tamamlanmamış
- Mevcut çözümler: Karmaşık düzenler için genellikle manuel CSS ayarlamaları gerekiyor
Uygulamalı Hususlar:
Geliştirici deneyimine göre:
- Temel Bootstrap bileşenleri (düğmeler, uyarılar, tablolar) genelde doğru oluşturulur
- Gelişmiş bileşenler (navigasyon çubukları, modallar, karmaşık ızgaralar) özelleştirme gerektirebilir
- CSS Grid düzenleri test ve potansiyel yedeklemeler gerektirir
- Özel Bootstrap temaları bazen beklenmedik oluşturma sorunları yaşayabilir
Geliştirme Etkisi: Uygulamanız UI için Bootstrap'i kapsamlı kullanıyorsa ve web arayüzünüzle eşleşen raporlar veya belgeler oluşturmanız gerekiyorsa, IronPDF'nin sorunsuz oluşturma süreci önemli ölçüde geliştirici zamanını kurtarır. EvoPdf, şablonlarınızın PDF oluşturması için ayrı, basitleştirilmiş sürümlerinin oluşturulmasını gerektirebilir.
CSS çerçevesi uyumluluğu hakkında kapsamlı bilgi için Bootstrap & Flexbox CSS Rehberi'ne bakın.
Hangi Dokümantasyon ve Destek Seçenekleri Geliştiricilere Daha İyi Hizmet Eder?
IronPDF'nin Geliştirici Kaynakları
IronPDF kapsamlı dokümantasyon, 24/5 mühendis desteği, video eğitimleri, bir topluluk forumu ve düzenli güncellemeler sağlar. Destek ekosistemi şunları içerir:
-
Dokümantasyon Kalitesi:
- Kapsamlı API Referansı
- Adım adım eğitimler
- 100+ kod örneği
- YouTube'da video eğitimler YouTube'da
- Diğer kütüphanelerden geçiş kılavuzları
-
Destek Kanalları:
- 24/5 mühendislik desteği (geliştiricilere doğrudan erişim)
- Yanıt süresi: genellikle 24-48 saat
- Plus+ lisansları için canlı sohbet
- Professional lisanslar için telefon desteği
- Karmaşık sorunlar için ekran paylaşımı
- Topluluk forumu ve Stack Overflow varlığı
- Öğrenim Kaynakları:
- Başlangıç kılavuzları
- Mimari dokümantasyonu
- Performans optimizasyon kılavuzları
- Güvenlik en iyi uygulamaları
- Bulut dağıtım kılavuzları
EvoPdf'nin Destek Yapısı
EvoPdf, dokümantasyonu ve destek sunar:
-
Dokümantasyon:
- API referans dokümantasyonu
- Yaygın senaryolar için kod örnekleri
- Web sitesindeki canlı demo bölümü
- Temel sorun giderme kılavuzları
- Destek Seçenekleri:
- E-posta ve telefon desteği (ilk yıl dahil)
- Standart ve öncelikli destek seviyeleri
- Topluluk yardımı için destek forumu
- İlk yılın ardından yenileme gerekir
Ana fark, IronPDF'nin eğitim içeriği ve doğrudan mühendislik desteğine yaptığı yatırımdır, bu da öğrenme eğrisini önemli ölçüde düşürür ve sorun giderme zamanını azaltır.
Her Bir Kütüphane İçin En İyi Kullanım Durumları Nedir?
Ne Zaman IronPDF Secilir?
IronPDF, aşağıdaki senaryolarda başarı gösterir:
1. Modern Web Uygulama Entegrasyonu
- Dinamik raporlar üreten SaaS platformları
- Grafiklerle fatura oluşturan e-ticaret siteleri
- PDF olarak dışa aktarılan iş zekası gösterge panelleri
- React, Angular veya Vue.js kullanan uygulamalar
2. Uyumluluk ve Güvenlik Gereksinimleri
- HIPAA uyumluluğunu gerektiren sağlık sistemleri
- Denetim izleri gerektiren finansal hizmetler
- Karartma seçeneğiyle yasal belge yönetimi
- Güvenlik yönergelerine sahip hükümet uygulamaları
3. Karmaşık Belge İşleme
- Çok formatlı belge dönüşümü (DOCX, HTML, Görseller)
- Tarama belgeleri için OCR entegrasyonu
- Paralel işlemeyle toplu işleme
- Dijital imzalı belgeler
4. Platformlar Arası Dağıtım
- Docker ile konteynerize edilmiş uygulamalar
- Linux tabanlı bulut dağıtımları
- Mikroservis mimarileri
- Sunucusuz fonksiyonlar (AWS Lambda, Azure Functions)
Gerçek Dünya Örneği: Sağlık Raporu Oluşturma
public class HealthcareReportGenerator
{
private readonly ChromePdfRenderer _renderer;
public HealthcareReportGenerator()
{
_renderer = new ChromePdfRenderer
{
RenderingOptions = new ChromePdfRenderOptions
{
DPI = 300, // High quality for medical imaging
EnableJavaScript = true,
RenderDelay = 3000, // Allow charts to fully render
CreatePdfFormsFromHtml = true
}
};
}
public async Task<byte[]> GeneratePatientReport(PatientData patient)
{
// Generate HTML with patient data and charts
var html = await GenerateReportHtml(patient);
// Convert to PDF
var pdf = await _renderer.RenderHtmlAsPdfAsync(html);
// Apply security and compliance
pdf.SecuritySettings = new SecuritySettings
{
AllowPrint = true,
AllowCopy = false,
EncryptionLevel = EncryptionLevel.AES256Bit,
UserPassword = patient.AccessCode
};
// Redact SSN except last 4 digits
pdf.RedactTextOnAllPages(@"\b\d{3}-\d{2}-(\d{4})\b",
replacement: "XXX-XX-$1",
isRegex: true);
// Add audit metadata
pdf.MetaData.Author = "Healthcare System";
pdf.MetaData.Title = $"Patient Report - {patient.PatientId}";
pdf.MetaData.CreationDate = DateTime.UtcNow;
pdf.MetaData.CustomProperties.Add("HIPAA_Compliant", "true");
// Add digital signature
var signature = new PdfSignature("hospital-cert.pfx", "password")
{
SigningReason = "Medical Record Authenticity",
SigningLocation = "Hospital Name"
};
pdf.Sign(signature);
return pdf.BinaryData;
}
}
public class HealthcareReportGenerator
{
private readonly ChromePdfRenderer _renderer;
public HealthcareReportGenerator()
{
_renderer = new ChromePdfRenderer
{
RenderingOptions = new ChromePdfRenderOptions
{
DPI = 300, // High quality for medical imaging
EnableJavaScript = true,
RenderDelay = 3000, // Allow charts to fully render
CreatePdfFormsFromHtml = true
}
};
}
public async Task<byte[]> GeneratePatientReport(PatientData patient)
{
// Generate HTML with patient data and charts
var html = await GenerateReportHtml(patient);
// Convert to PDF
var pdf = await _renderer.RenderHtmlAsPdfAsync(html);
// Apply security and compliance
pdf.SecuritySettings = new SecuritySettings
{
AllowPrint = true,
AllowCopy = false,
EncryptionLevel = EncryptionLevel.AES256Bit,
UserPassword = patient.AccessCode
};
// Redact SSN except last 4 digits
pdf.RedactTextOnAllPages(@"\b\d{3}-\d{2}-(\d{4})\b",
replacement: "XXX-XX-$1",
isRegex: true);
// Add audit metadata
pdf.MetaData.Author = "Healthcare System";
pdf.MetaData.Title = $"Patient Report - {patient.PatientId}";
pdf.MetaData.CreationDate = DateTime.UtcNow;
pdf.MetaData.CustomProperties.Add("HIPAA_Compliant", "true");
// Add digital signature
var signature = new PdfSignature("hospital-cert.pfx", "password")
{
SigningReason = "Medical Record Authenticity",
SigningLocation = "Hospital Name"
};
pdf.Sign(signature);
return pdf.BinaryData;
}
}
Public Class HealthcareReportGenerator
Private ReadOnly _renderer As ChromePdfRenderer
Public Sub New()
_renderer = New ChromePdfRenderer With {
.RenderingOptions = New ChromePdfRenderOptions With {
.DPI = 300,
.EnableJavaScript = True,
.RenderDelay = 3000,
.CreatePdfFormsFromHtml = True
}
}
End Sub
Public Async Function GeneratePatientReport(ByVal patient As PatientData) As Task(Of Byte())
' Generate HTML with patient data and charts
Dim html = Await GenerateReportHtml(patient)
' Convert to PDF
Dim pdf = Await _renderer.RenderHtmlAsPdfAsync(html)
' Apply security and compliance
pdf.SecuritySettings = New SecuritySettings With {
.AllowPrint = True,
.AllowCopy = False,
.EncryptionLevel = EncryptionLevel.AES256Bit,
.UserPassword = patient.AccessCode
}
' Redact SSN except last 4 digits
pdf.RedactTextOnAllPages("\b\d{3}-\d{2}-(\d{4})\b", replacement:= "XXX-XX-$1", isRegex:= True)
' Add audit metadata
pdf.MetaData.Author = "Healthcare System"
pdf.MetaData.Title = $"Patient Report - {patient.PatientId}"
pdf.MetaData.CreationDate = DateTime.UtcNow
pdf.MetaData.CustomProperties.Add("HIPAA_Compliant", "true")
' Add digital signature
Dim signature = New PdfSignature("hospital-cert.pfx", "password") With {
.SigningReason = "Medical Record Authenticity",
.SigningLocation = "Hospital Name"
}
pdf.Sign(signature)
Return pdf.BinaryData
End Function
End Class
EvoPdf'yi Ne Zaman Tercih Etmeli
EvoPdf şunlar için uygundur:
1. Basit HTML'den PDF Dönüşümü
- Karmaşık JavaScript içermeyen temel raporlar
- Durağan HTML şablonları
- Basit faturalar ve makbuzlar
- Tutarlı şablonlarla toplu belge oluşturma
2. Bütçe Dostu Ekipler
- Tek bir lisansla sınırsız geliştirici
- Temel özellikler için daha düşük giriş maliyeti
- Gelişmiş PDF manipülasyonu gerektirmeyen projeler
3. Belirli Sunucu Ortamları
- Windows merkezli dağıtımlar
- Basit PDF gereksinimleri olan uygulamalar
- Eski sistem entegrasyonu
4. Yüksek Hacimli Basit Dönüştürmeler
- E-postadan PDF'e arşivleme
- Statik rapor oluşturma
- Belge sistemleri
- Baskıya hazır belge oluşturma
Gerçek Dünya Örneği: Fatura Oluşturma Sistemi
public class InvoiceGenerator
{
private readonly HtmlToPdfConverter _converter;
public InvoiceGenerator()
{
_converter = new HtmlToPdfConverter
{
LicenseKey = "your-license-key",
JavaScriptEnabled = false, // Not needed for static invoices
ConversionDelay = 0
};
// Configure for A4 invoices
_converter.PdfDocumentOptions.PdfPageSize = PdfPageSize.A4;
_converter.PdfDocumentOptions.TopMargin = 30;
_converter.PdfDocumentOptions.BottomMargin = 30;
}
public byte[] GenerateInvoice(InvoiceData data)
{
// Load HTML template
var template = File.ReadAllText("invoice-template.html");
// Simple string replacement for data
var html = template
.Replace("{{InvoiceNumber}}", data.InvoiceNumber)
.Replace("{{Date}}", data.Date.ToString("yyyy-MM-dd"))
.Replace("{{CustomerName}}", data.CustomerName)
.Replace("{{Total}}", data.Total.ToString("C"));
// Convert to PDF
return _converter.ConvertHtml(html, "");
}
}
public class InvoiceGenerator
{
private readonly HtmlToPdfConverter _converter;
public InvoiceGenerator()
{
_converter = new HtmlToPdfConverter
{
LicenseKey = "your-license-key",
JavaScriptEnabled = false, // Not needed for static invoices
ConversionDelay = 0
};
// Configure for A4 invoices
_converter.PdfDocumentOptions.PdfPageSize = PdfPageSize.A4;
_converter.PdfDocumentOptions.TopMargin = 30;
_converter.PdfDocumentOptions.BottomMargin = 30;
}
public byte[] GenerateInvoice(InvoiceData data)
{
// Load HTML template
var template = File.ReadAllText("invoice-template.html");
// Simple string replacement for data
var html = template
.Replace("{{InvoiceNumber}}", data.InvoiceNumber)
.Replace("{{Date}}", data.Date.ToString("yyyy-MM-dd"))
.Replace("{{CustomerName}}", data.CustomerName)
.Replace("{{Total}}", data.Total.ToString("C"));
// Convert to PDF
return _converter.ConvertHtml(html, "");
}
}
Public Class InvoiceGenerator
Private ReadOnly _converter As HtmlToPdfConverter
Public Sub New()
_converter = New HtmlToPdfConverter With {
.LicenseKey = "your-license-key",
.JavaScriptEnabled = False,
.ConversionDelay = 0
}
' Configure for A4 invoices
_converter.PdfDocumentOptions.PdfPageSize = PdfPageSize.A4
_converter.PdfDocumentOptions.TopMargin = 30
_converter.PdfDocumentOptions.BottomMargin = 30
End Sub
Public Function GenerateInvoice(ByVal data As InvoiceData) As Byte()
' Load HTML template
Dim template = File.ReadAllText("invoice-template.html")
' Simple string replacement for data
Dim html = template.Replace("{{InvoiceNumber}}", data.InvoiceNumber).Replace("{{Date}}", data.Date.ToString("yyyy-MM-dd")).Replace("{{CustomerName}}", data.CustomerName).Replace("{{Total}}", data.Total.ToString("C"))
' Convert to PDF
Return _converter.ConvertHtml(html, "")
End Function
End Class
Gelişmiş Uygulama Kalıpları ve En İyi Uygulamalar
Üretimde Performans Optimizasyonu
Her iki kütüphane de uygun yapılandırma ve kullanım kalıplarından faydalanır:
IronPDF Performans Optimizasyonu
public class OptimizedPdfService
{
private readonly ChromePdfRenderer _renderer;
private readonly SemaphoreSlim _semaphore;
public OptimizedPdfService(int maxConcurrency = 4)
{
_semaphore = new SemaphoreSlim(maxConcurrency);
_renderer = new ChromePdfRenderer
{
RenderingOptions = new ChromePdfRenderOptions
{
// Optimize for performance
EnableJavaScript = false, // Only if not needed
RenderDelay = 0,
DPI = 150, // Balance quality vs speed
CssMediaType = PdfCssMediaType.Screen,
Timeout = 30,
// Memory optimization
OptimizeForLowMemory = true
}
};
// Enable connection pooling
Installation.ChromeGpuMode = ChromeGpuModes.Disabled;
Installation.LinuxAndDockerDependenciesAutoConfig = false;
}
public async Task<byte[]> GeneratePdfAsync(string html)
{
await _semaphore.WaitAsync();
try
{
var pdf = await _renderer.RenderHtmlAsPdfAsync(html);
// Optimize file size
pdf.CompressImages(85);
pdf.RemoveUnusedResources();
return pdf.BinaryData;
}
finally
{
_semaphore.Release();
}
}
}
public class OptimizedPdfService
{
private readonly ChromePdfRenderer _renderer;
private readonly SemaphoreSlim _semaphore;
public OptimizedPdfService(int maxConcurrency = 4)
{
_semaphore = new SemaphoreSlim(maxConcurrency);
_renderer = new ChromePdfRenderer
{
RenderingOptions = new ChromePdfRenderOptions
{
// Optimize for performance
EnableJavaScript = false, // Only if not needed
RenderDelay = 0,
DPI = 150, // Balance quality vs speed
CssMediaType = PdfCssMediaType.Screen,
Timeout = 30,
// Memory optimization
OptimizeForLowMemory = true
}
};
// Enable connection pooling
Installation.ChromeGpuMode = ChromeGpuModes.Disabled;
Installation.LinuxAndDockerDependenciesAutoConfig = false;
}
public async Task<byte[]> GeneratePdfAsync(string html)
{
await _semaphore.WaitAsync();
try
{
var pdf = await _renderer.RenderHtmlAsPdfAsync(html);
// Optimize file size
pdf.CompressImages(85);
pdf.RemoveUnusedResources();
return pdf.BinaryData;
}
finally
{
_semaphore.Release();
}
}
}
Public Class OptimizedPdfService
Private ReadOnly _renderer As ChromePdfRenderer
Private ReadOnly _semaphore As SemaphoreSlim
Public Sub New(Optional ByVal maxConcurrency As Integer = 4)
_semaphore = New SemaphoreSlim(maxConcurrency)
_renderer = New ChromePdfRenderer With {
.RenderingOptions = New ChromePdfRenderOptions With {
.EnableJavaScript = False,
.RenderDelay = 0,
.DPI = 150,
.CssMediaType = PdfCssMediaType.Screen,
.Timeout = 30,
.OptimizeForLowMemory = True
}
}
' Enable connection pooling
Installation.ChromeGpuMode = ChromeGpuModes.Disabled
Installation.LinuxAndDockerDependenciesAutoConfig = False
End Sub
Public Async Function GeneratePdfAsync(ByVal html As String) As Task(Of Byte())
Await _semaphore.WaitAsync()
Try
Dim pdf = Await _renderer.RenderHtmlAsPdfAsync(html)
' Optimize file size
pdf.CompressImages(85)
pdf.RemoveUnusedResources()
Return pdf.BinaryData
Finally
_semaphore.Release()
End Try
End Function
End Class
EvoPdf Performans Kalıpları
public class EvoPdfOptimizedService
{
private readonly ObjectPool<HtmlToPdfConverter> _converterPool;
public EvoPdfOptimizedService()
{
// Create object pool for converter reuse
_converterPool = new DefaultObjectPool<HtmlToPdfConverter>(
new ConverterPoolPolicy(),
Environment.ProcessorCount * 2);
}
public async Task<byte[]> GeneratePdfAsync(string html)
{
var converter = _converterPool.Get();
try
{
// Configure for speed
converter.ConversionDelay = 0;
converter.JavaScriptEnabled = false;
// Use async pattern
return await Task.Run(() => converter.ConvertHtml(html, ""));
}
finally
{
_converterPool.Return(converter);
}
}
private class ConverterPoolPolicy : IPooledObjectPolicy<HtmlToPdfConverter>
{
public HtmlToPdfConverter Create()
{
return new HtmlToPdfConverter
{
LicenseKey = "your-license-key"
};
}
public bool Return(HtmlToPdfConverter obj)
{
// Reset to default state
obj.ConversionDelay = 2;
return true;
}
}
}
public class EvoPdfOptimizedService
{
private readonly ObjectPool<HtmlToPdfConverter> _converterPool;
public EvoPdfOptimizedService()
{
// Create object pool for converter reuse
_converterPool = new DefaultObjectPool<HtmlToPdfConverter>(
new ConverterPoolPolicy(),
Environment.ProcessorCount * 2);
}
public async Task<byte[]> GeneratePdfAsync(string html)
{
var converter = _converterPool.Get();
try
{
// Configure for speed
converter.ConversionDelay = 0;
converter.JavaScriptEnabled = false;
// Use async pattern
return await Task.Run(() => converter.ConvertHtml(html, ""));
}
finally
{
_converterPool.Return(converter);
}
}
private class ConverterPoolPolicy : IPooledObjectPolicy<HtmlToPdfConverter>
{
public HtmlToPdfConverter Create()
{
return new HtmlToPdfConverter
{
LicenseKey = "your-license-key"
};
}
public bool Return(HtmlToPdfConverter obj)
{
// Reset to default state
obj.ConversionDelay = 2;
return true;
}
}
}
Public Class EvoPdfOptimizedService
Private ReadOnly _converterPool As ObjectPool(Of HtmlToPdfConverter)
Public Sub New()
' Create object pool for converter reuse
_converterPool = New DefaultObjectPool(Of HtmlToPdfConverter)(New ConverterPoolPolicy(), Environment.ProcessorCount * 2)
End Sub
Public Async Function GeneratePdfAsync(ByVal html As String) As Task(Of Byte())
Dim converter = _converterPool.Get()
Try
' Configure for speed
converter.ConversionDelay = 0
converter.JavaScriptEnabled = False
' Use async pattern
Return Await Task.Run(Function() converter.ConvertHtml(html, ""))
Finally
_converterPool.Return(converter)
End Try
End Function
Private Class ConverterPoolPolicy
Implements IPooledObjectPolicy(Of HtmlToPdfConverter)
Public Function Create() As HtmlToPdfConverter
Return New HtmlToPdfConverter With {.LicenseKey = "your-license-key"}
End Function
Public Function [Return](ByVal obj As HtmlToPdfConverter) As Boolean
' Reset to default state
obj.ConversionDelay = 2
Return True
End Function
End Class
End Class
Hata Yonetimi ve Hata Ayiklama
Üretim uygulamaları için sağlam hata yönetimi hayati önem taşır:
IronPDF Hata Yönetimi
public class RobustPdfGenerator
{
private readonly ILogger<RobustPdfGenerator> _logger;
private readonly ChromePdfRenderer _renderer;
public async Task<Result<byte[]>> TryGeneratePdfAsync(string html)
{
try
{
// Enable detailed logging
IronPdf.Logging.Logger.EnableDebugging = true;
IronPdf.Logging.Logger.LogFilePath = "ironpdf.log";
IronPdf.Logging.Logger.LoggingLevel = LoggingLevels.All;
var pdf = await _renderer.RenderHtmlAsPdfAsync(html);
// Validate output
if (pdf.PageCount == 0)
{
return Result<byte[]>.Failure("Generated PDF has no pages");
}
return Result<byte[]>.Success(pdf.BinaryData);
}
catch (IronPdf.Exceptions.IronPdfRenderException ex)
{
_logger.LogError(ex, "Rendering failed: {Message}", ex.Message);
// Attempt fallback with simpler settings
return await FallbackRender(html);
}
catch (Exception ex)
{
_logger.LogError(ex, "Unexpected error in PDF generation");
return Result<byte[]>.Failure($"PDF generation failed: {ex.Message}");
}
}
private async Task<Result<byte[]>> FallbackRender(string html)
{
var fallbackRenderer = new ChromePdfRenderer
{
RenderingOptions = new ChromePdfRenderOptions
{
EnableJavaScript = false,
DPI = 96,
Timeout = 60
}
};
try
{
var pdf = await fallbackRenderer.RenderHtmlAsPdfAsync(html);
return Result<byte[]>.Success(pdf.BinaryData);
}
catch (Exception ex)
{
return Result<byte[]>.Failure($"Fallback render failed: {ex.Message}");
}
}
}
public class RobustPdfGenerator
{
private readonly ILogger<RobustPdfGenerator> _logger;
private readonly ChromePdfRenderer _renderer;
public async Task<Result<byte[]>> TryGeneratePdfAsync(string html)
{
try
{
// Enable detailed logging
IronPdf.Logging.Logger.EnableDebugging = true;
IronPdf.Logging.Logger.LogFilePath = "ironpdf.log";
IronPdf.Logging.Logger.LoggingLevel = LoggingLevels.All;
var pdf = await _renderer.RenderHtmlAsPdfAsync(html);
// Validate output
if (pdf.PageCount == 0)
{
return Result<byte[]>.Failure("Generated PDF has no pages");
}
return Result<byte[]>.Success(pdf.BinaryData);
}
catch (IronPdf.Exceptions.IronPdfRenderException ex)
{
_logger.LogError(ex, "Rendering failed: {Message}", ex.Message);
// Attempt fallback with simpler settings
return await FallbackRender(html);
}
catch (Exception ex)
{
_logger.LogError(ex, "Unexpected error in PDF generation");
return Result<byte[]>.Failure($"PDF generation failed: {ex.Message}");
}
}
private async Task<Result<byte[]>> FallbackRender(string html)
{
var fallbackRenderer = new ChromePdfRenderer
{
RenderingOptions = new ChromePdfRenderOptions
{
EnableJavaScript = false,
DPI = 96,
Timeout = 60
}
};
try
{
var pdf = await fallbackRenderer.RenderHtmlAsPdfAsync(html);
return Result<byte[]>.Success(pdf.BinaryData);
}
catch (Exception ex)
{
return Result<byte[]>.Failure($"Fallback render failed: {ex.Message}");
}
}
}
Public Class RobustPdfGenerator
Private ReadOnly _logger As ILogger(Of RobustPdfGenerator)
Private ReadOnly _renderer As ChromePdfRenderer
Public Async Function TryGeneratePdfAsync(ByVal html As String) As Task(Of Result(Of Byte()))
Try
' Enable detailed logging
IronPdf.Logging.Logger.EnableDebugging = True
IronPdf.Logging.Logger.LogFilePath = "ironpdf.log"
IronPdf.Logging.Logger.LoggingLevel = LoggingLevels.All
Dim pdf = Await _renderer.RenderHtmlAsPdfAsync(html)
' Validate output
If pdf.PageCount = 0 Then
Return Result(Of Byte()).Failure("Generated PDF has no pages")
End If
Return Result(Of Byte()).Success(pdf.BinaryData)
Catch ex As IronPdf.Exceptions.IronPdfRenderException
_logger.LogError(ex, "Rendering failed: {Message}", ex.Message)
' Attempt fallback with simpler settings
Return Await FallbackRender(html)
Catch ex As Exception
_logger.LogError(ex, "Unexpected error in PDF generation")
Return Result(Of Byte()).Failure($"PDF generation failed: {ex.Message}")
End Try
End Function
Private Async Function FallbackRender(ByVal html As String) As Task(Of Result(Of Byte()))
Dim fallbackRenderer = New ChromePdfRenderer With {
.RenderingOptions = New ChromePdfRenderOptions With {
.EnableJavaScript = False,
.DPI = 96,
.Timeout = 60
}
}
Try
Dim pdf = Await fallbackRenderer.RenderHtmlAsPdfAsync(html)
Return Result(Of Byte()).Success(pdf.BinaryData)
Catch ex As Exception
Return Result(Of Byte()).Failure($"Fallback render failed: {ex.Message}")
End Try
End Function
End Class
Sektör-Specifik Uygulama Örnekleri
Finansal Hizmetler: Yasal Uyumluluk
Finansal kurumlar uyumluluk için belirli özellikler gerektirir:
public class FinancialStatementGenerator
{
public async Task<byte[]> GenerateQuarterlyReport(FinancialData data)
{
var renderer = new ChromePdfRenderer();
// Generate report with charts and tables
var html = await BuildFinancialReportHtml(data);
var pdf = renderer.RenderHtmlAsPdf(html);
// Add compliance watermark
pdf.ApplyWatermark(@"
<div style='text-align: center; color: rgba(0,0,0,0.1); font-size: 120px;
transform: rotate(-45deg); font-family: Arial;'>
DRAFT
</div>", 30, VerticalAlignment.Middle, HorizontalAlignment.Center);
// Embed audit information
pdf.MetaData.Author = "Financial Reporting System";
pdf.MetaData.Keywords = "Quarterly Report, SOX Compliant";
pdf.MetaData.CustomProperties.Add("ReportPeriod", data.Quarter);
pdf.MetaData.CustomProperties.Add("GeneratedBy", Environment.UserName);
pdf.MetaData.CustomProperties.Add("Timestamp", DateTime.UtcNow.ToString("O"));
// Apply tamper-evident signature
var cert = new X509Certificate2("financial-cert.pfx", "password");
var signature = new PdfSignature(cert)
{
SigningReason = "Financial Report Certification",
SigningLocation = "Corporate Finance Department",
IsVisible = true,
SignatureImage = new PdfSignatureImage("cfo-signature.png")
};
pdf.Sign(signature);
// Lock document from editing
pdf.SecuritySettings = new SecuritySettings
{
AllowModifyDocument = false,
AllowCopy = true,
AllowPrint = true,
EncryptionLevel = EncryptionLevel.AES256Bit
};
return pdf.BinaryData;
}
}
public class FinancialStatementGenerator
{
public async Task<byte[]> GenerateQuarterlyReport(FinancialData data)
{
var renderer = new ChromePdfRenderer();
// Generate report with charts and tables
var html = await BuildFinancialReportHtml(data);
var pdf = renderer.RenderHtmlAsPdf(html);
// Add compliance watermark
pdf.ApplyWatermark(@"
<div style='text-align: center; color: rgba(0,0,0,0.1); font-size: 120px;
transform: rotate(-45deg); font-family: Arial;'>
DRAFT
</div>", 30, VerticalAlignment.Middle, HorizontalAlignment.Center);
// Embed audit information
pdf.MetaData.Author = "Financial Reporting System";
pdf.MetaData.Keywords = "Quarterly Report, SOX Compliant";
pdf.MetaData.CustomProperties.Add("ReportPeriod", data.Quarter);
pdf.MetaData.CustomProperties.Add("GeneratedBy", Environment.UserName);
pdf.MetaData.CustomProperties.Add("Timestamp", DateTime.UtcNow.ToString("O"));
// Apply tamper-evident signature
var cert = new X509Certificate2("financial-cert.pfx", "password");
var signature = new PdfSignature(cert)
{
SigningReason = "Financial Report Certification",
SigningLocation = "Corporate Finance Department",
IsVisible = true,
SignatureImage = new PdfSignatureImage("cfo-signature.png")
};
pdf.Sign(signature);
// Lock document from editing
pdf.SecuritySettings = new SecuritySettings
{
AllowModifyDocument = false,
AllowCopy = true,
AllowPrint = true,
EncryptionLevel = EncryptionLevel.AES256Bit
};
return pdf.BinaryData;
}
}
Public Class FinancialStatementGenerator
Public Async Function GenerateQuarterlyReport(ByVal data As FinancialData) As Task(Of Byte())
Dim renderer = New ChromePdfRenderer()
' Generate report with charts and tables
Dim html = Await BuildFinancialReportHtml(data)
Dim pdf = renderer.RenderHtmlAsPdf(html)
' Add compliance watermark
pdf.ApplyWatermark("
<div style='text-align: center; color: rgba(0,0,0,0.1); font-size: 120px;
transform: rotate(-45deg); font-family: Arial;'>
DRAFT
</div>", 30, VerticalAlignment.Middle, HorizontalAlignment.Center)
' Embed audit information
pdf.MetaData.Author = "Financial Reporting System"
pdf.MetaData.Keywords = "Quarterly Report, SOX Compliant"
pdf.MetaData.CustomProperties.Add("ReportPeriod", data.Quarter)
pdf.MetaData.CustomProperties.Add("GeneratedBy", Environment.UserName)
pdf.MetaData.CustomProperties.Add("Timestamp", DateTime.UtcNow.ToString("O"))
' Apply tamper-evident signature
Dim cert = New X509Certificate2("financial-cert.pfx", "password")
Dim signature = New PdfSignature(cert) With {
.SigningReason = "Financial Report Certification",
.SigningLocation = "Corporate Finance Department",
.IsVisible = True,
.SignatureImage = New PdfSignatureImage("cfo-signature.png")
}
pdf.Sign(signature)
' Lock document from editing
pdf.SecuritySettings = New SecuritySettings With {
.AllowModifyDocument = False,
.AllowCopy = True,
.AllowPrint = True,
.EncryptionLevel = EncryptionLevel.AES256Bit
}
Return pdf.BinaryData
End Function
End Class
E-Ticaret: Dinamik Fatura Oluşturma
E-ticaret platformları hızlı ve güvenilir fatura oluşturma ihtiyaçındadır:
public class EcommerceInvoiceService
{
private readonly ChromePdfRenderer _renderer;
public EcommerceInvoiceService()
{
_renderer = new ChromePdfRenderer
{
RenderingOptions = new ChromePdfRenderOptions
{
MarginTop = 10,
MarginBottom = 10,
PaperSize = PdfPaperSize.A4,
DPI = 200 // High quality for barcodes
}
};
}
public async Task<byte[]> GenerateInvoice(Order order)
{
// Build invoice HTML with order details
var html = $@"
<html>
<head>
<style>
@page {{ size: A4; margin: 0; }}
body {{ font-family: Arial, sans-serif; }}
.invoice-header {{ background: #f0f0f0; padding: 20px; }}
.barcode {{ text-align: center; margin: 20px 0; }}
table {{ width: 100%; border-collapse: collapse; }}
th, td {{ padding: 10px; border-bottom: 1px solid #ddd; }}
</style>
</head>
<body>
<div class='invoice-header'>
<h1>Invoice #{order.InvoiceNumber}</h1>
<p>Date: {order.Date:yyyy-MM-dd}</p>
</div>
<div class='barcode'>
<img src='data:image/png;base64,{GenerateBarcode(order.InvoiceNumber)}' />
</div>
<table>
<tr>
<th>Item</th>
<th>Quantity</th>
<th>Price</th>
<th>Total</th>
</tr>
{string.Join("", order.Items.Select(item => $@"
<tr>
<td>{item.Name}</td>
<td>{item.Quantity}</td>
<td>${item.Price:F2}</td>
<td>${item.Total:F2}</td>
</tr>"))}
<tr>
<td colspan='3'><strong>Total</strong></td>
<td><strong>${order.Total:F2}</strong></td>
</tr>
</table>
<div class='footer'>
<p>Thank you for your business!</p>
<p>Return policy and terms at: www.example.com/terms</p>
</div>
</body>
</html>";
var pdf = await _renderer.RenderHtmlAsPdfAsync(html);
// Add QR code for mobile payment verification
var qrStamper = new ImageStamper($"https://api.qrserver.com/v1/create-qr-code/?data={order.PaymentId}")
{
HorizontalAlignment = HorizontalAlignment.Right,
VerticalAlignment = VerticalAlignment.Bottom,
Width = 100,
Height = 100
};
pdf.ApplyStamp(qrStamper);
return pdf.BinaryData;
}
}
public class EcommerceInvoiceService
{
private readonly ChromePdfRenderer _renderer;
public EcommerceInvoiceService()
{
_renderer = new ChromePdfRenderer
{
RenderingOptions = new ChromePdfRenderOptions
{
MarginTop = 10,
MarginBottom = 10,
PaperSize = PdfPaperSize.A4,
DPI = 200 // High quality for barcodes
}
};
}
public async Task<byte[]> GenerateInvoice(Order order)
{
// Build invoice HTML with order details
var html = $@"
<html>
<head>
<style>
@page {{ size: A4; margin: 0; }}
body {{ font-family: Arial, sans-serif; }}
.invoice-header {{ background: #f0f0f0; padding: 20px; }}
.barcode {{ text-align: center; margin: 20px 0; }}
table {{ width: 100%; border-collapse: collapse; }}
th, td {{ padding: 10px; border-bottom: 1px solid #ddd; }}
</style>
</head>
<body>
<div class='invoice-header'>
<h1>Invoice #{order.InvoiceNumber}</h1>
<p>Date: {order.Date:yyyy-MM-dd}</p>
</div>
<div class='barcode'>
<img src='data:image/png;base64,{GenerateBarcode(order.InvoiceNumber)}' />
</div>
<table>
<tr>
<th>Item</th>
<th>Quantity</th>
<th>Price</th>
<th>Total</th>
</tr>
{string.Join("", order.Items.Select(item => $@"
<tr>
<td>{item.Name}</td>
<td>{item.Quantity}</td>
<td>${item.Price:F2}</td>
<td>${item.Total:F2}</td>
</tr>"))}
<tr>
<td colspan='3'><strong>Total</strong></td>
<td><strong>${order.Total:F2}</strong></td>
</tr>
</table>
<div class='footer'>
<p>Thank you for your business!</p>
<p>Return policy and terms at: www.example.com/terms</p>
</div>
</body>
</html>";
var pdf = await _renderer.RenderHtmlAsPdfAsync(html);
// Add QR code for mobile payment verification
var qrStamper = new ImageStamper($"https://api.qrserver.com/v1/create-qr-code/?data={order.PaymentId}")
{
HorizontalAlignment = HorizontalAlignment.Right,
VerticalAlignment = VerticalAlignment.Bottom,
Width = 100,
Height = 100
};
pdf.ApplyStamp(qrStamper);
return pdf.BinaryData;
}
}
Public Class EcommerceInvoiceService
Private ReadOnly _renderer As ChromePdfRenderer
Public Sub New()
_renderer = New ChromePdfRenderer With {
.RenderingOptions = New ChromePdfRenderOptions With {
.MarginTop = 10,
.MarginBottom = 10,
.PaperSize = PdfPaperSize.A4,
.DPI = 200
}
}
End Sub
Public Async Function GenerateInvoice(ByVal order As Order) As Task(Of Byte())
' Build invoice HTML with order details
, order.InvoiceNumbstring.Format(r, order.Date, GenerateBarcode(order.InvoiceNumber), String.Join(TangibleTempVerbatimDoubleQuote, order.Items.Select(Function(item) $TangibleTempVerbatimCloseTag"ignoreignoreignoreignoreignoreignoreignoreignoreignoreignoreignoreignoreignoreignoreignoreignoreignoreignoreignoreignoreignoreignoreignoreignoreignoreignoreignoreignoreignore<tr><td>{item.Name}</td><td>{item.Quantity}</td><td>${item.Price:F2}</td><td>${item.Total:F2}</td></tr>")), TangibleStringInterpolationMarker) var html = $"TangibleTempVerbatimOpenTagTangibleTempVerbatimStringLiteralLineJoin <html>TangibleTempVerbatimStringLiteralLineJoin <head>TangibleTempVerbatimStringLiteralLineJoin <style>TangibleTempVerbatimStringLiteralLineJoin @page {{ size: A4; margin: 0; }}TangibleTempVerbatimStringLiteralLineJoin body {{ font-family: Arial, sans-serif; }}TangibleTempVerbatimStringLiteralLineJoin .invoice-header {{ background: #f0f0f0; padding: 20px; }}TangibleTempVerbatimStringLiteralLineJoin .barcode {{ text-align: center; margin: 20px 0; }}TangibleTempVerbatimStringLiteralLineJoin table {{ width: 100%; border-collapse: collapse; }}TangibleTempVerbatimStringLiteralLineJoin th, td {{ padding: 10px; border-bottom: 1px solid #ddd; }}TangibleTempVerbatimStringLiteralLineJoin </style>TangibleTempVerbatimStringLiteralLineJoin </head>TangibleTempVerbatimStringLiteralLineJoin <body>TangibleTempVerbatimStringLiteralLineJoin <div class='invoice-header'>TangibleTempVerbatimStringLiteralLineJoin <h1>Invoice #{0}</h1>TangibleTempVerbatimStringLiteralLineJoin <p>Date: {1:yyyy-MM-dd}</p>TangibleTempVerbatimStringLiteralLineJoin </div>TangibleTempVerbatimStringLiteralLineJoinTangibleTempVerbatimStringLiteralLineJoin <div class='barcode'>TangibleTempVerbatimStringLiteralLineJoin <img src='data:image/png;base64,{2}' />TangibleTempVerbatimStringLiteralLineJoin </div>TangibleTempVerbatimStringLiteralLineJoinTangibleTempVerbatimStringLiteralLineJoin <table>TangibleTempVerbatimStringLiteralLineJoin <tr>TangibleTempVerbatimStringLiteralLineJoin <th>Item</th>TangibleTempVerbatimStringLiteralLineJoin <th>Quantity</th>TangibleTempVerbatimStringLiteralLineJoin <th>Price</th>TangibleTempVerbatimStringLiteralLineJoin <th>Total</th>TangibleTempVerbatimStringLiteralLineJoin </tr>TangibleTempVerbatimStringLiteralLineJoin {3}ignoreignoreignoreignoreignoreignoreignoreignoreignoreignoreignoreignoreignoreignoreignoreignoreignoreignoreignoreignoreignoreignoreignoreignoreignoreignoreignoreignoreignoreignoreignoreignoreignoreignoreignore<tr><td colspan='3'><strong>Total</strong></td><td><strong>${order.Total:F2}</strong></td></tr></table><div class='footer'><p>Thank you for your business!</p><p>Return policy and terms at: www.example.com/terms</p></div></body></html>"
Dim pdf = Await _renderer.RenderHtmlAsPdfAsync(html)
' Add QR code for mobile payment verification
Dim qrStamper = New ImageStamper($"https://api.qrserver.com/v1/create-qr-code/?data={order.PaymentId}") With {
.HorizontalAlignment = HorizontalAlignment.Right,
.VerticalAlignment = VerticalAlignment.Bottom,
.Width = 100,
.Height = 100
}
pdf.ApplyStamp(qrStamper)
Return pdf.BinaryData
End Function
End Class
Geçiş Stratejileri: Kütüphaneler Arasında Geçiş
Eğer kütüphaneler arasında geçiş düşünüyorsanız, işte bir geçiş yaklaşımı:
EvoPdf'den IronPDF'e Geçiş
// EvoPdf pattern
HtmlToPdfConverter evoPdfConverter = new HtmlToPdfConverter();
evoPdfConverter.PdfDocumentOptions.PdfPageSize = PdfPageSize.A4;
byte[] pdfBytes = evoPdfConverter.ConvertUrl(url);
// Equivalent IronPDF pattern
var ironPdfRenderer = new ChromePdfRenderer
{
RenderingOptions = new ChromePdfRenderOptions
{
PaperSize = PdfPaperSize.A4
}
};
var pdf = ironPdfRenderer.RenderUrlAsPdf(url);
byte[] pdfBytes = pdf.BinaryData;
// Migration wrapper for gradual transition
public interface IPdfConverter
{
byte[] ConvertHtmlToPdf(string html);
byte[] ConvertUrlToPdf(string url);
}
public class IronPdfAdapter : IPdfConverter
{
private readonly ChromePdfRenderer _renderer = new ChromePdfRenderer();
public byte[] ConvertHtmlToPdf(string html)
{
return _renderer.RenderHtmlAsPdf(html).BinaryData;
}
public byte[] ConvertUrlToPdf(string url)
{
return _renderer.RenderUrlAsPdf(url).BinaryData;
}
}
public class EvoPdfAdapter : IPdfConverter
{
private readonly HtmlToPdfConverter _converter = new HtmlToPdfConverter();
public byte[] ConvertHtmlToPdf(string html)
{
return _converter.ConvertHtml(html, "");
}
public byte[] ConvertUrlToPdf(string url)
{
return _converter.ConvertUrl(url);
}
}
// EvoPdf pattern
HtmlToPdfConverter evoPdfConverter = new HtmlToPdfConverter();
evoPdfConverter.PdfDocumentOptions.PdfPageSize = PdfPageSize.A4;
byte[] pdfBytes = evoPdfConverter.ConvertUrl(url);
// Equivalent IronPDF pattern
var ironPdfRenderer = new ChromePdfRenderer
{
RenderingOptions = new ChromePdfRenderOptions
{
PaperSize = PdfPaperSize.A4
}
};
var pdf = ironPdfRenderer.RenderUrlAsPdf(url);
byte[] pdfBytes = pdf.BinaryData;
// Migration wrapper for gradual transition
public interface IPdfConverter
{
byte[] ConvertHtmlToPdf(string html);
byte[] ConvertUrlToPdf(string url);
}
public class IronPdfAdapter : IPdfConverter
{
private readonly ChromePdfRenderer _renderer = new ChromePdfRenderer();
public byte[] ConvertHtmlToPdf(string html)
{
return _renderer.RenderHtmlAsPdf(html).BinaryData;
}
public byte[] ConvertUrlToPdf(string url)
{
return _renderer.RenderUrlAsPdf(url).BinaryData;
}
}
public class EvoPdfAdapter : IPdfConverter
{
private readonly HtmlToPdfConverter _converter = new HtmlToPdfConverter();
public byte[] ConvertHtmlToPdf(string html)
{
return _converter.ConvertHtml(html, "");
}
public byte[] ConvertUrlToPdf(string url)
{
return _converter.ConvertUrl(url);
}
}
' EvoPdf pattern
Dim evoPdfConverter As New HtmlToPdfConverter()
evoPdfConverter.PdfDocumentOptions.PdfPageSize = PdfPageSize.A4
Dim pdfBytes() As Byte = evoPdfConverter.ConvertUrl(url)
' Equivalent IronPDF pattern
Dim ironPdfRenderer = New ChromePdfRenderer With {
.RenderingOptions = New ChromePdfRenderOptions With {.PaperSize = PdfPaperSize.A4}
}
Dim pdf = ironPdfRenderer.RenderUrlAsPdf(url)
Dim pdfBytes() As Byte = pdf.BinaryData
' Migration wrapper for gradual transition
'INSTANT VB TODO TASK: Local functions are not converted by Instant VB:
'public interface IPdfConverter
'{
' byte[] ConvertHtmlToPdf(string html);
' byte[] ConvertUrlToPdf(string url);
'}
'INSTANT VB TODO TASK: Local functions are not converted by Instant VB:
'public class IronPdfAdapter : IPdfConverter
'{
' private readonly ChromePdfRenderer _renderer = New ChromePdfRenderer();
'
' public byte[] ConvertHtmlToPdf(string html)
' {
' Return _renderer.RenderHtmlAsPdf(html).BinaryData;
' }
'
' public byte[] ConvertUrlToPdf(string url)
' {
' Return _renderer.RenderUrlAsPdf(url).BinaryData;
' }
'}
'INSTANT VB TODO TASK: Local functions are not converted by Instant VB:
'public class EvoPdfAdapter : IPdfConverter
'{
' private readonly HtmlToPdfConverter _converter = New HtmlToPdfConverter();
'
' public byte[] ConvertHtmlToPdf(string html)
' {
' Return _converter.ConvertHtml(html, "");
' }
'
' public byte[] ConvertUrlToPdf(string url)
' {
' Return _converter.ConvertUrl(url);
' }
'}
Sonuç: Projeniz İçin Doğru Seçimi Yapmak
Hem IronPDF hem de EvoPdf, .NET PDF kütüphane ekosisteminde önemli roller oynar, ancak farklı kullanım durumları ve geliştirme felsefelerini hedeflerler.
IronPDF'i şunlar için seçin:
- Modern web standart desteği (CSS3, JavaScript çerçeveleri)
- Sadece oluşturmanın ötesinde kapsamlı PDF manipülasyonu
- Kurumsal güvenlik özellikleri ve uyum araçları
- Platformlar arası dağıtım esnekliği
- Kapsamlı dokümantasyon ve doğrudan mühendis desteği
- Diğer belge işleme araçları ile entegrasyon
EvoPdf'yi şunlar için seçin:
- Daha düşük maliyetli basit HTML'den PDF'e dönüştürme
- Basit belgeler için temel PDF oluşturma
- Büyük ekipler için sınırsız geliştirici lisansları
- Basit HTML içeriğin daha hızlı işlenmesi
- Windows merkezli dağıtım ortamı
Karar nihayetinde belirli gereksinimlerinize, bütçe kısıtlamalarınıza ve uzun vadeli ölçeklenebilirlik ihtiyaçlarınıza bağlıdır. Çoğu modern uygulama için sağlam PDF yetenekleri gerektiren IronPDF'in kapsamlı özellik seti ve üstün render motoru yatırımı haklı çıkarır. Ancak, EvoPdf, maliyetin birincil endişe olduğu daha basit kullanım durumları için geçerli bir seçenek olmaya devam eder.
Consider starting with the 30-day free trial of IronPDF to evaluate its capabilities in your specific use case. Deneme, tüm özellikleri sınırlamasız olarak içerir ve çevrenizdeki gerçek performansa dayalı bilinçli bir karar vermenizi sağlar.
Bir PDF kütüphanesinin gerçek maliyeti, lisans fiyatının ötesine geçer—geliştirme süresi, bakım süresi ve uygulamanız büyüdükçe ek özelliklere olan potansiyel ihtiyaçı da göz önünde bulundurun. Sadece mevcut ihtiyaçlarınızı karşılayan değil, gelecekteki gereksinimlerinizle de ölçeklenebilecek kütüphaneyi seçin.
Sıkça Sorulan Sorular
HTML'yi bir .NET kütüphanesi kullanarak C#'ta PDF'ye nasıl dönüştürebilirim?
HTML dizgilerini PDF'lere dönüştürmek için IronPDF'nin RenderHtmlAsPdf yöntemini kullanabilirsiniz. Ayrıca RenderHtmlFileAsPdf kullanarak HTML dosyalarının PDF'lere dönüştürülmesini de sağlayabilirsiniz.
Karmaşık JavaScript ve CSS'yi işlemek için en iyi .NET PDF kütüphanesi nedir?
IronPDF, karmaşık JavaScript ve CSS'yi ele almak için en iyi seçimdir çünkü tam bir Chrome V8 render motoru kullanır ve modern çerçeveleri destekleyerek %98+ tarayıcı uyumluluğu sağlar.
Hangi .NET PDF kütüphanesi daha iyi çapraz platform desteği sunuyor?
IronPDF, Windows, Linux, macOS ve Docker konteynerları için doğal uyumluluk sunarak daha üstün çapraz platform desteği sağlar ve sıfır yapılandırma ile dağıtıma izin verir.
IronPDF'nin güvenlik ve uyumluluk için anahtar özellikleri nelerdir?
IronPDF, AES-256 şifreleme, 15'ten fazla ayrıntılı izin ayarı, görsel dijital imzalar ve RedactTextOnAllPages() yöntemi kullanarak gerçek içerik düzenleme dahil olmak üzere kapsamlı güvenlik özellikleri sağlar.
Batch PDF işlemesini .NET'te verimli bir şekilde nasıl gerçekleştiririm?
IronPDF, native async/await optimizasyonu ve daha iyi bellek yönetimi sunarak büyük belgeleri verimli bir şekilde işlemek için batch PDF işlemesinde başarılıdır.
Hangi kütüphane geliştiriciler için daha iyi destek ve dokümantasyon sağlar?
IronPDF, 24/5 mühendislik desteği, kapsamlı API dokümantasyonu, 100+ örnek kod ve video eğitimleri ile önemli ölçüde geliştirme süresini azaltarak kapsamlı destek ve dokümantasyon sağlar.
Bir .NET kütüphanesi kullanarak DOCX dosyalarını PDF'ye dönüştürebilir miyim?
Evet, IronPDF'nin yerleşik DocxToPdfRenderer sınıfı aracılığıyla DOCX'ten PDF'ye dönüştürme özelliği vardır ve Word belgelerini biçimlendirmeyi koruyarak dönüştürmenize olanak tanır.
Modern web uygulamaları için IronPDF kullanmanın avantajları nelerdir?
IronPDF, dinamik içerik üretimi ve karmaşık belge işlemesi için uygun hale getiren Chrome tabanlı render motoru, kapsamlı PDF manipülasyonu özellikleri ve çapraz platform uyumluluğu sayesinde modern web uygulamaları için idealdir.
IronPDF, uyumluluk gereklilikleri için PDF düzenlemeyi nasıl ele alır?
IronPDF, GDPR ve HIPAA gibi gizlilik düzenlemelerine uyum sağlamak için regex tabanlı içerik çıkarma ve OCR tabanlı düzenleme dahil olmak üzere kapsamlı düzenleme yetenekleri sunar.
IronPDF, SaaS ve e-ticaret platformları için neden iyi bir seçimdir?
IronPDF, dinamik faturalar oluşturabilme, dijital imzaları destekleyebilme ve modern web teknolojileri ile sorunsuz entegrasyon sağlayabilmesi sayesinde SaaS ve e-ticaret platformları için uygun hale gelir.



