Altbilgi içeriğine atla
IRONPDF KULLANARAK

IronPDF Kullanarak .NET PDF API Nasıl Oluşturulur

Modern uygulamalarla çalışırken, kendiniz gibi .NET geliştiricileri merkezi bir PDF oluşturma hizmeti oluşturma gereğinde bulunabilir. İster faturalar, raporlar, sertifikalar veya sözleşmeler oluşturuyor olun, adanmış bir .NET PDF API'ne sahip olmak, PDF dosyalarını verimli bir şekilde yönetmek için faydalı olabilir. Peki, PDF oluşturma görevlerinizi nasıl geliştirebilir? Bu, masaüstü ve web uygulamalarınızda tutarlılık, sürdürülebilirlik ve ölçeklenebilirlik sağlayarak yapılır. Belgelerin içeriğini, PDF sayfalarını ve PDF form alanlarını yönetmek hiç bu kadar kolay olmamıştı.

Bu öğreticide, güçlü bir .NET PDF kütüphanesi olan ASP.NET Core ve IronPDF kullanarak üretime hazır bir PDF API nasıl oluşturulacağını öğreneceksiniz. HTML'den PDF dosyası oluşturma, belgeleri birleştirme, filigran ekleme ve Web API'nizdeki çeşitli gerçek dünya PDF oluşturma senaryolarını ele alabilecek RESTful uç noktaları oluşturacağız.

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

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

  • Merkezileştirilmiş Mantık: Tüm PDF oluşturma mantığı tek bir yerde bulunduğundan, bakım ve güncellemeler daha kolay olur
  • Mikroservis Mimarisi: Farklı uygulamaların PDF yeteneklerine ihtiyaç duyduğu hizmet odaklı mimariler için mükemmel
  • Performans Optimizasyonu: Büyük PDF dosyalar, çok sayfalı belgeler ve dinamik veri için dedike bir hizmeti ölçeklendirmek ve optimize etmek daha kolaydır.
  • Dil Agnostiği: Programlama dilinden bağımsız olarak, her istemci uygulama API'yi tüketebilir
  • Tutarlı Çıktı: Kuruluşunuzdaki tüm PDF belgelerinin tutarlı belge düzeni, paragraf biçimlendirmesi ve PDF içeriği sağlamasını garantiler.

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: Tam .NET PDF Kütüphanesi

IronPDF, Web API projelerinde PDF oluşturmayı basit ve güvenilir hale getiren kapsamlı bir dizi özellik sunarak .NET geliştiricileri için öne çıkıyor. Chrome render motoru üzerine inşa edilmiştir, bu da HTML'den PDF'ye dönüştürmeleri genellikle sadece birkaç kod satırında piksel mükemmel hale getirir. Tüm bu işlemleri stil, JavaScript icrası ve duyarlı düzenleri korurken yapar.

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

  • Chrome Tabanlı Render: HTML içeriğinden PDF belgeleri dönüştürmek için Google Chrome'un rendere motorunu kullanarak gömülü görüntüler ve diğer web varlıkları için tam destek sağlar
  • Zengin Özellik Seti: Yeni ve mevcut belgelerin dijital imzalar, PDF formları, açıklamalar, şifreleme, sıkıştırma ve daha fazlasıyla düzenlenmesini destekler
  • Güvenli PDF Belgeleri Oluşturun: Şifreleme, dijital imzalar ve belge korumasıyla hassas PDF içeriğini yönetin.
  • Çoklu Giriş Formatları: HTML, URL'ler, görüntüler ve Office belgelerini kullanarak PDF belgeleri oluşturun
  • Gelişmiş Manipülasyon: PDF sayfalarını birleştirin, belgeleri bölün, filigranlar uygulayın, etkileşimli PDF formları oluşturun ve PDF dosyalarını programatik olarak manipüle edin.
  • Çapraz Platform Desteği: Windows, Linux, macOS, Docker ve bulut platformlarında çalışır
  • Performans Optimizasyonu: Async işlemler, verimli bellek yönetimi ve hızlı render

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.

Önkoşullar

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

Projeyi Oluşturmak

PDF oluşturma aracımızı inşa edeceğimiz projeyi ilk olarak oluşturalım.

dotnet new webapi -n PdfApiService
cd PdfApiService

IronPDF Kurulumu

Sonraki adım, NuGet üzerinden projenize IronPDF'i eklemek:

dotnet add package IronPdf

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

Install-Package IronPdf

Proje Yapisi

C# geliştiriminin önemli bir yönü, temiz ve iyi yapılandırılmış bir proje dosyası düzenini korumaktır. Örneğin:

İ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 Hizmeti Oluşturma

