ASP.NET Core: IronPDF ile Anlik PDF Oluşturma
ASP.NET Core'da HTML içeriğini şık PDF'lere dönüştürerek ve doğrudan tarayıcıya akış yaparak profesyonel PDF belgelerini dinamik olarak oluşturun -- disk depolaması gerekmeden, yönetilecek geçici dosya olmadan.
Modern web uygulamaları ASP.NET Core'da inşa edilirken, talep üzerine PDF belgeleri üretme yeteneği tekrar eden bir gerekliliktir. Faturaların ödemesi onaylandığında hemen indirilmesi gerekir. Uyumluluk raporları, bir denetçi 'Dışa Aktar' tıklamasıyla anında görünmelidir. Sertifikalar, kullanıcı bir şeylerin ters gidip gitmediğini merak etmeden önce hazır olmalıdır. IronPDF, tüm bu senaryoları askıya alma gerektirmeyen Chromium tabanlı PDF kütüphanesi üzerinden HTML -- CSS, JavaScript ve web yazı tipleri dahil -- gibi piksel düşüklüğü PDF çıktılarına dönüştüren özel olarak ele alır.
Bu kılavuz, kütüphaneyi yükleme, HTML dizelerinden faturalar oluşturma, Entity Framework verilerinden raporlar güncelleme, sayfa başlıkları uygulama ve yüksek trafik ASP.NET uygulamalarının iyi performans göstermesini sağlayan en iyi uygulamaların benimsenmesi de dahil bilmeniz gereken her şeyi kapsar.
Uçuşta PDF Oluşturma Ne Anlama Gelir?
"Uçuşta" belge HTTP isteği anında bellekte yapılandırılır ve doğrudan istekte bulunan kişiye gönderilir anlamına gelir. Dosya sistemine hiçbir PDF yazılmaz, arka plan görevi kuyruğa alınmaz ve istekler arasında sonucu saklayan bir önbellek yoktur.
Bu yaklaşım birkaç sebep için önemlidir. İlk olarak, bulut dağıtım hedefleri -- Azure App Service, AWS Lambda, Docker konteynerleri -- genellikle yerel dosya sisteminin geçici veya yalnızca okunabilir olduğu ortamlarda çalışır. PDF'yi bir geçici klasöre kadar oluşturmak ve ardından geri okumak bu ortamlarda hassastır. İkincisi, disk yazmalarını önlemek saldırı yüzeyini azaltır: sonraki istek yanlış kullanıcıya hizmet edebilecek kalıcı bir dosya yoktur. Üçüncüsü, yalnızca bellek temelli üretim genellikle daha hızlıdır çünkü kritik yoldaki iki G/Ç işlemini (yazma ve okuma) ortadan kaldırır.
IronPDF'nin ChromePdfRenderer her oluşturulan dökümanda .BinaryData özelliği ve .Stream özelliği sunar. Her ikisi birden ASP.NET Core FileResult'a doğrudan iletilerek, akışın pratikte tek bir satırda yapılmasına olanak tanır.
IronPDF ASP.NET Core Projeye Nasıl Yüklenir?
NuGet paketi ya Paket Yönetici Konsolu ya da .NET CLI aracılığıyla ekleyin:
Install-Package IronPdf
dotnet add package IronPdf
Install-Package IronPdf
dotnet add package IronPdf
Paket kurulduktan sonra, uygulama başlatıldığında lisans anahtarınızı ayarlayın -- genellikle Program.cs'de, ilk renderer oluşturulmadan önce:
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 bir singleton olarak kaydetmek önemlidir. Render ilk kullanıldığında iç bir Chromium alt süreci başlatır. Her istek için yeni bir örnek oluşturursanız, bu başlangıç maliyetini her çağrıda ödersiniz ve bu da yük altında yüzlerce milisaniye gecikme ekler. Bir singleton örnek thread-safe dir ve ek bir yapılandırma gerektirmeden eşzamanlı render isteklerini işler.
Özel beslemeler için NuGet.config ayarlarını da içeren kurulum seçeneklerine daha geniş bir bakış için, kurulum genel bakışına gidin.
HTML Dizesinden Fatura PDF'si Nasıl Oluşturulur?
En yaygın olanı, içeriğin her istek üzerine değiştiği ancak düzenin sabit kaldığı faturalardır, makbuzlar, sipariş onayları gibi işlemsel belgeler oluşturmaktır.
Desen şudur: iç içe veri ile bir HTML dizgisi oluşturun, bunu RenderHtmlAsPdf'a iletin ve ikili sonucu bir dosya indirmesi olarak geri 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, CSS grid, Flexbox, web yazı tipleri ve hatta iç içe SVG gibi bütün HTML dökümanını işleyerek Google Chrome'un alt yapısı olan Chromium motorunu kullanır. Döndürülen PdfDocument, BinaryData (bir byte[]) ve Stream (bir MemoryStream) sunar. Bir dosya adı ve "application/pdf" ile BinaryData'i File()'a iletmek, bir tarayıcı indirmesini tetikler.
Pixel-perfect uyum gerektiren düzenler için, yanıt veren CSS, özel yazı tipleri ve JavaScript render işlemlerini kapsayan HTML to PDF rendere kılavuzunu inceleyin.
Oluşturulan Fatura PDF'si Nasıl Görünür?

