.NET 10 Kullanarak C#'ta HTML'i PDF'ye Cevirme
ASP.NET Core'da HTML içeriğini şık PDF'lere dönüştürerek ve bunları doğrudan tarayıcıya aktararak dinamik olarak profesyonel PDF belgeleri oluşturun. Disk depolaması gerekmez, geçici dosya yönetimi yoktur.
ASP.NET Core'da modern web uygulamaları geliştirirken, ihtiyaca göre PDF belgeleri oluşturabilme yeteneği, tekrarlayan bir gereksinimdir. Faturalar, bir ödeme onaylandığında indirilmelidir. Uyumluluk raporları, bir denetçi 'Dışa Aktar'ı tıkladığında anında görünmelidir. Kullanıcı bir şeylerin yanlış gidip gitmediğini düşünmeden önce sertifikalar hazır olmalıdır. IronPDF, HTML'yi - CSS, JavaScript ve web yazı tipleri dahil - diske hiçbir şey yazmadan piksel hassasiyetinde PDF çıktısına dönüştüren Chromium tabanlı PDF kütüphanesi aracılığıyla tüm bu senaryoları ele alır.
Bu kılavuz, bilmeniz gereken her şeyi kapsar: kütüphaneyi kurmak, HTML dizelerinden faturalar oluşturmak, Entity Framework verilerinden raporları iletmek, sayfa başlıklarını ve güvenlik ayarlarını uygulamak ve yüksek trafikli ASP.NET uygulamalarının iyi performans göstermesini sağlamak için en iyi uygulamaları benimsemek.
PDF'leri Anında Oluşturmak Ne Anlama Gelir?
"Anında" demek, belgenin HTTP isteği anında bellekte oluşturulduğu ve doğrudan çağrıya gönderildiği anlamına gelir. Hiçbir PDF dosyası dosya sistemine yazılmaz, hiçbir arka plan işi çalışma sırasına alınmaz ve istekler arasında sonucu saklayacak bir önbellek yoktur.
Bu yaklaşımın birkaç nedeni vardır. İlk olarak, bulut dağıtım hedefleri - Azure App Service, AWS Lambda, Docker kapsayıcıları - genellikle yerel dosya sisteminin geçici veya salt okunur olduğu ortamlarda çalışır. Bir PDF'yi geçici bir klasöre yaratmak ve ardından geri okumak bu ortamlarda kırılgandır. İkincisi, disk yazmalarından kaçınmak saldırı yüzeyini azaltır: sonrasında bir istek tarafından yanlış kullanıcıya yanlışlıkla sunulabilecek kalıntı dosya yoktur. Üçüncüsü, yalnızca bellek üzerinde gerçekleştirilen oluşturma tipik olarak daha hızlıdır çünkü kritik yol üzerindeki iki I/O işlemini (yazma ve okuma) ortadan kaldırır.
IronPDF'nin ChromePdfRenderer, her oluşturulan dokümanda .BinaryData özelliği ve .Stream özelliği sağlar. Bunlardan herhangi biri doğrudan bir ASP.NET Core FileResult'a iletilebilir, bu da akışı pratikte tek satıra indirir.
IronPDF'i bir ASP.NET Core Projesinde Nasıl Kurarsınız?
NuGet paketini Paket Yöneticisi Konsolu veya .NET CLI yoluyla ekleyin:
:ProductInstall
dotnet add package IronPdf
:ProductInstall
dotnet add package IronPdf
Paket yüklendikten sonra uygulama başlangıcında lisans anahtarınızı ayarlayın -- genellikle ilk render oluşturulmadan önce Program.cs içinde:
using IronPdf;
// Place license activation before any IronPDF call
License.LicenseKey = "YOUR-LICENSE-KEY";
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllersWithViews();
// Register ChromePdfRenderer as a singleton so the Chromium engine
// is initialised once and reused across all requests.
builder.Services.AddSingleton<ChromePdfRenderer>();
var app = builder.Build();
app.MapDefaultControllerRoute();
app.Run();
using IronPdf;
// Place license activation before any IronPDF call
License.LicenseKey = "YOUR-LICENSE-KEY";
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllersWithViews();
// Register ChromePdfRenderer as a singleton so the Chromium engine
// is initialised once and reused across all requests.
builder.Services.AddSingleton<ChromePdfRenderer>();
var app = builder.Build();
app.MapDefaultControllerRoute();
app.Run();
Imports IronPdf
' Place license activation before any IronPDF call
License.LicenseKey = "YOUR-LICENSE-KEY"
Dim builder = WebApplication.CreateBuilder(args)
builder.Services.AddControllersWithViews()
' Register ChromePdfRenderer as a singleton so the Chromium engine
' is initialised once and reused across all requests.
builder.Services.AddSingleton(Of ChromePdfRenderer)()
Dim app = builder.Build()
app.MapDefaultControllerRoute()
app.Run()
ChromePdfRenderer'yi singleton olarak kaydetmek önemlidir. Render işlemi ilk kullanıldığında dahili bir Chromium alt süreci başlatır. Her istek için yeni bir örnek oluşturursanız, bu başlangıç süresi artışını her çağrıda ödersiniz, bu da yük altında yüzlerce milisaniye gecikme ekler. Bir singleton örneği iş parçacığı güvenliğindedir ve ek yapılandırma gerekmeden eş zamanlı render isteklerini ele alır.
Özel beslemeler için NuGet.config kurulumları dahil genişleyen kurulum seçeneklerine göz atmak için kurulum genel bakışını ziyaret edin.
Bir HTML Dizesinden Fatura PDF'si Nasıl Oluşturursunuz?
Anında gerçekleştirme için en yaygın kullanım durumu, e-ticaret belgelerinin - faturalar, makbuzlar, sipariş onayları - oluşturulmasıdır; burada içerik her isteğe göre değişirken düzen sabit kalır.
Desen şudur: veri içeren bir HTML dizesi oluşturun, bunu RenderHtmlAsPdf'a iletin ve ikili sonucu bir dosya indirmesi olarak döndürün.
using IronPdf;
using Microsoft.AspNetCore.Mvc;
public class DocumentController : Controller
{
private readonly ChromePdfRenderer _renderer;
public DocumentController(ChromePdfRenderer renderer)
{
_renderer = renderer;
}
[HttpGet("invoice/{orderId:int}")]
public IActionResult GetInvoice(int orderId)
{
// In a real application, fetch this from your database or order service.
var order = GetOrderData(orderId);
string html = $"""
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<style>
body {{font-family: Arial, sans-serif; margin: 40px; color: #333;}}
h1 {{color: #1a56db;}}
table {{width: 100%; border-collapse: collapse; margin-top: 24px;}}
th, td {{padding: 10px 14px; border: 1px solid #d1d5db; text-align: left;}}
th {{background: #f3f4f6;}}
tfoot td {{font-weight: bold;}}
</style>
</head>
<body>
<h1>Invoice #{order.InvoiceNumber}</h1>
<p>Date: {DateTime.UtcNow:yyyy-MM-dd} | Customer: {order.CustomerName}</p>
<table>
<thead><tr><th>Item</th><th>Qty</th><th>Unit Price</th><th>Subtotal</th></tr></thead>
<tbody>
{string.Join("", order.Items.Select(i =>
$"<tr><td>{i.Name}</td><td>{i.Quantity}</td>" +
$"<td>${i.UnitPrice:F2}</td><td>${i.Quantity * i.UnitPrice:F2}</td></tr>"))}
</tbody>
<tfoot>
<tr><td colspan="3">Total</td><td>${order.Items.Sum(i => i.Quantity * i.UnitPrice):F2}</td></tr>
</tfoot>
</table>
</body>
</html>
""";
var pdf = _renderer.RenderHtmlAsPdf(html);
return File(pdf.BinaryData, "application/pdf", $"invoice-{orderId}.pdf");
}
}
using IronPdf;
using Microsoft.AspNetCore.Mvc;
public class DocumentController : Controller
{
private readonly ChromePdfRenderer _renderer;
public DocumentController(ChromePdfRenderer renderer)
{
_renderer = renderer;
}
[HttpGet("invoice/{orderId:int}")]
public IActionResult GetInvoice(int orderId)
{
// In a real application, fetch this from your database or order service.
var order = GetOrderData(orderId);
string html = $"""
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<style>
body {{font-family: Arial, sans-serif; margin: 40px; color: #333;}}
h1 {{color: #1a56db;}}
table {{width: 100%; border-collapse: collapse; margin-top: 24px;}}
th, td {{padding: 10px 14px; border: 1px solid #d1d5db; text-align: left;}}
th {{background: #f3f4f6;}}
tfoot td {{font-weight: bold;}}
</style>
</head>
<body>
<h1>Invoice #{order.InvoiceNumber}</h1>
<p>Date: {DateTime.UtcNow:yyyy-MM-dd} | Customer: {order.CustomerName}</p>
<table>
<thead><tr><th>Item</th><th>Qty</th><th>Unit Price</th><th>Subtotal</th></tr></thead>
<tbody>
{string.Join("", order.Items.Select(i =>
$"<tr><td>{i.Name}</td><td>{i.Quantity}</td>" +
$"<td>${i.UnitPrice:F2}</td><td>${i.Quantity * i.UnitPrice:F2}</td></tr>"))}
</tbody>
<tfoot>
<tr><td colspan="3">Total</td><td>${order.Items.Sum(i => i.Quantity * i.UnitPrice):F2}</td></tr>
</tfoot>
</table>
</body>
</html>
""";
var pdf = _renderer.RenderHtmlAsPdf(html);
return File(pdf.BinaryData, "application/pdf", $"invoice-{orderId}.pdf");
}
}
Imports IronPdf
Imports Microsoft.AspNetCore.Mvc
Public Class DocumentController
Inherits Controller
Private ReadOnly _renderer As ChromePdfRenderer
Public Sub New(renderer As ChromePdfRenderer)
_renderer = renderer
End Sub
<HttpGet("invoice/{orderId:int}")>
Public Function GetInvoice(orderId As Integer) As IActionResult
' In a real application, fetch this from your database or order service.
Dim order = GetOrderData(orderId)
Dim html As String = $"
<!DOCTYPE html>
<html lang=""en"">
<head>
<meta charset=""utf-8"">
<style>
body {{font-family: Arial, sans-serif; margin: 40px; color: #333;}}
h1 {{color: #1a56db;}}
table {{width: 100%; border-collapse: collapse; margin-top: 24px;}}
th, td {{padding: 10px 14px; border: 1px solid #d1d5db; text-align: left;}}
th {{background: #f3f4f6;}}
tfoot td {{font-weight: bold;}}
</style>
</head>
<body>
<h1>Invoice #{order.InvoiceNumber}</h1>
<p>Date: {DateTime.UtcNow:yyyy-MM-dd} | Customer: {order.CustomerName}</p>
<table>
<thead><tr><th>Item</th><th>Qty</th><th>Unit Price</th><th>Subtotal</th></tr></thead>
<tbody>
{String.Join("", order.Items.Select(Function(i)
$"<tr><td>{i.Name}</td><td>{i.Quantity}</td>" +
$"<td>${i.UnitPrice:F2}</td><td>${i.Quantity * i.UnitPrice:F2}</td></tr>"))}
</tbody>
<tfoot>
<tr><td colspan=""3"">Total</td><td>${order.Items.Sum(Function(i) i.Quantity * i.UnitPrice):F2}</td></tr>
</tfoot>
</table>
</body>
</html>
"
Dim pdf = _renderer.RenderHtmlAsPdf(html)
Return File(pdf.BinaryData, "application/pdf", $"invoice-{orderId}.pdf")
End Function
End Class
RenderHtmlAsPdf, Google Chrome'u güçlendiren aynı Chromium motorunu kullanarak tam HTML dokümanını işler -- CSS grid, Flexbox, web yazı tipleri, hatta satır içi SVG. Dönen PdfDocument, BinaryData (bir byte[]) ve Stream (bir MemoryStream) sağlar. BinaryData'yi File() ile "application/pdf" ve bir dosya adı ile geçirerek bir tarayıcı indirmesini tetikler.
Piksel mükemmelliğinde sadakat gerektiren düzenler için, duyarlı CSS, özel yazı tipleri ve JavaScript render işlemi üzerine bilgi veren HTML'den PDF'ye render kılavuzuna bakın.
Oluşturulan Fatura PDF'si Nasıl Görünür?

Bir PDF'yi İndirme Diyalogu Olmadan Doğrudan Tarayıcıya Nasıl Aktarırsınız?
Bir PDF'yi satır içi olarak sunmak -- tarayıcının yerleşik görüntüleyicisinde açılması yerine indirilmesi -- iki küçük değişiklik gerektirir: Content-Disposition değerini inline olarak ayarlayın ve File() çağrısından dosya adını çıkarın.
[HttpPost("report/preview")]
public async Task<IActionResult> PreviewReport([FromBody] ReportRequest request)
{
string html = BuildReportHtml(request);
var pdfDocument = await _renderer.RenderHtmlAsPdfAsync(html);
// "inline" tells the browser to display rather than download.
Response.Headers["Content-Disposition"] = "inline; filename=report.pdf";
return new FileContentResult(pdfDocument.BinaryData, "application/pdf");
}
[HttpPost("report/preview")]
public async Task<IActionResult> PreviewReport([FromBody] ReportRequest request)
{
string html = BuildReportHtml(request);
var pdfDocument = await _renderer.RenderHtmlAsPdfAsync(html);
// "inline" tells the browser to display rather than download.
Response.Headers["Content-Disposition"] = "inline; filename=report.pdf";
return new FileContentResult(pdfDocument.BinaryData, "application/pdf");
}
Imports Microsoft.AspNetCore.Mvc
<HttpPost("report/preview")>
Public Async Function PreviewReport(<FromBody> request As ReportRequest) As Task(Of IActionResult)
Dim html As String = BuildReportHtml(request)
Dim pdfDocument = Await _renderer.RenderHtmlAsPdfAsync(html)
' "inline" tells the browser to display rather than download.
Response.Headers("Content-Disposition") = "inline; filename=report.pdf"
Return New FileContentResult(pdfDocument.BinaryData, "application/pdf")
End Function
Asenkron aşırı yük RenderHtmlAsPdfAsync kullanılması ASP.NET Core denetleyicileri için önerilir çünkü Chromium render yaparken thread havuzu thread'ini serbest bırakır ve sunucuyu eşzamanlı yük altında tepki verebilir halde tutar.
Bellek Tabanlı PDF Oluşturma Nasıl Çalışır?

pdfDocument.BinaryData bayt dizisi tamamen yönetilen bellekte yaşar. Ara yol dosyası yer almaz. Content-Disposition başlığı PDF'nin satır içi görüntülenip görüntülenmeyeceğini veya indirme olarak sunulup sunulmayacağını kontrol eder -- bu, HTTP spesifikasyonu tarafından tanımlanan bir tarayıcı davranışıdır. Azure Blob Storage için yayılmasına dahil incelemek üzerine, Hafıza Akışı yaklaşımına daha derinlemesine bakmak için PDF hafıza akışı belgelerini ziyaret edin.
Entity Framework Core Sorgu Sonuçlarından PDF'ler Nasıl Oluşturulur?
Çoğu iş uygulaması, verileri çağrı zamanında oluşturmak yerine bir veritabanından alır. Aşağıdaki desen, Entity Framework Core'i sorgular, bir HTML tablosu oluşturur ve bir PDF döndürür - hepsi tek bir denetleyici eylemi içinde.
[HttpGet("report/monthly")]
public async Task<IActionResult> MonthlyReport(int year, int month)
{
// Pull aggregated transaction data from EF Core.
var rows = await _dbContext.Transactions
.Where(t => t.Date.Year == year && t.Date.Month == month)
.GroupBy(t => t.Category)
.Select(g => new { Category = g.Key, Count = g.Count(), Total = g.Sum(t => t.Amount) })
.OrderByDescending(g => g.Total)
.ToListAsync();
string tableRows = string.Join("", rows.Select(r =>
$"<tr><td>{r.Category}</td><td>{r.Count}</td><td>${r.Total:F2}</td></tr>"));
string html = $"""
<html><body style="font-family:Arial,sans-serif;padding:32px">
<h1>Monthly Report -- {month:D2}/{year}</h1>
<table style="width:100%;border-collapse:collapse">
<thead>
<tr style="background:#e5e7eb">
<th style="padding:8px;border:1px solid #d1d5db">Category</th>
<th style="padding:8px;border:1px solid #d1d5db">Transactions</th>
<th style="padding:8px;border:1px solid #d1d5db">Total</th>
</tr>
</thead>
<tbody>{tableRows}</tbody>
</table>
</body></html>
""";
var pdf = _renderer.RenderHtmlAsPdf(html);
pdf.MetaData.Title = $"Monthly Report {month:D2}/{year}";
pdf.MetaData.Author = "Reporting System";
return File(pdf.BinaryData, "application/pdf", $"report-{year}-{month:D2}.pdf");
}
[HttpGet("report/monthly")]
public async Task<IActionResult> MonthlyReport(int year, int month)
{
// Pull aggregated transaction data from EF Core.
var rows = await _dbContext.Transactions
.Where(t => t.Date.Year == year && t.Date.Month == month)
.GroupBy(t => t.Category)
.Select(g => new { Category = g.Key, Count = g.Count(), Total = g.Sum(t => t.Amount) })
.OrderByDescending(g => g.Total)
.ToListAsync();
string tableRows = string.Join("", rows.Select(r =>
$"<tr><td>{r.Category}</td><td>{r.Count}</td><td>${r.Total:F2}</td></tr>"));
string html = $"""
<html><body style="font-family:Arial,sans-serif;padding:32px">
<h1>Monthly Report -- {month:D2}/{year}</h1>
<table style="width:100%;border-collapse:collapse">
<thead>
<tr style="background:#e5e7eb">
<th style="padding:8px;border:1px solid #d1d5db">Category</th>
<th style="padding:8px;border:1px solid #d1d5db">Transactions</th>
<th style="padding:8px;border:1px solid #d1d5db">Total</th>
</tr>
</thead>
<tbody>{tableRows}</tbody>
</table>
</body></html>
""";
var pdf = _renderer.RenderHtmlAsPdf(html);
pdf.MetaData.Title = $"Monthly Report {month:D2}/{year}";
pdf.MetaData.Author = "Reporting System";
return File(pdf.BinaryData, "application/pdf", $"report-{year}-{month:D2}.pdf");
}
Imports Microsoft.AspNetCore.Mvc
Imports System.Threading.Tasks
Imports System.Linq
<HttpGet("report/monthly")>
Public Async Function MonthlyReport(year As Integer, month As Integer) As Task(Of IActionResult)
' Pull aggregated transaction data from EF Core.
Dim rows = Await _dbContext.Transactions _
.Where(Function(t) t.Date.Year = year AndAlso t.Date.Month = month) _
.GroupBy(Function(t) t.Category) _
.Select(Function(g) New With {Key .Category = g.Key, Key .Count = g.Count(), Key .Total = g.Sum(Function(t) t.Amount)}) _
.OrderByDescending(Function(g) g.Total) _
.ToListAsync()
Dim tableRows As String = String.Join("", rows.Select(Function(r) $"<tr><td>{r.Category}</td><td>{r.Count}</td><td>${r.Total:F2}</td></tr>"))
Dim html As String = $"
<html><body style='font-family:Arial,sans-serif;padding:32px'>
<h1>Monthly Report -- {month:D2}/{year}</h1>
<table style='width:100%;border-collapse:collapse'>
<thead>
<tr style='background:#e5e7eb'>
<th style='padding:8px;border:1px solid #d1d5db'>Category</th>
<th style='padding:8px;border:1px solid #d1d5db'>Transactions</th>
<th style='padding:8px;border:1px solid #d1d5db'>Total</th>
</tr>
</thead>
<tbody>{tableRows}</tbody>
</table>
</body></html>
"
Dim pdf = _renderer.RenderHtmlAsPdf(html)
pdf.MetaData.Title = $"Monthly Report {month:D2}/{year}"
pdf.MetaData.Author = "Reporting System"
Return File(pdf.BinaryData, "application/pdf", $"report-{year}-{month:D2}.pdf")
End Function
pdf.MetaData.Title ve pdf.MetaData.Author ayarlamak, bu bilgiyi PDF'nin doküman özelliklerine gömer, ki bu uyumluluk takibi ve doküman yönetim sistemleri için kullanışlıdır. Daha karmaşık rapor düzenleri için, CSS yazdırma stillerini, açık sayfa kırılmaları ve gömülü grafik görüntüleri seçeneğini düşünebilirsiniz.
Oluşturulan PDF'lere Başlık, Altbilgi ve Güvenlik Nasıl Uygulanır?
Üretim belgelerinde genellikle belge başlığı ile çalışan başlıklar, sayfa numarası altbilgileri ve yetkisiz baskı veya kopyalamayı önleyebilecek erişim kontrolleri gerekir. IronPDF'nin ChromePdfRenderOptions tüm bu gereksinimleri kapsar.
[HttpPost("document/secured")]
public async Task<IActionResult> GenerateSecuredDocument([FromBody] SecuredDocRequest request)
{
var renderOptions = new ChromePdfRenderOptions
{
PaperSize = PdfPaperSize.A4,
MarginTop = 45,
MarginBottom = 45,
MarginLeft = 25,
MarginRight = 25,
EnableJavaScript = true,
WaitFor = new WaitFor { RenderDelay = 500 }
};
renderOptions.TextHeader = new TextHeaderFooter
{
CenterText = request.DocumentTitle,
DrawDividerLine = true,
FontSize = 11
};
renderOptions.TextFooter = new TextHeaderFooter
{
LeftText = "{date} {time}",
RightText = "Page {page} of {total-pages}",
FontSize = 9
};
_renderer.RenderingOptions = renderOptions;
var pdf = await _renderer.RenderHtmlAsPdfAsync(request.HtmlContent);
if (request.RequirePassword)
{
pdf.SecuritySettings.OwnerPassword = request.OwnerPassword;
pdf.SecuritySettings.UserPassword = request.UserPassword;
pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.NoPrint;
pdf.SecuritySettings.AllowUserCopyPasteContent = false;
}
return File(pdf.BinaryData, "application/pdf", $"{request.FileName}.pdf");
}
[HttpPost("document/secured")]
public async Task<IActionResult> GenerateSecuredDocument([FromBody] SecuredDocRequest request)
{
var renderOptions = new ChromePdfRenderOptions
{
PaperSize = PdfPaperSize.A4,
MarginTop = 45,
MarginBottom = 45,
MarginLeft = 25,
MarginRight = 25,
EnableJavaScript = true,
WaitFor = new WaitFor { RenderDelay = 500 }
};
renderOptions.TextHeader = new TextHeaderFooter
{
CenterText = request.DocumentTitle,
DrawDividerLine = true,
FontSize = 11
};
renderOptions.TextFooter = new TextHeaderFooter
{
LeftText = "{date} {time}",
RightText = "Page {page} of {total-pages}",
FontSize = 9
};
_renderer.RenderingOptions = renderOptions;
var pdf = await _renderer.RenderHtmlAsPdfAsync(request.HtmlContent);
if (request.RequirePassword)
{
pdf.SecuritySettings.OwnerPassword = request.OwnerPassword;
pdf.SecuritySettings.UserPassword = request.UserPassword;
pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.NoPrint;
pdf.SecuritySettings.AllowUserCopyPasteContent = false;
}
return File(pdf.BinaryData, "application/pdf", $"{request.FileName}.pdf");
}
Imports System.Threading.Tasks
Imports Microsoft.AspNetCore.Mvc
<HttpPost("document/secured")>
Public Async Function GenerateSecuredDocument(<FromBody> request As SecuredDocRequest) As Task(Of IActionResult)
Dim renderOptions As New ChromePdfRenderOptions With {
.PaperSize = PdfPaperSize.A4,
.MarginTop = 45,
.MarginBottom = 45,
.MarginLeft = 25,
.MarginRight = 25,
.EnableJavaScript = True,
.WaitFor = New WaitFor With {.RenderDelay = 500}
}
renderOptions.TextHeader = New TextHeaderFooter With {
.CenterText = request.DocumentTitle,
.DrawDividerLine = True,
.FontSize = 11
}
renderOptions.TextFooter = New TextHeaderFooter With {
.LeftText = "{date} {time}",
.RightText = "Page {page} of {total-pages}",
.FontSize = 9
}
_renderer.RenderingOptions = renderOptions
Dim pdf = Await _renderer.RenderHtmlAsPdfAsync(request.HtmlContent)
If request.RequirePassword Then
pdf.SecuritySettings.OwnerPassword = request.OwnerPassword
pdf.SecuritySettings.UserPassword = request.UserPassword
pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.NoPrint
pdf.SecuritySettings.AllowUserCopyPasteContent = False
End If
Return File(pdf.BinaryData, "application/pdf", $"{request.FileName}.pdf")
End Function
WaitFor.RenderDelay ayarı, özellikle HTML'niz Chart.js veya ApexCharts gibi asenkron olarak çizimlerini tamamlayan grafik kütüphanelerini içerdiğinde faydalıdır. 300-500 ms'lik bir gecikme ayarlanması, Chromium'un son render edilmiş durumu yakaladığını garanti eder. Arşiv standartlarını karşılamak gereken belgeler için, yukarıdaki yaklaşımı PDF/A uyumluluğu ve dijital imzalar ile birleştirin.
Alt bilgideki {page} ve {total-pages} jetonları, render zamanında IronPDF tarafından otomatik olarak çözülür. Ek başlık ve alt bilgisi seçenekleri, logo yerleşimi için HTML tabanlı başlıklar ve bölüm başına geçersiz kılma yeteneklerini içerir.
Hangi Render Seçenekleri Mevcuttur?
Aşağıdaki tablo, anlık oluşturma için en kullanışlı ChromePdfRenderOptions özelliklerini özetlemektedir:
| Özellik | Tür | Amaç |
|---|---|---|
| PaperSize | PdfPaperSize | Sayfa boyutlarını ayarlar (A4, Mektup, Yasal, özel) |
| MarginTop / MarginBottom | int (mm) | Baskı alanı boşluk kontrolü |
| EnableJavaScript | bool | JavaScript yürütümüne çekilmeden önce izin verir |
| WaitFor.RenderDelay | int (ms) | Asenkron işleme için yakalamayı geciktirir |
| TextHeader / TextFooter | TextHeaderFooter | Çalışan sayfa başlıkları ve altbilgileri |
| HtmlHeader / HtmlFooter | HtmlHeaderFooter | Görüntülerle HTML formatlı başlıklar/altbilgiler |
| GrayScale | bool | Monokrom PDF çıktılar |
| FitToPaperWidth | bool | Geniş içeriği sayfaya sığacak şekilde ölçekler |
Yüksek Hacimli PDF Oluşturma İçin Performans En İyi Uygulamaları Nelerdir?
Tek bir sunucu yüzlerce eş zamanlı PDF isteği ele aldığında, birkaç mimari karar tahmin ve gecikme süresi üzerinde olağanüstü etkiler yaratır.
Singleton renderer kaydı. Kurulum bölümünde gösterildiği gibi, ChromePdfRenderer'yi DI konteynerde singleton olarak kaydetmek, talep başına yeni bir Chromium alt sürecinin başlatılmasının maliyetini önler. Microsoft'un ASP.NET Core performans kılavuzuna göre, nesne tahsislerinin en aza indirilmesi ve pahalı kaynakların yeniden kullanılması mevcut en etkili optimizasyonlardır.
Her zaman asenkron kullanın. RenderHtmlAsPdfAsync bir Task<PdfDocument> döndürür ve Chromium çalışırken denetleyici thread'ini askıya alır. Bu, iş parçacığı havuzunu diğer gelen isteklerle paralel olarak ele almaya serbest bırakır, bu yüzden async belgelendirmesi, web sunucuları için bu overload'u önerir. Eşzamanlı overload, yalnızca iş parçacığı bloklamanın kabul edilebilir olduğu konsol araçları veya arka plan hizmetleri için uygundur.
Doğrudan aktarım yapın, mümkünse ara diziyi atlayın. Büyük PDF dosyaları için .Stream, tam bayt dizisi materyalize edilmeden yanıt gövdesine doğrudan yazılabilir:
[HttpGet("document/large")]
public IActionResult StreamLargeDocument(int documentId)
{
string html = BuildLargeDocumentHtml(documentId);
var pdf = _renderer.RenderHtmlAsPdf(html);
// Stream.Position is already at 0; no seek needed.
return File(pdf.Stream, "application/pdf", $"document-{documentId}.pdf");
}
[HttpGet("document/large")]
public IActionResult StreamLargeDocument(int documentId)
{
string html = BuildLargeDocumentHtml(documentId);
var pdf = _renderer.RenderHtmlAsPdf(html);
// Stream.Position is already at 0; no seek needed.
return File(pdf.Stream, "application/pdf", $"document-{documentId}.pdf");
}
Imports Microsoft.AspNetCore.Mvc
<HttpGet("document/large")>
Public Function StreamLargeDocument(documentId As Integer) As IActionResult
Dim html As String = BuildLargeDocumentHtml(documentId)
Dim pdf = _renderer.RenderHtmlAsPdf(html)
' Stream.Position is already at 0; no seek needed.
Return File(pdf.Stream, "application/pdf", $"document-{documentId}.pdf")
End Function
Kullanımdan sonra atıl. PdfDocument, IDisposable uygular. Bir using ifadesi içinde sarmak, temel bellek tamponunu hemen serbest bırakır, bu durum art arda birçok büyük PDF oluştururken önemlidir:
using var pdf = _renderer.RenderHtmlAsPdf(html);
byte[] data = pdf.BinaryData;
// pdf is disposed here; data is safely copied to the local array.
return File(data, "application/pdf", "output.pdf");
using var pdf = _renderer.RenderHtmlAsPdf(html);
byte[] data = pdf.BinaryData;
// pdf is disposed here; data is safely copied to the local array.
return File(data, "application/pdf", "output.pdf");
Imports System.IO
Using pdf = _renderer.RenderHtmlAsPdf(html)
Dim data As Byte() = pdf.BinaryData
' pdf is disposed here; data is safely copied to the local array.
Return File(data, "application/pdf", "output.pdf")
End Using
Azure, AWS, Docker ve Linux ortamlarını kapsayan bulut dağıtım rehberi için, ortam özel yapılandırma notları sunan IronPDF belgelerinde bulunabilir. Başlatma sonrası ilk render yavaşsa, ısıtma ve önbellekleme kılavuzu'na bakın; ilk kullanıcı isteği gelmeden önce render yapıcıyı önceden başlatma stratejileri için.
Oluşturulan PDF'ye Nasıl Filigran Eklersiniz?
Oluşturulan belgenin her sayfasına metin veya görüntü filigranı eklenebilir:
[HttpGet("document/draft/{id:int}")]
public IActionResult GetDraftDocument(int id)
{
string html = BuildDocumentHtml(id);
var pdf = _renderer.RenderHtmlAsPdf(html);
// Stamp "DRAFT" diagonally across every page.
pdf.ApplyWatermark(
"<h1 style='color:rgba(200,0,0,0.25);transform:rotate(-45deg)'>DRAFT</h1>",
rotation: 45,
opacity: 30
);
return File(pdf.BinaryData, "application/pdf", $"draft-{id}.pdf");
}
[HttpGet("document/draft/{id:int}")]
public IActionResult GetDraftDocument(int id)
{
string html = BuildDocumentHtml(id);
var pdf = _renderer.RenderHtmlAsPdf(html);
// Stamp "DRAFT" diagonally across every page.
pdf.ApplyWatermark(
"<h1 style='color:rgba(200,0,0,0.25);transform:rotate(-45deg)'>DRAFT</h1>",
rotation: 45,
opacity: 30
);
return File(pdf.BinaryData, "application/pdf", $"draft-{id}.pdf");
}
<AttributeUsage(AttributeTargets.Method, Inherited:=True, AllowMultiple:=False)>
Public Class HttpGetAttribute
Inherits Attribute
Public Sub New(route As String)
End Sub
End Class
<HttpGet("document/draft/{id:int}")>
Public Function GetDraftDocument(id As Integer) As IActionResult
Dim html As String = BuildDocumentHtml(id)
Dim pdf = _renderer.RenderHtmlAsPdf(html)
' Stamp "DRAFT" diagonally across every page.
pdf.ApplyWatermark(
"<h1 style='color:rgba(200,0,0,0.25);transform:rotate(-45deg)'>DRAFT</h1>",
rotation:=45,
opacity:=30
)
Return File(pdf.BinaryData, "application/pdf", $"draft-{id}.pdf")
End Function
Resim filigranları ve sayfa başına kontrol dahil tam filigran yapılandırma seçenekleri için filigran belgelerine bakın.
Sonraki Adımlarınız Neler?
ASP.NET Core'da dinamik PDF oluşturma tutarlı bir deseni izler: HTML'inizi oluşturun, RenderHtmlAsPdf veya onun asenkron aşımını çağırın ve sonucu bir FileResult ile dönüş yapın. IronPDF, disk I/O gerektirmeksizin -- Chromium render işlemi, CSS uygulaması, JavaScript yürütmesi -- arasındaki her şeyi ele alır.
Buradan, uygulama gereksinimlerinize bağlı olarak keşfedebileceğiniz birkaç yön var. PDF'lerinizin birden fazla kaynak belgeyi birleştirmesi gerekiyorsa, birleştirme ve ayırma kılavuzu, mevcut PDF'leri taze oluşturulmuş sayfalarla birleştirmeyi kapsar. Kullanıcıların bir PDF içinde gömülü formları doldurup göndermesi gerekiyorsa, etkileşimli formlar belgeleri alan değerlerini nasıl oluşturup okuyacağını gösterir. Düzenlemeye tabi sektörler için, PDF/A uyumluluğu ve PDF/UA erişilebilirliği belgelerin arşiv ve erişilebilirlik standartlarını karşıladığını garanti eder.
IronPDF'i alternatiflerine karşı değerlendiriyorsanız, iText vs IronPDF karşılaştırması yan yana teknik bir analiz sunar. Üretime geçmeye hazır olduğunuzda, tüm özellikleri açmak ve öncelikli mühendislik desteğine erişim sağlamak için bir lisans satın alın. Tam API referansı bu kılavuzda tartışılan her sınıf ve yöntemi belgeler.
Uygulama sırasında sorular veya sorunlar için, mühendislik destek ekibi yardım için hazırdır. Blazor Server veya MAUI hakkında platform özel notları için, her barındırma modeli için yapılandırma farklılıklarını kapsayan özel rehberler vardır.
Sıkça Sorulan Sorular
ASP.NET Core’da PDF'leri dinamik olarak nasıl oluşturabilirim?
ASP.NET Core'da, dosyaları diskte saklamadan PDF'leri dinamik olarak oluşturmak için IronPDF'i kullanabilirsiniz. Bu, PDF'leri doğrudan tarayıcılara akıtmanıza olanak tanır.
IronPDF'nin PDF oluşturma için hangi faydaları vardır?
IronPDF, sunucu tarafı depolama ihtiyacı olmadan anında PDF oluşturmayı garanti eden, .NET Core projelerinizde doğrudan dinamik PDF oluşturma imkanı sunan güçlü bir render motoru sağlar.
IronPDF fatura ve rapor oluşturmak için kullanılabilir mi?
Evet, IronPDF, ASP.NET Core uygulamalarında anında oluşturulan fatura, rapor ve sertifikalar gibi çeşitli belge türlerini oluşturmak için uygundur.
IronPDF kullanırken sunucu tarafı depolama gerekli mi?
Hayır, IronPDF, PDF’leri doğrudan tarayıcılara akıtmanıza izin verir, sunucu tarafı depolamaya ihtiyaç duymadan etkili ve hızlıdır.
Anında PDF oluşturmanın fayda sağlayabileceği uygulama türleri nelerdir?
Özellikle gerçek zamanlı belge oluşturmayı gerektiren çağdaş web uygulamaları, faturalama sistemleri ve raporlama araçları, IronPDF tarafından sağlanan anında PDF oluşturma işlevselliğinden büyük ölçüde faydalanabilir.
IronPDF .NET Core projelerini destekliyor mu?
Evet, IronPDF .NET Core projeleriyle tamamen uyumludur, geliştiricilere uygulamalarına PDF oluşturma yeteneklerini sorunsuz bir şekilde entegre etmelerini sağlar.

