IRONSOFTWAREHOME
IRONPDF KULLANARAK

C#'da IronPDF kullanarak dinamik PDF Nasıl Uygulamak

Curtis Chau
Curtis Chau
Updated: 12 Temmuz 2026

Xamarin.Forms'ta PDF dosyaları oluşturmak zor olabilir. Çoğu .NET PDF kütüphanesi mobil uygulamaları doğrudan desteklemez ve bir cihazda PDF belgeleri oluşturmaya çalışmak genellikle hatalara veya eksik işlevselliğe yol açar. Burada IronPDF devreye giriyor.

IronPDF, Xamarin.Forms uygulaması içinde doğal olarak çalışmasa da, sunucu tarafı bir API yaklaşımı bu boşluğu temiz bir şekilde köprüler. Mobil uygulamanız HTML içeriğini API'ye gönderir ve karşılığında tamamlanmış PDF dosyaları alır -- form, başlıklar, altbilgiler, resimler ve özel düzenler dahil profesyonel PDF oluşturma erişimine sahip olursunuz.

Önemli not: Microsoft, Mayıs 2024'te Xamarin desteğini sonlandırdı. Yeni projeler için .NET MAUI önerilen halef olup IronPDF'yi daha doğrudan destekler. Bu kılavuz, bakımda olan eski Xamarin projeleri için sunucu tarafı modelini kapsar ve sıfırdan başlayan ekipler için MAUI'ye geçiş yolunu açıklar.

Mobil PDF Oluşturma İçin Neden Sunucu Tarafı Bir Yaklaşım Çalışır?

IronPDF, CSS, JavaScript ve karmaşık düzenler için tam destek ile HTML içeriğini cilalı PDF belgelerine dönüştürmekte mükemmeldir. IronPDF'yi mobil bir uygulama içinde değil de ayrılmış bir sunucuda çalıştırmak, iOS ve Android'de doğrudan cihaz üzerinde PDF oluşturmayı engelleyen platform kısıtlamalarını atlar.

Sunucu tarafı model birkaç somut avantaj sunar:

  • Tutarlı çıktı: Yazı tipleri, resimler ve CSS sunucu tarafında çözülür, Android ve iOS donanımı arasındaki render farklarını ortadan kaldırır.
  • Özellik erişimi: IronPDF özellikleri PDF form oluşturma, dijital imzalar, filigranlar ve çok sayfalı düzenler gibi sınırlama olmaksızın sunucuda mevcuttur.
  • Daha hafif mobil uygulama: Cihaz sadece bir HTTP isteği gönderir ve döndürülen PDF baytlarını saklar -- telefon üzerinde ağır bir PDF motoru çalışmaz.
  • Merkezi lisanslama: Bir IronPDF lisansı, her cihazı ayrı ayrı lisanslamak yerine sunucu dağıtımınızı kapsar.

Xamarin.Forms istemcisi, API'yi çağırır, bir bayt dizisi alır, bunu yerel depolamaya yazar ve isteğe bağlı olarak bir PDF görüntüleyici açar. Sunucu geri kalan her şeyi halleder.

IronPDF PDF Oluşturma API'si Nasıl Kurulur?

Bir ASP.NET Core Web API projesi oluşturarak başlayın. Bu, Azure App Service, AWS, şirket içi bir sunucu veya bir Docker konteyneri gibi her yerde barındırabileceğiniz standart bir .NET 10 minimal API'dir.

IronPDF Kurulumu

Aşağıdaki komutlardan biriyle NuGet üzerinden IronPDF'yi kurun:

PM > Install-Package IronPdf

PDF Denetleyicisini Oluşturma

IronPDF kurulu olduğunda, HTML kabul eden ve bir PDF döndüren bir denetleyici ekleyin:

using IronPdf;
using Microsoft.AspNetCore.Mvc;

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers();
var app = builder.Build();
app.MapControllers();
app.Run();