Önce, IPdfService.cs dosyamıza aşağıdakileri ekleyeceğiz:

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ında, bunu ekleyeceğiz:

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ürmenin çekirdek sürecini yönetir. IronPDF'in ChromePdfRenderer'ını kullanarak, bu sınıf parlak bir nihai belge üretmek için sayfa kenar boşlukları ve arka plan render gibi anlamlı varsayılanlarla yapılandırılmıştır.

Kontrolcü ham HTML sağladığında, hizmet IronPDF kullanarak profesyonel kalitede bir PDF üretir ve sonucu indirilmeye hazır bayt verisi olarak geri döndürür. Ek olarak, bir URL'yi doğrudan PDF'e çevirerek tüm web sayfalarını da yönetebilir.

Kontrolcüyü Oluşturma

Şimdi API'miz için kontrolcüyü oluşturmanın zamanı geldi. Bu, HTML'den PDF dosyaları üretebilen bir API uç noktası sağlayacaktır. Daha sonra PDF belgelerini indirip sisteminize kaydederek ileri kullanım veya paylaşım için hazır hale getirebilirsiniz.

// 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

Daha sonra, HtmlRequest.cs dosyasında şunu ekleyeceğiz:

// 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

İlk dosyada, HTML'yi indirilebilir bir PDF'ye dönüştüren basit bir API uç noktası oluşturduk. Birisi basit bir POST isteği ile api/pdf/html-to-pdf rotasına HTML içerik gönderdiğinde, PdfController bunu PDF'ye dönüştürme işini özel bir hizmete devreder.

PDF oluşturulduktan sonra, kontrolcü dosyayı indirilmeye hazır bir durumda kullanıcıya geri verir. İstek yapısı, ham HTML ve son belge için isteğe bağlı bir dosya adını taşıyan HtmlRequest modeli kullanılarak oluşturulmuştur. Özetle, bu yapılandırma, müşterilerin HTML gönderip anında iyi bir PDF alabilmesini kolaylaştırır.

Hizmetlerin Kaydedilmesi

PDF hizmetini kaydedecek şekilde Program.cs'nizi 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

Burada, kontrolcüye daha esnek bir PDF oluşturma uç noktası ekledik. Dosya indirmeyi zorlamak yerine, GeneratePdf metodu, sonucun nasıl döndürüleceğini müşterinin seçmesine izin verir. Bu seçenek, indirilebilir bir dosya, tarayıcıda doğrudan görüntüleme veya API'lerde kolay kullanım için bir Base64 dizisi olarak farklı formatlarda PDF'lerin gösterilmesine olanak tanır.

İstek, daha önceki HtmlRequest üzerine kurulan ve bir ResponseType seçeneği ekleyen PdfRequest modeli tarafından tanımlanır. Kısacası, bu, kullanıcıların PDF'lerini nasıl alacaklarına dair daha fazla kontrol sağlar, böylece API daha esnek ve kullanıcı dostu hale gelir.

Şimdi programımızı çalıştırdığımızda, Swagger'da bu çıktıyı göreceğiz.

IronPDF kullanarak .NET PDF API'ı oluşturma: Sekil 4 - Swagger UI

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

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

URL'den PDF'ye Dönüşü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, müşterilerin bir URL gönderip, o web sayfasının indirilmeye hazır PDF'sini geri almasına olanak tanır. Bir POST /api/pdf/url-to-pdf isteği geldiğinde, kontrolcü, verilen URL'yi arka planda PDF baytlara dönüştürmek için _pdfService kullanır, ardından bunları dosya indirmesi olarak geri döndürür. Dönüşüm sırasında bir şeyler ters giderse, net bir hata mesajı ile nazikçe yanıt verir.

"https://www.apple.com/nz" URL'sini kullanmayı ve POST isteğini test etmeyi deneyelim. Aşağıda elde ettiğimiz çıktı bulunmaktadır.

Çıktı

IronPDF kullanarak .NET PDF API'ı oluşturma: Sekil 5 - URL PDF ciktisi

Özel Filigranlar Ekleme

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

Burada, sadece test amaçları için yerel bir dosyayı manuel olarak yüklüyoruz. Ancak, bu ayarı değiştirerek PDF API'nizin bir PDF belgesi oluşturması ve ardından kolayca özel bir filigran uygulaması yapabilirsiniz.

Filigran Çıktısı

IronPDF kullanarak .NET PDF API'ı oluşturma: Sekil 6 - Yukaridaki kod orneginden filigran ciktisi

Şablonlar ile Dinamik Veri 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 daha gelişmiş şablon senaryoları için IronPDF'nin HTML'den PDF'ye belgelendiricisini inceleyin. 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.

Performans Nasıl Optimize Edilir?

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

Asenkron İşlemler

