Altbilgi içeriğine atla
IRONPDF KULLANARAK

ASP.NET Core ve IronPDF ile Merkezi PDF Oluşturma Hizmeti Nasıl Kurulur

ASP.NET Core ve IronPDF kullanarak üretime hazır bir .NET PDF API inşa edin ve HTML-to-PDF dönüşümü, birleştirme, filigran ekleme ve dinamik şablon işleme için merkezi PDF üretim mantığı oluşturarak, uygulamalarınızda tutarlı belge oluşturmayı sağlayın.

Modern uygulamalarla çalışırken, .NET geliştiriciler sıklıkla merkezi bir PDF üretim hizmeti kurmak zorundadır. İster faturalar, raporlar, sertifikalar veya sözleşmeler üretiyor olun, özel bir .NET PDF API'ye sahip olmak PDF üretim iş akışınızı iyileştirir. Bu nasıl yardımcı olur? Masaüstü ve web uygulamalarınızda tutarlılık, sürdürülebilirlik ve ölçeklenebilirlik sağlar. Belge içeriğini, PDF sayfalarını ve PDF form alanlarını yönetmek basit hale gelir.

Bu eğitimde güçlü bir .NET PDF kutuphanesi olan ASP.NET Core ve IronPDF kullanarak üretime hazır bir PDF API nasıl inşa edileceğini öğreneceksiniz. RESTful uç noktaları oluşturacağız, HTML'den PDF üretecek belgeleri birleştirecek, filigranlar ekleyecek ve Web API'nizdeki çeşitli gerçek dünya PDF senaryolarını ele alacak.

Neden Özel Bir PDF API'si Oluşturmalısınız?

Mimari diyagram, istemci uygulamaların (web, masaüstü, mobil) HTML içeriği, URL'ler veya dinamik verileri bir PDF Denetleyici/Hizmet API katmanına göndererek PDF belgeleri çıktısı alındığını göstermektedir.

Koda dalmadan önce, özel bir PDF API oluşturmamanın neden mantıklı olduğunu anlayalım:

  • Merkezi Mantık: Tüm PDF oluşturma mantığı tek bir yerde yer alır, bu da bakım ve güncellemeleri kolaylaştırır.
  • Mikroservis Mimari: Farklı uygulamaların PDF yeteneklerine ihtiyaç duyduğu hizmet odaklı mimariler için mükemmeldir.
  • Performans Optimizasyonu: Büyük PDF'ler, birden fazla sayfa ve dinamik veriler için özel bir hizmet ölçeklendirmek ve optimize etmek için asinakron işlemler ve performans teknikleri kullanarak daha kolaydır.
  • Dil Bağımsız: Herhangi bir istemci uygulaması, programlama dilinden bağımsız olarak API'yi tüketebilir.
  • Tutarlı Çıktı: Kuruluşunuzdaki tüm PDF'lerin tutarlı düzen, biçimleme ve içerik sağlamasını sağlar.

Yapmaya hazır mısınız? IronPDF'in ücretsiz deneme sürümünü indirin ve bu öğretici boyunca .NET Framework projelerinizde programatik olarak PDF dosyaları oluşturmaya devam edin.

IronPDF'i Tam .NET PDF Kütüphanesi Yapan Nedir?

IronPDF for .NET anasayfasında, HTML'yi PDF'ye dönüştürmek için HTML işleme, dosya kaydetme ve NuGet yükleme komutu gibi özelliklerle C# kod örnekleri gösterilmektedir.

IronPDF, .NET geliştiricileri için rakipsiz bir PDF kütüphanesi olarak öne çıkar, Web API projelerinde PDF üretimini kolay ve güvenilir kılan kapsamlı bir özellik seti sunar. Chrome rendering motoru üzerine inşa edilmiştir, sadece birkaç satır kodda piksel mükemmelliğinde HTML-den-PDF'ye dönüşümler sağlar ve tüm stil, JavaScript yürütümü ve duyarlı düzenler korur.

IronPDF'i .NET PDF API geliştirimi için ideal kılan temel yetenekler:

PDF Belge API Projesi Nasıl Kurulum Yapılır?

Yeni bir ASP.NET Core Web API projesi oluşturarak ve gerekli paketleri yükleyerek başlayalım.

Ön Koşullar Nelerdir?

  • .NET 6.0 SDK veya üstü
  • Visual Studio 2022 veya Visual Studio Code
  • PDF REST API'nizi test etmek için Postman veya benzeri bir API testi aracı

Projeyi Nasıl Oluştururum?

Öncelikle, PDF üretim aracımızı oluşturacağımız projeyi yaratalım.

dotnet new webapi -n PdfApiService
cd PdfApiService
dotnet new webapi -n PdfApiService
cd PdfApiService
SHELL

IronPDF Nasıl Kurulur?

Ardından, IronPDF'i projenize NuGet üzerinden ekleyin:

dotnet add package IronPDF
dotnet add package IronPDF
SHELL

Veya, Visual Studio'da NuGet Paket Yöneticisi Konsolu kullanarak:

Install-Package IronPDF

platforma özgü paketler, Docker kurulumu, veya Linux yapılandırmaları gibi gelişmiş kurulum seçenekleri için, IronPDF kurulum belgelerine göz atın.

Hangi Proje Yapısını Kullanmalıyım?

İyi bir C# geliştirme, temiz ve iyi yapılandırılmış bir proje klasörü korumayı gerektirir. Örneğin:

Visual Studio Çözüm Gezgini, bir .NET PDF API Hizmeti projesinin Denetleyiciler, Modeller ve Hizmetler dizinleriyle klasör yapısını göstermektedir.

İlk PDF Uç Noktanızı Nasıl Oluşturursunuz?

HTML'i PDF formatına dönüştüren basit bir uç nokta oluşturalım. Öncelikle, hizmet arabirimini ve uygulamasını oluşturalım:

PDF Hizmetini Nasıl Oluştururum?

Önce, aşağıdakileri IPdfService.cs dosyanıza ekleyin:

public interface IPdfService
{
    byte[] GeneratePdfFromHtml(string htmlContent);
    byte[] GeneratePdfFromUrl(string url);
}
public interface IPdfService
{
    byte[] GeneratePdfFromHtml(string htmlContent);
    byte[] GeneratePdfFromUrl(string url);
}
Public Interface IPdfService
    Function GeneratePdfFromHtml(htmlContent As String) As Byte()
    Function GeneratePdfFromUrl(url As String) As Byte()
End Interface
$vbLabelText   $csharpLabel

PdfService.cs dosyasına bunu ekleyin:

using IronPdf;
public class PdfService : IPdfService
{
    private readonly ChromePdfRenderer _renderer;
    public PdfService()
    {
        _renderer = new ChromePdfRenderer();
        // Configure rendering options for optimal PDF generation in .NET
        _renderer.RenderingOptions.MarginTop = 20;
        _renderer.RenderingOptions.MarginBottom = 20;
        _renderer.RenderingOptions.PrintHtmlBackgrounds = true;
    }
    public byte[] GeneratePdfFromHtml(string htmlContent)
    {
        // Generate PDF from HTML using the .NET PDF API
        var pdf = _renderer.RenderHtmlAsPdf(htmlContent);
        return pdf.BinaryData;
    }
    public byte[] GeneratePdfFromUrl(string url)
    {
        // Convert URL to PDF in the REST API
        var pdf = _renderer.RenderUrlAsPdf(url);
        return pdf.BinaryData;
    }
}
using IronPdf;
public class PdfService : IPdfService
{
    private readonly ChromePdfRenderer _renderer;
    public PdfService()
    {
        _renderer = new ChromePdfRenderer();
        // Configure rendering options for optimal PDF generation in .NET
        _renderer.RenderingOptions.MarginTop = 20;
        _renderer.RenderingOptions.MarginBottom = 20;
        _renderer.RenderingOptions.PrintHtmlBackgrounds = true;
    }
    public byte[] GeneratePdfFromHtml(string htmlContent)
    {
        // Generate PDF from HTML using the .NET PDF API
        var pdf = _renderer.RenderHtmlAsPdf(htmlContent);
        return pdf.BinaryData;
    }
    public byte[] GeneratePdfFromUrl(string url)
    {
        // Convert URL to PDF in the REST API
        var pdf = _renderer.RenderUrlAsPdf(url);
        return pdf.BinaryData;
    }
}
Imports IronPdf

Public Class PdfService
    Implements IPdfService

    Private ReadOnly _renderer As ChromePdfRenderer

    Public Sub New()
        _renderer = New ChromePdfRenderer()
        ' Configure rendering options for optimal PDF generation in .NET
        _renderer.RenderingOptions.MarginTop = 20
        _renderer.RenderingOptions.MarginBottom = 20
        _renderer.RenderingOptions.PrintHtmlBackgrounds = True
    End Sub

    Public Function GeneratePdfFromHtml(htmlContent As String) As Byte()
        ' Generate PDF from HTML using the .NET PDF API
        Dim pdf = _renderer.RenderHtmlAsPdf(htmlContent)
        Return pdf.BinaryData
    End Function

    Public Function GeneratePdfFromUrl(url As String) As Byte()
        ' Convert URL to PDF in the REST API
        Dim pdf = _renderer.RenderUrlAsPdf(url)
        Return pdf.BinaryData
    End Function

End Class
$vbLabelText   $csharpLabel

PdfService, HTML'yi PDF'ye dönüştürmekten sorumludur. IronPDF'in ChromePdfRenderer'ini kullanarak, profesyonel sonuçlar için sayfa kenar boşlukları ve arka plan işleme gibi varsayılanları bu sınıf yapılandırır. İleri rendering yapılandırmaları için, IronPDF'in rendering seçeneklerini inceleyin.

Kontrolör ham HTML'yi ilettiğinde, hizmet bunu yüksek kaliteli bir PDF'ye render eder ve indirilebilecek bayt verileri döndürür. URL'den PDF'ye dönüşümü kullanarak doğrudan tüm web sayfalarını da PDF'lere dönüştürür.

Kontrolörü Nasıl Oluştururum?

Şimdi API'niz için kontrolörü oluşturun. Bu, HTML'den PDF dosyaları üreten ve PDF belgelerini indirmenize ve kaydetmenize olanak tanıyan bir uç nokta sağlar.

// Controllers/PdfController.cs
using Microsoft.AspNetCore.Mvc;
[ApiController]
[Route("api/[controller]")]
public class PdfController : ControllerBase
{
    private readonly IPdfService _pdfService;
    public PdfController(IPdfService pdfService)
    {
        _pdfService = pdfService;
    }
    [HttpPost("html-to-pdf")]
    public IActionResult ConvertHtmlToPdf([FromBody] HtmlRequest request)
    {
        try
        {
            var pdfBytes = _pdfService.GeneratePdfFromHtml(request.HtmlContent);
            // Return as downloadable file
            return File(pdfBytes, "application/pdf", "document.pdf");
        }
        catch (Exception ex)
        {
            return BadRequest($"Error generating PDF: {ex.Message}");
        }
    }
}
// Controllers/PdfController.cs
using Microsoft.AspNetCore.Mvc;
[ApiController]
[Route("api/[controller]")]
public class PdfController : ControllerBase
{
    private readonly IPdfService _pdfService;
    public PdfController(IPdfService pdfService)
    {
        _pdfService = pdfService;
    }
    [HttpPost("html-to-pdf")]
    public IActionResult ConvertHtmlToPdf([FromBody] HtmlRequest request)
    {
        try
        {
            var pdfBytes = _pdfService.GeneratePdfFromHtml(request.HtmlContent);
            // Return as downloadable file
            return File(pdfBytes, "application/pdf", "document.pdf");
        }
        catch (Exception ex)
        {
            return BadRequest($"Error generating PDF: {ex.Message}");
        }
    }
}
Imports Microsoft.AspNetCore.Mvc

<ApiController>
<Route("api/[controller]")>
Public Class PdfController
    Inherits ControllerBase

    Private ReadOnly _pdfService As IPdfService

    Public Sub New(pdfService As IPdfService)
        _pdfService = pdfService
    End Sub

    <HttpPost("html-to-pdf")>
    Public Function ConvertHtmlToPdf(<FromBody> request As HtmlRequest) As IActionResult
        Try
            Dim pdfBytes = _pdfService.GeneratePdfFromHtml(request.HtmlContent)
            ' Return as downloadable file
            Return File(pdfBytes, "application/pdf", "document.pdf")
        Catch ex As Exception
            Return BadRequest($"Error generating PDF: {ex.Message}")
        End Try
    End Function
End Class
$vbLabelText   $csharpLabel

Ardından, HtmlRequest.cs dosyasına bunu ekleyin:

// Models/HtmlRequest.cs
public class HtmlRequest
{
    public string HtmlContent { get; set; }
    public string FileName { get; set; } = "document.pdf";
}
// Models/HtmlRequest.cs
public class HtmlRequest
{
    public string HtmlContent { get; set; }
    public string FileName { get; set; } = "document.pdf";
}
' Models/HtmlRequest.vb
Public Class HtmlRequest
    Public Property HtmlContent As String
    Public Property FileName As String = "document.pdf"
End Class
$vbLabelText   $csharpLabel

Bu, HTML'yi indirilebilir bir PDF'ye dönüştüren bir API uç noktası kurar. api/pdf/html-to-pdf'a HTML gönderildiğinde, PdfController hizmete dönüşümü devreder.

Oluşturulduktan sonra, kontrolör PDF'yi indirilebilir bir dosya olarak geri döner. İstek, HTML ve isteğe bağlı bir dosya adı içeren HtmlRequest modelini kullanılır. Bu, istemciler için HTML'yi gönderip cilalı bir PDF almalarını kolaylaştırır.

Hizmetleri Nasıl Kaydederim?

Program.cs dosyanızı, PDF hizmetini kaydetmek için güncelleyin:

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
// Register PDF service
builder.Services.AddSingleton<IPdfService, PdfService>();
var app = builder.Build();
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}
app.UseHttpsRedirection();
app.MapControllers();
app.Run();
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
// Register PDF service
builder.Services.AddSingleton<IPdfService, PdfService>();
var app = builder.Build();
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}
app.UseHttpsRedirection();
app.MapControllers();
app.Run();
Imports Microsoft.AspNetCore.Builder
Imports Microsoft.Extensions.DependencyInjection