namespace PdfGenerationApi.Controllers
{
    [ApiController]
    [Route("api/[controller]")]
    public class PdfController : ControllerBase
    {
        [HttpPost("generate")]
        public async Task<IActionResult> GeneratePdf([FromBody] PdfRequest request)
        {
            var renderer = new ChromePdfRenderer();
            renderer.RenderingOptions.PaperSize = IronPdf.Rendering.PdfPaperSize.A4;
            renderer.RenderingOptions.MarginTop = 25;
            renderer.RenderingOptions.MarginBottom = 25;
            renderer.RenderingOptions.MarginLeft = 20;
            renderer.RenderingOptions.MarginRight = 20;

            var pdf = await renderer.RenderHtmlAsPdfAsync(request.HtmlContent);
            return File(pdf.BinaryData, "application/pdf", "document.pdf");
        }
    }

    public class PdfRequest
    {
        public string HtmlContent { get; set; } = string.Empty;
    }
}

ChromePdfRenderer, HTML'i modern bir tarayıcının yapacağı gibi işlemek için Chromium tabanlı bir motor kullanır. HTML'den PDF'ye dönüşüm, CSS animasyonları, gömülü yazı tipleri, SVG grafikler ve JavaScript ile oluşturulmuş içeriğe saygı duyar. Kağıt boyutu ve kenar boşluğu ayarları nihai belge düzenine doğrudan çevrilir.

Üstbilgi ve Altbilgi Ekleme

Profesyonel belgeler için, işleyiciyi çağırmadan önce başlıklar ve altbilgiler ekleyin:

renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
{
    HtmlFragment = "<div style='text-align:right; font-size:12px; color:#555;'>Confidential -- Page {page} of {total-pages}</div>",
    DrawDividerLine = true
};
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
    HtmlFragment = "<div style='text-align:center; font-size:11px;'>Generated by MyCompany App</div>"
};

{page} ve {total-pages} gibi sayfa numarası belirteçleri, render zamanı otomatik olarak çözülür.

Xamarin İstemcisi Nasıl Uygulanır?

Xamarin.Forms uygulaması içinde, API'yi çağıran bir hizmet sınıfı oluşturun. Hizmeti sade tutun -- tek görevi, HTML yükünü serileştirmek, göndermek ve çağırana ham PDF baytlarını döndürmektir.

using System.Net.Http;
using System.Text;
using System.Text.Json;

namespace XamarinPdfApp.Services
{
    public class PdfService
    {
        private readonly HttpClient _httpClient;
        private const string ApiUrl = "https://your-api.example.com/api/pdf/generate";

        public PdfService()
        {
            _httpClient = new HttpClient
            {
                Timeout = TimeSpan.FromSeconds(60)
            };
        }

        public async Task<byte[]> GeneratePdfAsync(string htmlContent)
        {
            var payload = new { HtmlContent = htmlContent };
            var json = JsonSerializer.Serialize(payload);
            var content = new StringContent(json, Encoding.UTF8, "application/json");

            var response = await _httpClient.PostAsync(ApiUrl, content);

            if (response.IsSuccessStatusCode)
                return await response.Content.ReadAsByteArrayAsync();

            var error = await response.Content.ReadAsStringAsync();
            throw new InvalidOperationException($"PDF generation failed ({(int)response.StatusCode}): {error}");
        }
    }
}

60 saniyelik bir zaman aşımı, birçok resim veya CSS kaynağını içeren karmaşık HTML belgelerini karşılar. Çok büyük dosyalar için, ikili akışı doğrudan yayınlamak yerine API'den bir önceden imzalanmış indirme URL'si döndürmeyi düşünün -- bu, mobil bellek kullanımını öngörülebilir tutar.

Cihazda PDF Dosyaları Nasıl Kaydedilir ve Açılır?

Hizmet bayt dizisini döndüğünde, onu cihaz depolamasına yazın ve platform PDF görüntüleyicisinde açın. Xamarin.Forms, platforma özgü uygulamaları çağırmak için DependencyService desenini kullanır.

Paylaşılan kodda arabirimi tanımlayın:

using System.Threading.Tasks;

namespace XamarinPdfApp.Interfaces
{
    public interface ISaveFile
    {
        Task<string> SavePdfAsync(string filename, byte[] pdfData);
    }
}

iOS uygulamasını DependencyService kullanarak kaydedin:

using Foundation;
using QuickLook;
using UIKit;
using XamarinPdfApp.Interfaces;
using Xamarin.Forms;