I/O işlemlerini içeren projelerde, asenkron kodlama kullanmak akıllıca olur. Bu, özellikle PDF içeriğinizin dış kaynaklardan geldiği durumlarda faydalıdır, örneğin:

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

Bu işlemler bir thread'i engelleyebilir, ancak asenkron kullanmak, API thread'inizin boşta beklemesini engeller.

Ö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

İşleme Seçenekleri

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

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

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

Gerçek Dünya Örneği: Fatura Üretim API'si

Tam bir uygulamayı gösteren pratik bir fatura üretim uç noktası oluşturalım. Bu örnek, bir üretim .NET PDF API'sinin dinamik verilerle profesyonel faturalar üretebileceğini göstermektedir.

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

Öncelikle, Models klasörümüzde yeni bir dosya oluşturacağız. Benimkine Invoice.cs adını verdim. Daha sonra yeni dosyanıza aşağıdaki 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

Fatura üreticimiz için yeni bir hizmet dosyası oluşturmamız gerekecek. Hizmetler klasörünüzde aşağıdaki kodu ekleyin. Benimkini InvoiceService.cs adında yeni bir dosya olarak oluşturdum. Bu kod, Fatura PDF dosyamızın stilini ve düzenini yönetecektir.

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 yeni bir Fatura oluşturmak ve erişmek için yeni bir Kontrolcü oluşturmanız gerekecektir.