İndirme Diyalogu Olmadan PDF'yi Doğrudan Tarayıcıya Nasıl Yayınlarsınız?
Bir PDF'yi tarayıcının yerleşik görüntüleyicisinde açmak (indirime yerine) iki küçük değişiklik gerektirir: Content-Disposition'yi inline olarak ayarlayın ve File() çağrısından dosya adını çıkartı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ükleme RenderHtmlAsPdfAsync, ASP.NET Core denetleyicileri için önerilir çünkü Chromium işlenirken iş parçacığı havuzunu serbest bırakır, sunucu cevabını eş zamanlı yük altında tutar.
Bellek Tabanlı PDF Oluşturma Nasıl Çalışır?

pdfDocument.BinaryData byte dizisi tamamen yönetilen bellek içinde bulunur. Ara bir dosya yolu dahil değildir. Content-Disposition başlığı PDF'nin gösterilip gösterilmeyeceğini veya bir indirme olarak sunulup sunulmayacağını kontrol eder-- bir HTTP spesifikasyonuyla tanımlanmış tarayıcı davranışı. Azure Blob Depolama'ya akış dahil olmak üzere MemoryStream yaklaşımına daha derinlemesine bir bakış için, PDF bellek akışı dökümantasyonunu ziyaret edin.
Entity Framework Core Sorgu Sonuçlarından PDF Nasıl Üretilir?
Çoğu ticari uygulama, veritabanından rapor verilerini çekmek yerine çağrı zamanında oluşturmaktadır. Aşağıdaki desen, Entity Framework Core sorgular, bir HTML tablo oluşturur ve tek bir denetleyici eylemi içinde bir PDF döndürür.
[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 ayarlanması, bu bilgiyi PDF'nin döküman özelliklerine gömer, bu uyumluluk izleme ve döküman yönetim sistemleri için faydalıdır. Daha sofistike rapor düzenleri için CSS baskı stillerini, açık sayfa kırılmalarını ve gömülü grafik resimlerini düşünün.
Oluşturulan PDF'lere Başlık, Alt Bilgi ve Güvenlik Nasıl Uygulanır?
Üretim belgeleri genellikle belge başlığı ile çalışan başlıklar, sayfa numarası alt bilgileri ve yetkisiz yazdırmayı veya kopyalamayı önleyen erişim kontrolleri gerektirir. IronPDF'nin ChromePdfRenderOptions tüm bu gereksinimleri karşılar.
[HttpPost("document/secured")]
public async Task<IActionResult> GenerateSecuredDocument([FromBody] SecuredDocRequest request)
{
var renderOptions = new ChromePdfRenderOptions
{
Kağıt Boyutu = PdfKağıt Boyutu.A4,
MarginTop = 45,
MarginBottom = 45,
MarginLeft = 25,
MarginRight = 25,
JavaScript'i Etkinleştir = true,
WaitFor = new WaitFor { RenderDelay = 500 }
};
renderOptions.TextHeader = new MetinBaşıAltı
{
CenterText = request.DocumentTitle,
DrawDividerLine = true,
FontSize = 11
};
renderOptions.TextFooter = new MetinBaşıAltı
{
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
{
Kağıt Boyutu = PdfKağıt Boyutu.A4,
MarginTop = 45,
MarginBottom = 45,
MarginLeft = 25,
MarginRight = 25,
JavaScript'i Etkinleştir = true,
WaitFor = new WaitFor { RenderDelay = 500 }
};
renderOptions.TextHeader = new MetinBaşıAltı
{
CenterText = request.DocumentTitle,
DrawDividerLine = true,
FontSize = 11
};
renderOptions.TextFooter = new MetinBaşıAltı
{
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 Microsoft.AspNetCore.Mvc
<HttpPost("document/secured")>
Public Async Function GenerateSecuredDocument(<FromBody> request As SecuredDocRequest) As Task(Of IActionResult)
Dim renderOptions As New ChromePdfRenderOptions With {
.KağıtBoyutu = PdfKağıtBoyutu.A4,
.MarginTop = 45,
.MarginBottom = 45,
.MarginLeft = 25,
.MarginRight = 25,
.JavaScript'iEtkinleştir = True,
.WaitFor = New WaitFor With {.RenderDelay = 500}
}
renderOptions.TextHeader = New MetinBaşıAltı With {
.CenterText = request.DocumentTitle,
.DrawDividerLine = True,
.FontSize = 11
}
renderOptions.TextFooter = New MetinBaşıAltı 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ı, HTML'niz Chart.js veya ApexCharts gibi asenkron çizim yapan grafik kütüphanelerini içerdiğinde özellikle kullanışlıdır. 300-500 ms'lik bir gecikme ayarlamak, Chromium'un son render durumunu yakalamasını sağlar. Arşivleme standartlarına uyması gereken belgeler için yukarıdaki yöntemi PDF/A uyumluluğu ve dijital imzalar ile birleştirin.
{page} ve {total-pages} jetonları, alt bilgi metninde IronPDF tarafından otomatik olarak çözülür. Ek başlık ve alt bilgi seçenekleri, logo yerleştirme ve bölüm başına geçersiz kılma kapasiteleri için HTML tabanlı başlıklar içerir.
Hangi Rendering Seçenekleri Mevcuttur?
Aşağıdaki tablo, hızlı oluşturma için en kullanışlı ChromePdfRenderOptions özelliklerini özetler:
| Özellik | Tür | Amaç |
|---|---|---|
| Kağıt Boyutu | PdfKağıt Boyutu | Sayfa boyutlarını ayarlar (A4, Mektup, Hukuk, özelleştirilmiş) |
| MarginTop / MarginBottom | int (mm) | Yazdırılabilir alan boşluğunu kontrol eder |
| JavaScript'i Etkinleştir | bool | JS yürütülmesine izin verir |
| WaitFor.RenderDelay | int (ms) | Asenkron render için yakalamayı geciktirir |
| Metin Başlığı / Metin Altı | MetinBaşıAltı | Sayfa başlıkları ve altlıkları çalıştırma |
| HtmlHeader / HtmlFooter | HtmlHeaderFooter | Görüntülerle HTML formatlı başlıklar/altlar |
| Gri Tonlama | bool | Monokrom PDF çıktısı verir |
| Kağıt Genişliğine Göre Sığdır | bool | Geniş içeriği sayfaya sığacak şekilde ölçekler |
Yüksek Hacimli PDF Üretimi için Performans En İyi Uygulamaları Nelerdir?
Tek bir sunucu yüzlerce eşzamanlı PDF isteği yönettiğinde, birkaç mimari karar, verimlilik ve gecikme üzerinde aşırı etkiye sahiptir.
Tek-örnek işleyici kaydı. Kurulum bölümünde gösterildiği gibi, ChromePdfRenderer'u DI konteynerinde bir tek-örnek olarak kaydetmek, her istek için yeni bir Chromium alt işlemi başlatmanın maliyetini ortadan kaldırır. Microsoft'un ASP.NET Core performans rehberine göre, nesne tahsislerini en aza indirmek ve pahalı kaynakları yeniden kullanmak mevcut en etkili optimizasyonlardandır.
Daima asenkron kullanın. RenderHtmlAsPdfAsync bir Task<PdfDocument> döndürür ve Chromium çalışırken denetleyici iş parçacığını askıya alır. Bu, iş parçacığı havuzunu diğer gelen istekleri aynı anda yönetmek için serbest bırakır çünkü async dökümantasyonu bu overload'u web sunucuları için önerir. Senkronize yük aşımı, yalnızca iş parçacığı engellemesinin kabul edilebilir olduğu konsol araçları veya arka plan hizmetleri için uygundur.
Doğrudan akış, mümkün olduğunda ara diziyi atlayın. Büyük PDF'ler için, .Stream yanıt gövdesine doğrudan yazılabilir, tam byte dizisi materyalize edilmeden:
[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 imha edin. PdfDocument IDisposable uygular. Bir using ifadesine sarmak, temel bellek tamponunu hızla serbest bırakır, bu arka arkaya birçok büyük PDF üretirken önemli hale gelir:
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 kılavuzu için, IronPDF dökümantasyonu ortam konkusyonlarına özgü yapılandırma notları sağlar. İlk başlangıçtan sonraki ilk render yavaşsa, ilk kullanıcı isteği gelmeden önce render'ı önceden başlatma stratejileri için ısınma ve önbellekleme kılavuzunu inceleyin.
Oluşturulan PDF'ye Nasıl Filigran Eklenir?
Oluşturulan belgenin her sayfasına akmadan önce bir metin veya resim 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
Tam filigran yapılandırma seçenekleri, resim filigranları ve sayfa başına kontrol dahil olmak üzere, filigran dökümantasyonuna bakın.
Sıradaki Adımlarınız Neler?
ASP.NET Core'da dinamik PDF oluşturma tutarlı bir deseni takip eder: HTML'nizi oluşturun, RenderHtmlAsPdf veya onun asenkron aşırı yüklemesini çağırın ve sonucu bir FileResult üzerinden geri döndürün. IronPDF her şeyi aradaki -- Krom render, CSS uygulama, JavaScript yürütme -- disk G/Ç gerektirmeden işler.
Buradan, uygulama gereksinimlerinize bağlı olarak birkaç yönü keşfedebilirsiniz. PDF'lerin çeşitli kaynak belgelerle birleştirilmesi gerekiyorsa, birleştirme ve ayırma kılavuzu mevcut PDF'leri yeni render edilmiş sayfalarla birleştirmeyi kapsar. Kullanıcıların PDF'ye gömülü formları doldurması ve göndermesi gerekiyorsa, etkileşimli formlar dökümantasyonu alan değerlerini nasıl oluşturup okuyacağını gösterir. Regüle edilmiş sektörler için, PDF/A uyumluluğu ve PDF/UA erişilebilirliği belgelerin arşivleme ve erişilebilirlik standartlarına uygun olduğundan emin olur.
IronPDF'yi 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 kilidini açmak ve öncelikli mühendislik desteğine erişmek için bir lisans satın almak üretime hazır demektir. Tam API referansı bu kılavuzda tartışılan her sınıfı ve yöntemi belgelendirir.
Uygulama sırasında sorular veya sorunlar için, mühendislik destek ekibi yardım etmeye hazırdır. Blazor Server veya MAUI'de platforma özgü notlar için, her ana bilgisayar modeli için yapılandırma farklılıklarını kapsayan kılavuzlar vardır.
Sıkça Sorulan Sorular
ASP.NET Core'da dinamik olarak PDF oluşturmayı nasıl gerçekleştirebilirim?
ASP.NET Core'da IronPDF kullanarak PDF'leri dinamik olarak oluşturabilir ve dosyaları disk üzerine kaydetmeden doğrudan tarayıcıya iletebilirsiniz.
PDF oluşturma için IronPDF'in faydaları nelerdir?
IronPDF, .NET Core projelerinizde doğrudan dinamik PDF oluşturmayı mümkün kılan güçlü bir işleme motoru sağlar. Böylece sunucu tarafında depolama gereksinimi olmadan anında PDF üretimi sağlanır.
IronPDF, faturalar ve raporlar gibi çeşitli belge türleri oluşturmak için uygun mu?
Evet, IronPDF, ASP.NET Core uygulamalarında anında oluşturulan faturalar, raporlar ve sertifikalar gibi çeşitli belgeler oluşturmak için uygundur.
IronPDF kullanırken sunucu tarafı depolama gerekli mi?
Hayır, IronPDF, PDF'lerinizi sunucu tarafı depolama gereksinimi olmadan doğrudan tarayıcılara iletmenizi sağlayarak etkili ve hızlı hale getirir.
Hangi tür uygulamalar anında PDF üretiminden fayda sağlar?
Özellikle faturalama sistemleri ve raporlama araçları gibi gerçek zamanlı belge oluşturmasını gerektiren modern web uygulamaları, IronPDF tarafından sağlanan anında PDF üretiminden büyük ölçüde yararlanabilir.
IronPDF, .NET Core projelerini destekliyor mu?
Evet, IronPDF tamamen .NET Core projeleriyle uyumludur ve geliştiriciler için PDF üretme yeteneklerini uygulamalarına sorunsuz bir şekilde entegre etmelerine olanak tanır.