[assembly: Dependency(typeof(XamarinPdfApp.iOS.SaveFileIOS))]
namespace XamarinPdfApp.iOS
{
    public class SaveFileIOS : ISaveFile
    {
        public async Task<string> SavePdfAsync(string filename, byte[] pdfData)
        {
            var documents = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
            var filePath = System.IO.Path.Combine(documents, filename);
            await System.IO.File.WriteAllBytesAsync(filePath, pdfData);
            return filePath;
        }
    }
}

Android için, uygulamanın dış dosyalar dizinine yazın ve manifestte bir FileProvider kaydedin, böylece URI'yi bir PDF görüntüleyici niyetine verebilirsiniz. Paylaşılan koddaki DependencyService.Get<ISaveFile>() çağrısı, çalışma zamanında mevcut platform için kaydedilen herhangi bir uygulamayı alır.

Hepsini Birleştirmek

Xamarin.Forms sayfanızda veya ViewModel'inizde hizmeti ve platform kaydedicisini birleştirin:

var htmlContent = BuildInvoiceHtml(invoice);
var pdfBytes = await _pdfService.GeneratePdfAsync(htmlContent);
var saver = DependencyService.Get<ISaveFile>();
var filePath = await saver.SavePdfAsync("invoice.pdf", pdfBytes);
await Launcher.OpenAsync(new OpenFileRequest
{
    File = new ReadOnlyFile(filePath, "application/pdf")
});

Bu, kullanıcının yüklediği her PDF görüntüleyicide kaydedilen PDF'yi açar, ki bu genellikle iOS ve Android'de yerel bir PDF uygulamasıdır.

Profesyonel Fatura ve Rapor PDF'leri Nasıl Oluşturulur?

Bir PDF'nin kalitesi, büyük ölçüde işleyiciye verilen HTML şablonunun kalitesine bağlıdır. C# dize interpolasyonu veya Scriban gibi bir şablonlama kütüphanesi kullanarak veri odaklı HTML oluşturun:

public string BuildInvoiceHtml(Invoice invoice)
{
    var rows = string.Join(
        "\n",
        invoice.Öğes.Select(i =>
            $"<tr><td>{i.Name}</td><td>{i.Quantity}</td><td>${i.UnitPrice:F2}</td><td>${i.Total:F2}</td></tr>"
        )
    );

    return $@"<!DOCTYPE html>
<html lang='en'>
<head>
<meta charset='UTF-8'>
<style>
  body {{font-family: Arial, sans-serif; color: #333; margin: 0; padding: 30px;}}
  h1 {{color: #1a73e8;}}
  table {{width: 100%; border-collapse: collapse; margin-top: 20px;}}
  th {{background: #1a73e8; color: #fff; padding: 10px; text-align: left;}}
  td {{padding: 10px; border-bottom: 1px solid #e0e0e0;}}
  .total {{font-weight: bold; font-size: 1.1em; text-align: right; margin-top: 15px;}}
</style>
</head>
<body>
  <h1>Invoice #{invoice.Number}</h1>
  <p>Date: {invoice.Date:yyyy-MM-dd} &nbsp;|&nbsp; Due: {invoice.DueDate:yyyy-MM-dd}</p>
  <p>Bill to: <strong>{invoice.ClientName}</strong></p>
  <table>
    <thead><tr><th>Öğe</th><th>Qty</th><th>Unit Price</th><th>Total</th></tr></thead>
    <tbody>{rows}</tbody>
  </table>
  <p class='total'>Grand Total: ${invoice.GrandTotal:F2}</p>
</body>
</html>";
}
C#

ChromePdfRenderer bu şablonu tam olarak bir tarayıcı gibi işler. IronPDF'nin filigran API'sini kullanarak filigranlar ekleyebilir veya gizli taslaklar için özel filigran tasarımları uygulayabilirsiniz. İmza alanı gerektiren belgeler için, IronPDF'nin imzalama desteği sunucu tarafında dijital imza yer tutucuları yerleştirmenizi sağlar.

Bir Xamarin Uygulamasında PDF Formları Nasıl Ele Alınır?

PDF formları, mobil iş uygulamaları için yaygın bir gerekliliktir -- sözleşmeler, başlangıç anketleri ve denetim kontrol listeleri tümü, doldurulmuş düzenlenebilir alanlardan faydalanır. Sunucu API'si, HTML şablonuyla birlikte alan verilerini kabul edebilir ve PDF döndürmeden önce form değerlerini gömebilir:

[HttpPost("form")]
public async Task<IActionResult> GenerateForm([FromBody] FormRequest request)
{
    var renderer = new ChromePdfRenderer();
    // Render an HTML form template to create an interactive PDF form
    var pdf = await renderer.RenderHtmlAsPdfAsync(request.HtmlTemplate);

    // Fill known values before returning
    var form = pdf.Form;
    foreach (var field in request.FieldValues)
    {
        var pdfField = form.Fields.FirstOrDefault(f => f.Name == field.Key);
        if (pdfField is IronPdf.Forms.PdfFormTextFieldField textField)
            textField.Value = field.Value;
    }

    return File(pdf.BinaryData, "application/pdf", "form.pdf");
}

Mobil istemci, alan adları ve değerlerinden oluşan bir sözlük gönderir. Sunucu bunları doldurur ve kullanıcıya, PDF görüntüleyici içinde kalan alanları gözden geçirmesi, tamamlaması ve göndermesi için bir form döndürür.

Bir Xamarin Uygulamasından PDF'lerden Metin Çıkarmak ve Birleştirmek Nasıl Yapılır?

Oluşturmanın ötesinde, IronPDF, API uç noktaları olarak expose edebileceğiniz geniş bir belge işlemleri yelpazesini destekler:

Bunların her biri ayrı bir API uç noktası haline gelir. Xamarin istemcisi, bunları başka bir REST kaynağı gibi çağırır, mobil kodunu PDF mantığından uzak tutar ve sunucuyu belgelerin yetkili işlemcisi yapar.

Yaygın Sorunlar Nelerdir ve Nasıl Düzeltirsiniz?

Sunucu-istemci mimarisi basittir, ancak dikkat edilmesi gereken birkaç üretim endişesi vardır:

Xamarin -- IronPDF API entegrasyonu için yaygın sorunlar ve önerilen düzeltmeler
SorunÇünküÖnerilen Çözüm
İstek zaman aşımıBirçok uzak varlık içeren karmaşık HTML'nin işlenmesi zaman alırHttpClient.Timeout'u artırın ve işleme seçeneklerinde sunucu tarafı zaman aşımını belirleyin
Büyük PDF bellek artışıYanıt gövdesinden 20 MB'lik bir PDF akışıBlob deposuna yükleyin ve bunun yerine kısa ömürlü bir indirme URL'si döndürün
Çevrimdışı oluşturmaKullanıcı bir PDF talep ettiğinde cihazda bağlantı yokİstekleri yerel olarak sıralayın ve bağlantı yeniden kurulduğunda yeniden deneyin
Yetkisiz API erişimiUç nokta internete açıkJWT veya API anahtarı ile güvence altına alın; tüm rotalarda HTTPS uygulayın
Yazı tipi gömülmemişSunucu OS'si yazı tipine sahip değilYazı tipini HTML içerisinde base64 veri URI'si veya bir CSS @font-face kuralı olarak gömün
iOS depolama izniUygulama iOS 14+ hedefliyor ve daha sıkı bir güvenlik ortamı varUygulama güvenlik kabuğu içinde Environment.SpecialFolder.MyDocuments'e yazın

Oranı sınırlamak için, AspNetCoreRateLimit gibi bir kütüphane kullanarak ASP.NET Core tarafında middleware ekleyin. Her üretim isteğini zamanlama verisiyle kaydedin, böylece kullanıcıları etkilemeden önce yavaş şablonları fark edebilirsiniz.

Xamarin'den .NET MAUI'ye Geçiş Yapmalı mısınız?

2026'da yeni bir mobil projeye başlıyorsanız, .NET MAUI doğru seçimdir. Microsoft, Mayıs 2024'te Xamarin desteğini sonlandırdı, bu da artık güvenlik yamaları veya hata düzeltmeleri sunulmayacağı anlamına gelir. .NET MAUI, doğrudan halefidir ve geçerli IronPDF çalışma zamanı ile eşleşen .NET 10'da çalışır.

Bu kılavuzda açıklanan sunucu tarafı mimarisi, .NET MAUI uygulamaları için identik çalışır -- istemci HTTP kodu esasen aynıdır; Sadece DependencyService, MAUI'nin yerleşik bağımlılık enjeksiyonu ile değiştirilir. Mevcut Xamarin uygulamalarını sürdüren ekipler, MAUI'ye geçişi planlamalı; Microsoft'un resmi .NET MAUI geçiş kılavuzu, adım adım ayrıntılı belgeler sunar.

IronPDF'yi Dağıtma ve Lisanslama Nasıl Yapılır?

Dağıtım basittir: ASP.NET Core API'yi Docker ile konteynırlaştırın ve Azure App Service, AWS ECS veya herhangi bir Kubernetes kümesine itin. IronPDF lisans anahtarı, sunucuda bir ortam değişkeni olarak ayarlanır:

IronPdf.License.LicenseKey = Environment.GetEnvironmentVariable("IRONPDF_LICENSE_KEY")
    ?? throw new InvalidOperationException("IronPDF license key not set.");

IronPDF lisanslama sayfasını inceleyerek dağıtımınıza uygun doğru katmanı seçin. ücretsiz deneme lisansı ile tam özellik setini test edin, sonra taahhütte bulunun. Konteynerleştirilen veya sunucusuz dağıtımlar için, lisans seviyesinin aynı anda çalışan sunucu örneklerinin sayısını kapsadığını kontrol edin.

Lisanslama sonrası, iplik güvenli render ayarları, PDF/A uyumu ve erişilebilirlik etiketleme dahil olmak üzere gelişmiş yapılandırma seçenekleri için IronPDF dokümantasyonu inceleyin.

Üretim Dağıtım Kontrol Listesi

IronPDF tabanlı bir PDF oluşturma API'si için dağıtım kontrol listesi
ÖğeÖneri
Lisans anahtarıÇevre değişkenlerinde veya bir gizli yöneticiye saklayın, asla kaynak kodda tutmayın
HTTPSTüm API uç noktalarında TLS uygulayın; düz HTTP üzerinden HTML yükleri göndermeyin
Kimlik DoğrulamaJWT taşıyıcı jetonlar veya API anahtarları kullanın; ihlal durumunda iptal edin
Önbelleğe almaTekrarlayan renderleri azaltmak için aynı HTML yüklerini kısa TTL ile önbelleğe alın
ÖlçeklemeIronPDF iplik güvenlidir; bir yük dengeleyici arkasında birden çok API replikası çalıştırın
İzlemeRender gecikmesi ve hata oranlarını izleyin; temel üzerinde dikenlenmelere karşı uyarı verin

Sunucu tarafı desen, Xamarin veya MAUI istemcisinde herhangi bir değişiklik olmadan yatay olarak ölçeklenir. PDF oluşturma hacmi arttıkça replikaları ekleyin ve istekleri eşit şekilde dağıtmak için yük dengeleyiciye güvenin.

Curtis Chau
Teknik Yazar

Curtis Chau, Bilgisayar Bilimleri alanında Lisans Derecesine (Carleton Üniversitesi) sahip ve Node.js, TypeScript, JavaScript ve React konularında uzmanlaşmış ön uç geliştirmeyle ilgileniyor. Sezgisel ve estetik açıdan hoş kullanıcı arayüzleri oluşturma tutkunu, Curtis modern çerçevelerle çalışmayı ve iyi yapılandırılmış, görsel olarak çekici kılavuzlar oluşturmayı seviyor.

...
Daha Fazla Oku

İlgili Makaleler

Key in blue circle

Ücretsiz 30 günlük Deneme Anahtarınızı anında edinin.

Your trial license will be sent to your email address

Herhangi bir sınırlama yoktur. %100 erişim. Kredi kartı gerekmez.

bullet_checkedKredi kartı veya hesap oluşturma gerektirmezHerhangi bir sınırlama yoktur. %100 erişim. Kredi kartı gerekmez.
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
Ücretsiz Canlı Demo rezervasyonu yapın
Booking Badge

Dünya Çapında Milyonlarca Mühendisin Güvendiği

Iron Software müşteri logoları
Bağımsız Danışmanlık Alın
Aşağıdaki formu doldurun veya sales@ironsoftware.com adresine e-posta gönderin
Bilgileriniz daima gizli kalacaktır.
Dünya Çapında Milyonlarca Mühendisin Güvendiği
Iron Software müşteri logoları
Ücretsiz 30 Günlük Deneme Anahtarınızı anında alın.
Kredi kartı veya hesap oluşturma gerektirmez