[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

Fatura Çıktısı

IronPDF kullanarak .NET PDF API'ı oluşturma: Sekil 7 - PDF Fatura ciktisi

Konteyner Dağıtım Dikkat Edilmesi Gerekenler

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 Dockerfile

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"]
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"]
The provided code is a Dockerfile written for building and running a .NET application, not C# code. Dockerfiles are not converted to VB.NET as they are not programming language code but configuration scripts for Docker. If you have C# code that needs conversion to VB.NET, please provide that code instead.
$vbLabelText   $csharpLabel

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

Hata Yönetimi En İyi Uygulamaları

Daha dayanıklı bir program için en iyi uygulamalar, tutarlı hata yanıtları için aşağıda belirtilen global bir hata yöneticisini uygulamaktır:

// Middleware/ErrorHandlingMiddleware.cs
public class ErrorHandlingMiddleware
{
    private readonly RequestDelegate _next;
    public ErrorHandlingMiddleware(RequestDelegate next)
    {
        _next = next;
    }
    public async Task InvokeAsync(HttpContext context)
    {
        try
        {
            await _next(context);
        }
        catch (Exception ex)
        {
            await HandleExceptionAsync(context, ex);
        }
    }
    private static async Task HandleExceptionAsync(HttpContext context, Exception ex)
    {
        context.Response.ContentType = "application/json";
        context.Response.StatusCode = 500;
        var response = new
        {
            error = "An error occurred processing your request",
            message = ex.Message
        };
        await context.Response.WriteAsync(JsonSerializer.Serialize(response));
    }
}
// Middleware/ErrorHandlingMiddleware.cs
public class ErrorHandlingMiddleware
{
    private readonly RequestDelegate _next;
    public ErrorHandlingMiddleware(RequestDelegate next)
    {
        _next = next;
    }
    public async Task InvokeAsync(HttpContext context)
    {
        try
        {
            await _next(context);
        }
        catch (Exception ex)
        {
            await HandleExceptionAsync(context, ex);
        }
    }
    private static async Task HandleExceptionAsync(HttpContext context, Exception ex)
    {
        context.Response.ContentType = "application/json";
        context.Response.StatusCode = 500;
        var response = new
        {
            error = "An error occurred processing your request",
            message = ex.Message
        };
        await context.Response.WriteAsync(JsonSerializer.Serialize(response));
    }
}
Imports System.Text.Json
Imports Microsoft.AspNetCore.Http
Imports System.Threading.Tasks

Public Class ErrorHandlingMiddleware
    Private ReadOnly _next As RequestDelegate

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

    Public Async Function InvokeAsync(context As HttpContext) As Task
        Try
            Await _next(context)
        Catch ex As Exception
            Await HandleExceptionAsync(context, ex)
        End Try
    End Function

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

Belirli IronPDF sorun giderme senaryoları için IronPDF sorun giderme kılavuzuna bakın.

Sonuç

Artık çeşitli belge oluşturma senaryolarını yönetebilecek, sağlam bir .NET PDF API'yi ASP.NET Core ve IronPDF kullanarak inşa ettiniz. Bu REST API, uygulamalarınızdaki merkezi PDF işlemleri için sağlam bir temel sağlar.

Ana çıkarımlar:

  • IronPDF, Web API projelerinde PDF üretimini Chrome tabanlı işleme ile basit hale getirir
  • IronPDF'nin gelişmiş düzenleme araçları ile mevcut PDF belgelerini düzenlemek için Web API'nizi kolayca ayarlayabilirsiniz
  • 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 esastır
  • Asenkron işlemler ve önbellekleme yoluyla performans optimizasyonu, ölçeklenebilirliği artırır
  • Masaüstü ve web uygulamaları için ölçeklenebilir belge çözümleri desteğine sahip olacaksınız

IronPDF, geliştiricilere PDF belgeleri oluşturmaları, PDF dosyalarını kaydetmeleri ve HTML'yi verimli bir şekilde dönüştürmeleri için imkan tanır, bu sayede modern .NET Framework uygulamaları için temel bir PDF belgesi API'si haline gelir.

Sonraki Adımlar

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

  1. Ücretsiz denemenizi başlatın - Geliştirme ortamınızda IronPDF'yi tam işlevsellikle test edin
  2. Gelişmiş özellikleri keşfedin - Dijital imzalar, PDF formları ve gelişmiş diğer PDF özelliklerini inceleyin
  3. Güvenle ölçekleyin - Üretim API ihtiyaçlarınız için lisanslama seçeneklerini gözden geçirin

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 PDF API nedir?

Bir .NET PDF API'si, geliştiricilerin .NET uygulamalarında PDF içeriği oluşturmasına, düzenlemesine ve çıkarmasına olanak tanıyan bir kütüphanedir. Karmaşık PDF görevlerini basitleştirir ve PDF dosyalarının etkin bir şekilde yönetilmesini sağlar.

.NET PDF API'si uygulamam için nasıl fayda sağlayabilir?

.NET PDF API'si, PDF dosyalarını yönetirken tutarlılık, sürdürülebilirlik ve ölçeklenebilirlik sağlayarak uygulamanızı geliştirebilir, örneğin fatura, rapor, sertifika veya sözleşmeler oluşturma gibi.

.NET PDF API'si için bazı yaygın kullanım senaryoları nelerdir?

.NET PDF API'si için yaygın kullanım senaryoları, masaüstü ve web uygulamaları icinde fatura oluşturma, rapor hazırlama, sertifika üretme ve sözleşme yönetme gibi işlemleri içermektedir.

IronPDF, PDF oluşturma görevlerini nasıl basitleştiriyor?

IronPDF, belge içeriğinin, PDF sayfalarının ve form alanlarının kolayca yönetilmesini sağlayan güçlü bir kütüphane sunarak PDF oluşturma görevlerini basitleştirir. Bu, uygulamaların sürdürülebilirliğini ve ölçeklenebilirliğini kolaylaştırır.

IronPDF PDF form alanlarını yönetebilir mi?

Evet, IronPDF PDF form alanlarını etkin bir şekilde yönetebilir, geliştiricilerin PDF belgeleri içinde formlar oluşturmasına, doldurmasına ve verileri çıkarmasına olanak tanır.

IronPDF hem masaüstü hem de web uygulamaları için uygun mu?

Kesinlikle, IronPDF hem masaüstü hem de web uygulamalarında sorunsuz bir şekilde çalışacak şekilde tasarlanmıştır ve PDF yönetimi için tutarlı ve ölçeklenebilir bir çözüm sunar.

IronPDF'yi .NET geliştiricileri için güvenilir bir seçim yapan nedir?

IronPDF, kolay kullanımı, kapsamlı özellikleri ve PDF görevlerini düzenleme yeteneği sayesinde .NET geliştiricileri için güvenilir bir seçimdir. Bu, üretkenliği ve uygulama performansını artırır.

IronPDF PDF çıkarma yeteneklerini destekliyor mu?

Evet, IronPDF PDF çıkarma yeteneklerini destekler, PDF belgelerinden metin, resimler ve diğer verileri etkin bir şekilde çıkarmanıza olanak tanır.

IronPDF, PDF'leri yönetirken ölçeklenebilirliği nasıl artırır?

Artan talepleri performansdan ödün vermeden karşılayabilen merkezi bir PDF oluşturma hizmeti sağlayarak ölçeklenebilirliği artırır, büyüyen uygulamalar için ideal hale gelir.

IronPDF .NET uygulamaları için ne tür destek sunuyor?

IronPDF, ayrıntılı dokümantasyon, örnek kod ve .NET uygulamalarında PDF işlevlerini entegre etmek isteyen geliştiricileri desteklemeye hazır duyarlı bir destek ekibi dahil olmak üzere kapsamlı destek sunar.

IronPDF, .NET 10 ile tamamen uyumlu mu?

Evet — IronPDF, .NET 10 ile tam uyumludur. .NET 10'un getirdiği tüm performans, dil ve çalışma zamanı iyileştirmelerini destekler ve geçmiş .NET sürümleri gibi .NET 10 projelerinde kutudan çıktığı gibi çalışır.

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