Dim builder = WebApplication.CreateBuilder(args)
builder.Services.AddControllers()
builder.Services.AddEndpointsApiExplorer()
builder.Services.AddSwaggerGen()
' Register PDF service
builder.Services.AddSingleton(Of IPdfService, PdfService)()
Dim app = builder.Build()
If app.Environment.IsDevelopment() Then
    app.UseSwagger()
    app.UseSwaggerUI()
End If
app.UseHttpsRedirection()
app.MapControllers()
app.Run()
$vbLabelText   $csharpLabel

Farklı Yanıt Türleri Nasıl Yönetilir?

API'niz, müşteri ihtiyaçlarına göre farklı şekillerde PDF'leri döndürecek şekilde destek vermelidir:

[HttpPost("generate")]
public IActionResult GeneratePdf([FromBody] PdfRequest request)
{
    var pdfBytes = _pdfService.GeneratePdfFromHtml(request.HtmlContent);
    switch (request.ResponseType?.ToLower())
    {
        case "base64":
            return Ok(new
            {
                data = Convert.ToBase64String(pdfBytes),
                filename = request.FileName
            });
        case "inline":
            return File(pdfBytes, "application/pdf");
        default: // download
            return File(pdfBytes, "application/pdf", request.FileName);
    }
}
[HttpPost("generate")]
public IActionResult GeneratePdf([FromBody] PdfRequest request)
{
    var pdfBytes = _pdfService.GeneratePdfFromHtml(request.HtmlContent);
    switch (request.ResponseType?.ToLower())
    {
        case "base64":
            return Ok(new
            {
                data = Convert.ToBase64String(pdfBytes),
                filename = request.FileName
            });
        case "inline":
            return File(pdfBytes, "application/pdf");
        default: // download
            return File(pdfBytes, "application/pdf", request.FileName);
    }
}
Imports Microsoft.AspNetCore.Mvc

<HttpPost("generate")>
Public Function GeneratePdf(<FromBody> request As PdfRequest) As IActionResult
    Dim pdfBytes = _pdfService.GeneratePdfFromHtml(request.HtmlContent)
    Select Case request.ResponseType?.ToLower()
        Case "base64"
            Return Ok(New With {
                .data = Convert.ToBase64String(pdfBytes),
                .filename = request.FileName
            })
        Case "inline"
            Return File(pdfBytes, "application/pdf")
        Case Else ' download
            Return File(pdfBytes, "application/pdf", request.FileName)
    End Select
End Function
$vbLabelText   $csharpLabel

Bu, esnek bir PDF üretim uç noktası ekler. İndirme zorlaması yerine, GeneratePdf yöntemi talimatların nasıl alınacağını seçme imkanı sunar: indirme olarak, tarayıcı içinde satır içi veya API kullanımı için Base64 kodlaması ile.

PdfRequest modeli, HtmlRequest modelini ResponseType seçeneğiyle genişletir. Bu, kullanıcılara PDF teslimi üzerinde kontrol sağlar, bu da API'yi daha çok yönlü hale getirir. Dosya sistemi erişimi olmadan bellek içinde PDF'leri işlemenin yolları için, IronPDF'in bellek akışı dökümantasyonuna bakın.

Programımızı çalıştırdığımızda, Swagger üzerinde bu çıktıyı göreceğiz:

Swagger UI dökümantasyonu, PDF operasyonları için üç POST yöntemi olan html-to-pdf, generate ve url-to-pdf ile birlikte istek şemalarını gösteren PdfApiService uç noktalarını gösteriyor.

Yaygın PDF İşlemleri Nasıl Uygulanır?

Hizmetimizi çeşitli PDF oluşturma senaryolarını yönetebilecek şekilde genişletelim:

URL'leri PDF'ye Nasıl Dönüştürürüm?

[HttpPost("url-to-pdf")]
public async Task<IActionResult> ConvertUrlToPdf([FromBody] UrlRequest request)
{
    try
    {
        var pdfBytes = await Task.Run(() =>
            _pdfService.GeneratePdfFromUrl(request.Url));
        return File(pdfBytes, "application/pdf",
            $"{request.FileName ?? "website"}.pdf");
    }
    catch (Exception ex)
    {
        return BadRequest($"Failed to convert URL: {ex.Message}");
    }
}
public class UrlRequest
{
    public string Url { get; set; }
    public string FileName { get; set; }
}
[HttpPost("url-to-pdf")]
public async Task<IActionResult> ConvertUrlToPdf([FromBody] UrlRequest request)
{
    try
    {
        var pdfBytes = await Task.Run(() =>
            _pdfService.GeneratePdfFromUrl(request.Url));
        return File(pdfBytes, "application/pdf",
            $"{request.FileName ?? "website"}.pdf");
    }
    catch (Exception ex)
    {
        return BadRequest($"Failed to convert URL: {ex.Message}");
    }
}
public class UrlRequest
{
    public string Url { get; set; }
    public string FileName { get; set; }
}
Imports System.Threading.Tasks
Imports Microsoft.AspNetCore.Mvc

<HttpPost("url-to-pdf")>
Public Async Function ConvertUrlToPdf(<FromBody> request As UrlRequest) As Task(Of IActionResult)
    Try
        Dim pdfBytes = Await Task.Run(Function() _pdfService.GeneratePdfFromUrl(request.Url))
        Return File(pdfBytes, "application/pdf", $"{If(request.FileName, "website")}.pdf")
    Catch ex As Exception
        Return BadRequest($"Failed to convert URL: {ex.Message}")
    End Try
End Function

Public Class UrlRequest
    Public Property Url As String
    Public Property FileName As String
End Class
$vbLabelText   $csharpLabel

Bu uç nokta URL'leri indirilebilir PDF'lere dönüştürür. Bir POST isteği /api/pdf/url-to-pdf'e ulaştığında, kontrolör URL'yi arka planda PDF baytlarına dönüştürmek için _pdfService kullanır, ardından indirme için geri döner. Dönüşüm başarısız olursa, açık bir hata mesajı ile yanıt verir. Kimlik doğrulama gerektiren web siteleri için, IronPDF'in giriş dökümantasyonuna göz atın.

"https://www.apple.com/nz" URLsini kullanarak POST isteğini test edelim. Aşağıda elde ettiğimiz çıktı bulunmaktadır:

Çıktı Nasıl Görünüyor?

Apple News Zealand web sitesi anasayfası, iPhone 16, MacBook Air, Apple Watch ve AirPods ürünlerini içeren bölümler ile 'Daha fazla bilgi edin' ve 'Satın al' düğmelerini gösterir - URL'den PDF'ye dönüşümü gösterir.

Özel Filigranlar Nasıl Eklenir?

public byte[] AddWatermarkFromFile(string filePath, string watermarkText)
{
    // Load PDF directly from file
    var pdf = PdfDocument.FromFile(filePath);
    pdf.ApplyWatermark(
        $"<h1 style='color:red;font-size:72px;'>{watermarkText}</h1>",
        75,
        IronPdf.Editing.VerticalAlignment.Middle,
        IronPdf.Editing.HorizontalAlignment.Center
    );
    return pdf.BinaryData;
}
public byte[] AddWatermarkFromFile(string filePath, string watermarkText)
{
    // Load PDF directly from file
    var pdf = PdfDocument.FromFile(filePath);
    pdf.ApplyWatermark(
        $"<h1 style='color:red;font-size:72px;'>{watermarkText}</h1>",
        75,
        IronPdf.Editing.VerticalAlignment.Middle,
        IronPdf.Editing.HorizontalAlignment.Center
    );
    return pdf.BinaryData;
}
Imports IronPdf

Public Function AddWatermarkFromFile(filePath As String, watermarkText As String) As Byte()
    ' Load PDF directly from file
    Dim pdf = PdfDocument.FromFile(filePath)
    pdf.ApplyWatermark(
        $"<h1 style='color:red;font-size:72px;'>{watermarkText}</h1>",
        75,
        IronPdf.Editing.VerticalAlignment.Middle,
        IronPdf.Editing.HorizontalAlignment.Center
    )
    Return pdf.BinaryData
End Function
$vbLabelText   $csharpLabel

Bu, test için yerel bir dosyayı manuel olarak yükler. PDF API'nizin bir PDF üretmesini ve ardından özel filigranları kolayca uygulamasını ayarlayabilirsiniz. Gelişmiş filigranlama seçenekleri, görsel filigranlar ve özel pozisyonlandırma dahil için, filigran rehberine göz atın.

Filigran Çıktısı Nasıl Görünür?

'GİZLİ' filigranı, boş bir sayfanın üzerine çapraz olarak görüntülenen güvenli bir belge, üstte Belge ID: BA811648DCE1FF2AAA55E7CE gösteriyor

Şablonlarla Dinamik Veriler Nasıl Eklenir?

Gerçek dünya uygulamaları için, şablonlardan dinamik veriler içeren PDF'ler üretmeniz sıkça gerekecektir:

[HttpPost("from-template")]
public IActionResult GenerateFromTemplate([FromBody] TemplateRequest request)
{
    // Simple template replacement
    var html = request.Template;
    foreach (var item in request.Data)
    {
        html = html.Replace($"{{{{{item.Key}}}}}", item.Value);
    }
    var pdfBytes = _pdfService.GeneratePdfFromHtml(html);
    return File(pdfBytes, "application/pdf", request.FileName);
}
public class TemplateRequest
{
    public string Template { get; set; }
    public Dictionary<string, string> Data { get; set; }
    public string FileName { get; set; } = "document.pdf";
}
[HttpPost("from-template")]
public IActionResult GenerateFromTemplate([FromBody] TemplateRequest request)
{
    // Simple template replacement
    var html = request.Template;
    foreach (var item in request.Data)
    {
        html = html.Replace($"{{{{{item.Key}}}}}", item.Value);
    }
    var pdfBytes = _pdfService.GeneratePdfFromHtml(html);
    return File(pdfBytes, "application/pdf", request.FileName);
}
public class TemplateRequest
{
    public string Template { get; set; }
    public Dictionary<string, string> Data { get; set; }
    public string FileName { get; set; } = "document.pdf";
}
Imports Microsoft.AspNetCore.Mvc

<HttpPost("from-template")>
Public Function GenerateFromTemplate(<FromBody> request As TemplateRequest) As IActionResult
    ' Simple template replacement
    Dim html As String = request.Template
    For Each item In request.Data
        html = html.Replace($"{{{{{item.Key}}}}}", item.Value)
    Next
    Dim pdfBytes As Byte() = _pdfService.GeneratePdfFromHtml(html)
    Return File(pdfBytes, "application/pdf", request.FileName)
End Function

Public Class TemplateRequest
    Public Property Template As String
    Public Property Data As Dictionary(Of String, String)
    Public Property FileName As String = "document.pdf"
End Class
$vbLabelText   $csharpLabel

Razor, Handlebars veya diğer motorlarla gelişmiş şablon senaryoları için IronPDF'in HTML'den PDF'ye dökümantasyonuna göz atın. Ayrıca MVC uygulamaları için CSHTML'den PDF'e dönüştürmeyi ve Blazor uygulamaları için Razor'dan PDF'e dönüştürmeyi keşfedebilirsiniz. Başsız Razor renderı için, CSHTML başsız rehberine bakın.

Performans Nasıl Optimize Edilir?

Üretim bir PDF API inşa etmenin önemli noktalarından biri performanstır. İşte anahtar optimizasyon stratejileri:

Neden Asenkron İşlemler Kullanılır?

Projeleriniz I/O işlemlerini içerdiğinde asenkron kodlamayı kullanın. Bu özellikle PDF içeriğinizin aşağıdan geldiğinde yardımcı olur:

  • HTML sayfalarını indirme (RenderUrlAsPdf)
  • Resim, CSS veya yazı tiplerini HTTP üzerinden almak
  • Dosyaları disk veya bulut depolamaya okuma/yazma

Bu işlemler iplikleri engelleyebilir, fakat asenkron, API ipliklerin boşta beklemesini önler. Kapsamlı asenkron PDF üretimi desenleri için, asenkron PDF üretim kılavuzuna göz atın.

Örnek:

public async Task<byte[]> GeneratePdfFromHtmlAsync(string htmlContent)
{
    return await Task.Run(() =>
    {
        var pdf = _renderer.RenderHtmlAsPdf(htmlContent);
        return pdf.BinaryData;
    });
}
public async Task<byte[]> GeneratePdfFromHtmlAsync(string htmlContent)
{
    return await Task.Run(() =>
    {
        var pdf = _renderer.RenderHtmlAsPdf(htmlContent);
        return pdf.BinaryData;
    });
}
Imports System.Threading.Tasks

Public Async Function GeneratePdfFromHtmlAsync(htmlContent As String) As Task(Of Byte())
    Return Await Task.Run(Function()
                              Dim pdf = _renderer.RenderHtmlAsPdf(htmlContent)
                              Return pdf.BinaryData
                          End Function)
End Function
$vbLabelText   $csharpLabel

Paralel PDF üretim senaryoları için çoklu iş parçacığı ve paralel işlem tekniklerini keşfedin.

Hangi Rendering Seçeneklerini Yapılandırmalıyım?

IronPDF'yi en iyi performans için yapılandırın:

_renderer.RenderingOptions.EnableJavaScript = false; // If JS not needed
_renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print;
_renderer.RenderingOptions.RenderDelay = 0; // Remove if no JS
_renderer.RenderingOptions.Timeout = 30; // Set reasonable timeout
_renderer.RenderingOptions.EnableJavaScript = false; // If JS not needed
_renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print;
_renderer.RenderingOptions.RenderDelay = 0; // Remove if no JS
_renderer.RenderingOptions.Timeout = 30; // Set reasonable timeout
$vbLabelText   $csharpLabel

Kapsamlı render konfigürasyon seçenekleri, görünüm limiti ayarları, özel kağıt boyutları ve sayfa yönü dahil için, render seçenekleri dökümantasyonuna göz atın.

PDF API'nizi Nasıl Güvenli Hale Getirirsiniz?

Her üretim API'si için güvenlik esastır. Basit API anahtar kimlik doğrulama yaklaşımı:

// Middleware/ApiKeyMiddleware.cs
public class ApiKeyMiddleware
{
    private readonly RequestDelegate _next;
    private const string ApiKeyHeader = "X-API-Key";
    public ApiKeyMiddleware(RequestDelegate next)
    {
        _next = next;
    }
    public async Task InvokeAsync(HttpContext context)
    {
        if (!context.Request.Headers.TryGetValue(ApiKeyHeader, out var apiKey))
        {
            context.Response.StatusCode = 401;
            await context.Response.WriteAsync("API Key required");
            return;
        }
        // Validate API key (in production, check against database)
        var validApiKey = context.RequestServices
            .GetRequiredService<IConfiguration>()["ApiKey"];
        if (apiKey != validApiKey)
        {
            context.Response.StatusCode = 403;
            await context.Response.WriteAsync("Invalid API Key");
            return;
        }
        await _next(context);
    }
}
// In Program.cs
app.UseMiddleware<ApiKeyMiddleware>();
// Middleware/ApiKeyMiddleware.cs
public class ApiKeyMiddleware
{
    private readonly RequestDelegate _next;
    private const string ApiKeyHeader = "X-API-Key";
    public ApiKeyMiddleware(RequestDelegate next)
    {
        _next = next;
    }
    public async Task InvokeAsync(HttpContext context)
    {
        if (!context.Request.Headers.TryGetValue(ApiKeyHeader, out var apiKey))
        {
            context.Response.StatusCode = 401;
            await context.Response.WriteAsync("API Key required");
            return;
        }
        // Validate API key (in production, check against database)
        var validApiKey = context.RequestServices
            .GetRequiredService<IConfiguration>()["ApiKey"];
        if (apiKey != validApiKey)
        {
            context.Response.StatusCode = 403;
            await context.Response.WriteAsync("Invalid API Key");
            return;
        }
        await _next(context);
    }
}
// In Program.cs
app.UseMiddleware<ApiKeyMiddleware>();
Imports Microsoft.AspNetCore.Http
Imports Microsoft.Extensions.Configuration
Imports System.Threading.Tasks

' Middleware/ApiKeyMiddleware.vb
Public Class ApiKeyMiddleware
    Private ReadOnly _next As RequestDelegate
    Private Const ApiKeyHeader As String = "X-API-Key"

    Public Sub New(next As RequestDelegate)
        _next = next
    End Sub

    Public Async Function InvokeAsync(context As HttpContext) As Task
        Dim apiKey As String = Nothing
        If Not context.Request.Headers.TryGetValue(ApiKeyHeader, apiKey) Then
            context.Response.StatusCode = 401
            Await context.Response.WriteAsync("API Key required")
            Return
        End If

        ' Validate API key (in production, check against database)
        Dim validApiKey As String = context.RequestServices.GetRequiredService(Of IConfiguration)()("ApiKey")
        If apiKey <> validApiKey Then
            context.Response.StatusCode = 403
            Await context.Response.WriteAsync("Invalid API Key")
            Return
        End If

        Await _next(context)
    End Function
End Class

' In Program.vb
app.UseMiddleware(Of ApiKeyMiddleware)()
$vbLabelText   $csharpLabel

Gelişmiş kimlik doğrulama senaryoları için düşünün:

PDF'ye özel güvenlik için şifre koruması, dijital imzalar ve potansiyel olarak kötü niyetli içeriği kaldırmak için PDF temizleme uygulayın.

Gerçek Dünya Faturası Üretim API'si Nasıl Kurulur?

Tam bir uygulama gösteren pratik bir fatura üretim uç noktası yaratalım. Bu örnek, üretim bir .NET PDF API'sinin dinamik verilerle profesyonel faturalar nasıl oluşturduğunu gösterir.

Şimdi IronPDF ile başlayın.
green arrow pointer

Öncelikle, Modeller klasörünüzde yeni bir dosya oluşturun. Burada, benim adlandırdığım Invoice.cs kullanıldı. Daha sonra şu kodu ekleyin:

public class Invoice
{
    public string InvoiceNumber { get; set; }
    public DateTime Date { get; set; }
    public string CustomerName { get; set; }
    public string CustomerAddress { get; set; }
    public List<InvoiceItem> Items { get; set; }
    public decimal Tax { get; set; }
}
public class InvoiceItem
{
    public string Description { get; set; }
    public int Quantity { get; set; }
    public decimal UnitPrice { get; set; }
    public decimal Total => Quantity * UnitPrice;
}
public class Invoice
{
    public string InvoiceNumber { get; set; }
    public DateTime Date { get; set; }
    public string CustomerName { get; set; }
    public string CustomerAddress { get; set; }
    public List<InvoiceItem> Items { get; set; }
    public decimal Tax { get; set; }
}
public class InvoiceItem
{
    public string Description { get; set; }
    public int Quantity { get; set; }
    public decimal UnitPrice { get; set; }
    public decimal Total => Quantity * UnitPrice;
}
Public Class Invoice
    Public Property InvoiceNumber As String
    Public Property [Date] As DateTime
    Public Property CustomerName As String
    Public Property CustomerAddress As String
    Public Property Items As List(Of InvoiceItem)
    Public Property Tax As Decimal
End Class

Public Class InvoiceItem
    Public Property Description As String
    Public Property Quantity As Integer
    Public Property UnitPrice As Decimal
    Public ReadOnly Property Total As Decimal
        Get
            Return Quantity * UnitPrice
        End Get
    End Property
End Class
$vbLabelText   $csharpLabel

Sonra, fatura üretici için yeni bir hizmet dosyası oluşturun. Hizmetler klasörünüzde aşağıdaki kodu ekleyin. InvoiceService.cs adını verdiğim bir dosya oluşturdum. Bu kod, Faturanızın PDF'sinin stil ve düzenini işler:

public class InvoiceService
{
    private readonly ChromePdfRenderer _renderer;
    public InvoiceService()
    {
        _renderer = new ChromePdfRenderer();
        _renderer.RenderingOptions.MarginTop = 10;
        _renderer.RenderingOptions.MarginBottom = 10;
        _renderer.RenderingOptions.PrintHtmlBackgrounds = true;
    }
    public byte[] GenerateInvoice(Invoice invoice)
    {
        var html = BuildInvoiceHtml(invoice);
        // Add footer with page numbers
        _renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
        {
            MaxHeight = 15,
            HtmlFragment = "<center><i>{page} of {total-pages}</i></center>",
            DrawDividerLine = true
        };
        var pdf = _renderer.RenderHtmlAsPdf(html);
        return pdf.BinaryData;
    }
    private string BuildInvoiceHtml(Invoice invoice)
    {
        var subtotal = invoice.Items.Sum(i => i.Total);
        var taxAmount = subtotal * (invoice.Tax / 100);
        var total = subtotal + taxAmount;
        var itemsHtml = string.Join("", invoice.Items.Select(item =>
            $@"<tr>
                <td>{item.Description}</td>
                <td class='text-center'>{item.Quantity}</td>
                <td class='text-right'>${item.UnitPrice:F2}</td>
                <td class='text-right'>${item.Total:F2}</td>
            </tr>"));
        return $@"
        <!DOCTYPE html>
        <html>
        <head>
            <style>
                body {{ font-family: Arial, sans-serif; }}
                .invoice-header {{
                    background-color: #f8f9fa;
                    padding: 20px;
                    margin-bottom: 20px;
                }}
                table {{
                    width: 100%;
                    border-collapse: collapse;
                }}
                th, td {{
                    padding: 10px;
                    border-bottom: 1px solid #ddd;
                }}
                th {{
                    background-color: #007bff;
                    color: white;
                }}
                .text-right {{ text-align: right; }}
                .text-center {{ text-align: center; }}
                .total-section {{
                    margin-top: 20px;
                    text-align: right;
                }}
            </style>
        </head>
        <body>
            <div class='invoice-header'>
                <h1>Invoice #{invoice.InvoiceNumber}</h1>
                <p>Date: {invoice.Date:yyyy-MM-dd}</p>
            </div>
            <div>
                <h3>Bill To:</h3>
                <p>{invoice.CustomerName}<br/>{invoice.CustomerAddress}</p>
            </div>
            <table>
                <thead>
                    <tr>
                        <th>Description</th>
                        <th>Quantity</th>
                        <th>Unit Price</th>
                        <th>Total</th>
                    </tr>
                </thead>
                <tbody>
                    {itemsHtml}
                </tbody>
            </table>
            <div class='total-section'>
                <p>Subtotal: ${subtotal:F2}</p>
                <p>Tax ({invoice.Tax}%): ${taxAmount:F2}</p>
                <h3>Total: ${total:F2}</h3>
            </div>
        </body>
        </html>";
    }
}
public class InvoiceService
{
    private readonly ChromePdfRenderer _renderer;
    public InvoiceService()
    {
        _renderer = new ChromePdfRenderer();
        _renderer.RenderingOptions.MarginTop = 10;
        _renderer.RenderingOptions.MarginBottom = 10;
        _renderer.RenderingOptions.PrintHtmlBackgrounds = true;
    }
    public byte[] GenerateInvoice(Invoice invoice)
    {
        var html = BuildInvoiceHtml(invoice);
        // Add footer with page numbers
        _renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
        {
            MaxHeight = 15,
            HtmlFragment = "<center><i>{page} of {total-pages}</i></center>",
            DrawDividerLine = true
        };
        var pdf = _renderer.RenderHtmlAsPdf(html);
        return pdf.BinaryData;
    }
    private string BuildInvoiceHtml(Invoice invoice)
    {
        var subtotal = invoice.Items.Sum(i => i.Total);
        var taxAmount = subtotal * (invoice.Tax / 100);
        var total = subtotal + taxAmount;
        var itemsHtml = string.Join("", invoice.Items.Select(item =>
            $@"<tr>
                <td>{item.Description}</td>
                <td class='text-center'>{item.Quantity}</td>
                <td class='text-right'>${item.UnitPrice:F2}</td>
                <td class='text-right'>${item.Total:F2}</td>
            </tr>"));
        return $@"
        <!DOCTYPE html>
        <html>
        <head>
            <style>
                body {{ font-family: Arial, sans-serif; }}
                .invoice-header {{
                    background-color: #f8f9fa;
                    padding: 20px;
                    margin-bottom: 20px;
                }}
                table {{
                    width: 100%;
                    border-collapse: collapse;
                }}
                th, td {{
                    padding: 10px;
                    border-bottom: 1px solid #ddd;
                }}
                th {{
                    background-color: #007bff;
                    color: white;
                }}
                .text-right {{ text-align: right; }}
                .text-center {{ text-align: center; }}
                .total-section {{
                    margin-top: 20px;
                    text-align: right;
                }}
            </style>
        </head>
        <body>
            <div class='invoice-header'>
                <h1>Invoice #{invoice.InvoiceNumber}</h1>
                <p>Date: {invoice.Date:yyyy-MM-dd}</p>
            </div>
            <div>
                <h3>Bill To:</h3>
                <p>{invoice.CustomerName}<br/>{invoice.CustomerAddress}</p>
            </div>
            <table>
                <thead>
                    <tr>
                        <th>Description</th>
                        <th>Quantity</th>
                        <th>Unit Price</th>
                        <th>Total</th>
                    </tr>
                </thead>
                <tbody>
                    {itemsHtml}
                </tbody>
            </table>
            <div class='total-section'>
                <p>Subtotal: ${subtotal:F2}</p>
                <p>Tax ({invoice.Tax}%): ${taxAmount:F2}</p>
                <h3>Total: ${total:F2}</h3>
            </div>
        </body>
        </html>";
    }
}
Imports System
Imports System.Linq

Public Class InvoiceService
    Private ReadOnly _renderer As ChromePdfRenderer

    Public Sub New()
        _renderer = New ChromePdfRenderer()
        _renderer.RenderingOptions.MarginTop = 10
        _renderer.RenderingOptions.MarginBottom = 10
        _renderer.RenderingOptions.PrintHtmlBackgrounds = True
    End Sub

    Public Function GenerateInvoice(invoice As Invoice) As Byte()
        Dim html = BuildInvoiceHtml(invoice)
        ' Add footer with page numbers
        _renderer.RenderingOptions.HtmlFooter = New HtmlHeaderFooter With {
            .MaxHeight = 15,
            .HtmlFragment = "<center><i>{page} of {total-pages}</i></center>",
            .DrawDividerLine = True
        }
        Dim pdf = _renderer.RenderHtmlAsPdf(html)
        Return pdf.BinaryData
    End Function

    Private Function BuildInvoiceHtml(invoice As Invoice) As String
        Dim subtotal = invoice.Items.Sum(Function(i) i.Total)
        Dim taxAmount = subtotal * (invoice.Tax / 100)
        Dim total = subtotal + taxAmount
        Dim itemsHtml = String.Join("", invoice.Items.Select(Function(item) _
            $"<tr>
                <td>{item.Description}</td>
                <td class='text-center'>{item.Quantity}</td>
                <td class='text-right'>${item.UnitPrice:F2}</td>
                <td class='text-right'>${item.Total:F2}</td>
            </tr>"))
        Return $"
        <!DOCTYPE html>
        <html>
        <head>
            <style>
                body {{ font-family: Arial, sans-serif; }}
                .invoice-header {{
                    background-color: #f8f9fa;
                    padding: 20px;
                    margin-bottom: 20px;
                }}
                table {{
                    width: 100%;
                    border-collapse: collapse;
                }}
                th, td {{
                    padding: 10px;
                    border-bottom: 1px solid #ddd;
                }}
                th {{
                    background-color: #007bff;
                    color: white;
                }}
                .text-right {{ text-align: right; }}
                .text-center {{ text-align: center; }}
                .total-section {{
                    margin-top: 20px;
                    text-align: right;
                }}
            </style>
        </head>
        <body>
            <div class='invoice-header'>
                <h1>Invoice #{invoice.InvoiceNumber}</h1>
                <p>Date: {invoice.Date:yyyy-MM-dd}</p>
            </div>
            <div>
                <h3>Bill To:</h3>
                <p>{invoice.CustomerName}<br/>{invoice.CustomerAddress}</p>
            </div>
            <table>
                <thead>
                    <tr>
                        <th>Description</th>
                        <th>Quantity</th>
                        <th>Unit Price</th>
                        <th>Total</th>
                    </tr>
                </thead>
                <tbody>
                    {itemsHtml}
                </tbody>
            </table>
            <div class='total-section'>
                <p>Subtotal: ${subtotal:F2}</p>
                <p>Tax ({invoice.Tax}%): ${taxAmount:F2}</p>
                <h3>Total: ${total:F2}</h3>
            </div>
        </body>
        </html>"
    End Function
End Class
$vbLabelText   $csharpLabel

Son olarak, API kullanarak faturaları erişmek ve oluşturmak için yeni bir Kontrolör oluşturun:

[ApiController]
[Route("api/[controller]")]
public class InvoiceController : ControllerBase
{
    private readonly InvoiceService _invoiceService;
    public InvoiceController(InvoiceService invoiceService)
    {
        _invoiceService = invoiceService;
    }
    [HttpPost("generate")]
    public IActionResult GenerateInvoice([FromBody] Invoice invoice)
    {
        try
        {
            var pdfBytes = _invoiceService.GenerateInvoice(invoice);
            var fileName = $"Invoice_{invoice.InvoiceNumber}.pdf";
            return File(pdfBytes, "application/pdf", fileName);
        }
        catch (Exception ex)
        {
            return StatusCode(500, $"Error generating invoice: {ex.Message}");
        }
    }
}
[ApiController]
[Route("api/[controller]")]
public class InvoiceController : ControllerBase
{
    private readonly InvoiceService _invoiceService;
    public InvoiceController(InvoiceService invoiceService)
    {
        _invoiceService = invoiceService;
    }
    [HttpPost("generate")]
    public IActionResult GenerateInvoice([FromBody] Invoice invoice)
    {
        try
        {
            var pdfBytes = _invoiceService.GenerateInvoice(invoice);
            var fileName = $"Invoice_{invoice.InvoiceNumber}.pdf";
            return File(pdfBytes, "application/pdf", fileName);
        }
        catch (Exception ex)
        {
            return StatusCode(500, $"Error generating invoice: {ex.Message}");
        }
    }
}
Imports Microsoft.AspNetCore.Mvc

<ApiController>
<Route("api/[controller]")>
Public Class InvoiceController
    Inherits ControllerBase

    Private ReadOnly _invoiceService As InvoiceService

    Public Sub New(invoiceService As InvoiceService)
        _invoiceService = invoiceService
    End Sub

    <HttpPost("generate")>
    Public Function GenerateInvoice(<FromBody> invoice As Invoice) As IActionResult
        Try
            Dim pdfBytes = _invoiceService.GenerateInvoice(invoice)
            Dim fileName = $"Invoice_{invoice.InvoiceNumber}.pdf"
            Return File(pdfBytes, "application/pdf", fileName)
        Catch ex As Exception
            Return StatusCode(500, $"Error generating invoice: {ex.Message}")
        End Try
    End Function
End Class
$vbLabelText   $csharpLabel

Gelişmiş fatura özellikleri için barkod, QR kodları, sayfa numaraları ve özel başlık/alt başlıklar eklemeyi düşünün. Uzun süreli arşivleme veya elektronik imza işleriyle entegre için PDF/A uyumu da uygulayabilirsiniz.

Fatura Çıktısı Nasıl Görünür?

PDF invoice document showing Invoice #INV-1023 dated 2025-08-22, with a single line item for 'Misc Object' totaling $495.00 including tax

Konteyner Dağıtım Dikkatlerini Nelerdir?

Bu eğitim, yerel geliştirme üzerinde yoğunlaşırken, PDF API'nizi kapsüllemenin kısa bir genel bakışını işte böyle sunar:

Temel bir Dockerfile Nasıl Oluşturulur?

FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
WORKDIR /app
EXPOSE 80
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
COPY ["PdfApiService.csproj", "."]
RUN dotnet restore
COPY . .
RUN dotnet build -c Release -o /app/build
FROM build AS publish
RUN dotnet publish -c Release -o /app/publish
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
# IronPDF requires additional dependencies on Linux
RUN apt-get update && apt-get install -y \
    libgdiplus \
    libc6-dev \
    libx11-dev \
    && rm -rf /var/lib/apt/lists/*
ENTRYPOINT ["dotnet", "PdfApiService.dll"]

Detaylı dağıtım rehberleri için .NET PDF API'nizi inceleyin:

Hata Yönetimi En İyi Uygulamaları Nelerdir?

Hata tolere edici programlar için, tutarlı hata yanıtları için küresel bir hata yöneticisi uygulayın:

// Middleware/ErrorHandlingMiddleware.cs
public class ErrorHandlingMiddleware
{
    private readonly RequestDelegate _next;
    private readonly ILogger<ErrorHandlingMiddleware> _logger;
    public ErrorHandlingMiddleware(RequestDelegate next, ILogger<ErrorHandlingMiddleware> logger)
    {
        _next = next;
        _logger = logger;
    }
    public async Task InvokeAsync(HttpContext context)
    {
        try
        {
            await _next(context);
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "An error occurred processing request {Path}", context.Request.Path);
            await HandleExceptionAsync(context, ex);
        }
    }
    private static async Task HandleExceptionAsync(HttpContext context, Exception ex)
    {
        context.Response.ContentType = "application/json";
        context.Response.StatusCode = ex switch
        {
            ArgumentNullException => 400,
            UnauthorizedAccessException => 401,
            _ => 500
        };
        var response = new
        {
            error = "An error occurred processing your request",
            message = ex.Message,
            statusCode = context.Response.StatusCode
        };
        await context.Response.WriteAsync(JsonSerializer.Serialize(response));
    }
}
// Middleware/ErrorHandlingMiddleware.cs
public class ErrorHandlingMiddleware
{
    private readonly RequestDelegate _next;
    private readonly ILogger<ErrorHandlingMiddleware> _logger;
    public ErrorHandlingMiddleware(RequestDelegate next, ILogger<ErrorHandlingMiddleware> logger)
    {
        _next = next;
        _logger = logger;
    }
    public async Task InvokeAsync(HttpContext context)
    {
        try
        {
            await _next(context);
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "An error occurred processing request {Path}", context.Request.Path);
            await HandleExceptionAsync(context, ex);
        }
    }
    private static async Task HandleExceptionAsync(HttpContext context, Exception ex)
    {
        context.Response.ContentType = "application/json";
        context.Response.StatusCode = ex switch
        {
            ArgumentNullException => 400,
            UnauthorizedAccessException => 401,
            _ => 500
        };
        var response = new
        {
            error = "An error occurred processing your request",
            message = ex.Message,
            statusCode = context.Response.StatusCode
        };
        await context.Response.WriteAsync(JsonSerializer.Serialize(response));
    }
}
' Middleware/ErrorHandlingMiddleware.vb
Public Class ErrorHandlingMiddleware
    Private ReadOnly _next As RequestDelegate
    Private ReadOnly _logger As ILogger(Of ErrorHandlingMiddleware)

    Public Sub New(ByVal [next] As RequestDelegate, ByVal logger As ILogger(Of ErrorHandlingMiddleware))
        _next = [next]
        _logger = logger
    End Sub

    Public Async Function InvokeAsync(ByVal context As HttpContext) As Task
        Try
            Await _next(context)
        Catch ex As Exception
            _logger.LogError(ex, "An error occurred processing request {Path}", context.Request.Path)
            Await HandleExceptionAsync(context, ex)
        End Try
    End Function

    Private Shared Async Function HandleExceptionAsync(ByVal context As HttpContext, ByVal ex As Exception) As Task
        context.Response.ContentType = "application/json"
        context.Response.StatusCode = If(TypeOf ex Is ArgumentNullException, 400, If(TypeOf ex Is UnauthorizedAccessException, 401, 500))
        Dim response = New With {
            .error = "An error occurred processing your request",
            .message = ex.Message,
            .statusCode = context.Response.StatusCode
        }
        Await context.Response.WriteAsync(JsonSerializer.Serialize(response))
    End Function
End Class
$vbLabelText   $csharpLabel

Belirli IronPDF sorun giderme senaryoları için:

Üretim .NET PDF API'nizi Oluşturmaya Hazır mısınız?

Şimdi, çeşitli belge oluşturma senaryolarını ele alan ASP.NET Core ve IronPDF kullanarak sağlam bir .NET PDF API'si oluşturdunuz. Bu REST API, uygulamalarınızdaki merkezi PDF işlemleri için sağlam bir temel sağlar.

Ana çıkarımlar:

  • IronPDF, Chrome tabanlı işleme ile Web API projelerinde PDF oluşturmayı kolaylaştırır.
  • IronPDF'in gelişmiş düzenleme araçları ile mevcut PDF'leri kolayca düzenleyin.
  • RESTful tasarım ilkeleri, PDF API'nizin sezgisel ve sürdürülebilir olmasını sağlar.
  • Üretim için uygun hata yönetimi ve güvenlik önlemleri gereklidir.
  • Async operasyonları ve önbellekleme yolu ile performans optimizasyonu, ölçeklenebilirliği artırır.
  • Masaüstü ve web uygulamaları için ölçeklenebilir belge çözümleri ile tam destek.

IronPDF geliştiricilerin PDF oluşturma, PDF dosyalarını kaydetme ve HTML'yi verimli bir şekilde dönüştürmesini sağlar, modern .NET Framework uygulamaları için gerekli PDF API'sidir.

Bir sonraki adımlar nelerdir?

Üretim .NET PDF API'nizde IronPDF'yi uygulamaya hazır mısınız? İşte sonraki adımlar:

  1. Ücretsiz denemeye başlayın - Geliştirme ortamınızda IronPDF'i tam işlevsellikle test edin.
  2. Gelişmiş özellikleri keşfedin - Dijital imzalar, PDF formları, PDF/A uyumluluğu, metadata yönetimi ve diğer gelişmiş PDF özelliklerine göz atın.
  3. Güvenle ölçeklendirin - Üretim API ihtiyaçlarınız için lisanslama seçeneklerini inceleyin, eklentiler ve yükseltmeler dahil.

Bugün bir .NET PDF API inşa edin ve IronPDF ile tüm uygulama ekosisteminizde doküman üretimini hızlandırın!

Sıkça Sorulan Sorular

.NET uygulamalarında IronPDF ne için kullanılır?

IronPDF, .NET uygulamalarında PDF oluşturma, düzenleme ve dönüştürme için kullanılır, bu da merkezi PDF hizmetleri oluşturma için idealdir.

IronPDF ASP.NET Core ile nasıl entegre edilebilir?

IronPDF, merkezi bir PDF oluşturma hizmeti sunmanızı sağlayarak, IronPDF NuGet paketini yükleyerek ASP.NET Core ile entegre edilebilir.

IronPDF'nin PDF oluşturma için başlıca özellikleri nelerdir?

IronPDF'nin temel özellikleri, HTML'den PDF'ye dönüşüm, PDF'leri birleştirme ve bölme, üstbilgiler ve altbilgiler ekleme ve metin ile resim çıkarma içermektedir.

IronPDF karmaşık PDF düzenleriyle başa çıkabilir mi?

Evet, IronPDF, HTML ve CSS içeriğini doğru bir şekilde PDF belgelerine dönüştürebildiği için karmaşık PDF düzenlerini yönetebilir.

IronPDF ile PDF oluşturma özelleştirilebilir mi?

Evet, IronPDF, sayfa boyutu ayarlama, kenar boşlukları ekleme ve filigran veya açıklamalar ekleme gibi PDF oluşturmayı özelleştirme imkanı tanır.

IronPDF PDF güvenlik özelliklerini destekliyor mu?

IronPDF, oluşturulan PDF belgelerini güvenceye almak için parola koruması ve şifreleme gibi PDF güvenlik özelliklerini destekler.

IronPDF, hangi formatları PDF'lere dönüştürebilir?

IronPDF, HTML, URL'ler ve ASPX dosyaları dahil olmak üzere çeşitli formatları PDF'lere dönüştürebilir ve bu da farklı kullanım durumları için çok yönlü hale getirir.

IronPDF, büyük ölçekli PDF oluşturma işlemlerini nasıl ele alır?

IronPDF optimizasyon için elverişlidir, bu da .NET uygulamaları icinde büyük ölçekli PDF oluşturma görevlerini verimli bir şekilde ele almasına olanak tanır.

IronPDF bulut tabanlı uygulamalarda kullanılabilir mi?

Evet, IronPDF, Azure ve AWS gibi platformlarda dağıtımı destekleyen bulut tabanlı uygulamalarda kullanılarak ölçeklenebilir PDF hizmetleri sunabilir.

IronPDF, .NET'in hangi sürümlerini destekliyor?

IronPDF, .NET Core ve .NET Framework dahil olmak uzere birden fazla .NET sürümunu destekleyerek genis bir proje yelpazesi ile uyumluluk saglar.

Curtis Chau
Teknik Yazar

Curtis Chau, Bilgisayar Bilimleri alanında lisans derecesine sahiptir (Carleton Üniversitesi) ve Node.js, TypeScript, JavaScript ve React konularında uzmanlaşmış ön uç geliştirme üzerine uzmanlaşmıştır. Kullanıcı dostu ve estetik açıdan hoş arayüzler tasarlamaya tutkuyla bağlı olan Curtis, modern çerç...

Daha Fazlasını Oku

Iron Destek Ekibi

Haftanın 5 günü, 24 saat çevrimiçiyiz.
Sohbet
E-posta
Beni Ara