Altbilgi içeriğine atla
IRONPDF KULLANARAK

Xamarin PDF Oluşturucu: IronPDF ile Mobil PDF Uygulamalari Oluşturun

Xamarin.Forms üzerinde 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şlevlere yol açar. İşte IronPDF devreye giriyor.

IronPDF bir Xamarin.Forms uygulaması içinde yerel olarak çalışmasa da, sunucu tarafı API yaklaşımı bu boşluğu temiz bir şekilde kapatıyor. Mobil uygulamanız HTML içeriği API'ye gönderir ve bitmiş PDF dosyalarını geri alır -- bu da profesyonel PDF oluşturma, formlar, başlıklar, alt bilgi, görüntüler ve özel düzenler dahil olmak üzere her şeyi erişilebilir hale getirir.

Önemli not: Microsoft, Mayıs 2024'te Xamarin desteğini sonlandırdı. Yeni projeler için, .NET MAUI önerilen halefidir ve IronPDF'i daha doğrudan destekler. Bu kılavuz, hala bakımı yapılan eski Xamarin projeleri için sunucu tarafı desenini anlatır ve yeni başlayan ekipler için MAUI'ye geçiş yolunu açıklar.

Neden Sunucu Tarafı Yaklaşım Mobil PDF Üretimi İçin Çalışır?

IronPDF, CSS, JavaScript ve karmaşık düzenler için tam destekle HTML içeriğini cilalı PDF belgelerine dönüştürme konusunda harikadır. IronPDF'i mobil uygulama içinde çalıştırmak yerine özel bir sunucuda çalıştırmak -- iOS ve Android üzerinde doğrudan cihazda PDF render'lemesini engelleyen platform kısıtlamalarını aşar.

Sunucu tarafı deseni birkaç somut avantaj sunar:

  • Tutarlı çıktı: Yazı tipleri, görüntüler ve CSS sunucu tarafında çözülür, Android ve iOS donanımı arasındaki render farklılıklarını ortadan kaldırır.
  • Özellik erişimi: IronPDF özellikleri, PDF form oluşturma, dijital imza, filigranlar ve çok sayfalı düzenler gibi her şey sınırlama olmadan sunucuda kullanılabilir.
  • Daha hafif mobil uygulama: Cihaz yalnızca bir HTTP isteği gönderir ve döndürülen PDF baytlarını saklar -- telefonda ağır bir PDF motoru çalışmaz.
  • Merkezileştirilmiş lisanslama: Tek bir IronPDF lisansı sunucu dağıtımınızı kapsar, her cihazı ayrı ayrı lisanslamak yerine.

Xamarin.Forms istemcisi API'yi çağırır, bir bayt dizisi alır, bunu yerel depolamaya yazar ve istenirse bir PDF görüntüleyiciyi açar. Sunucu geriye kalan her şeyi halleder.

IronPDF PDF Üretim API'si Nasıl Kurulur?

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

IronPDF Yükleyin

Bu komutlardan biriyle IronPDF'i NuGet'ten yükleyin:

Install-Package IronPdf
dotnet add package IronPdf
Install-Package IronPdf
dotnet add package IronPdf
SHELL

PDF Denetleyicisi Oluşturun

IronPDF yüklendiğinde, 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;
    }
}
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;
    }
}
Imports IronPdf
Imports Microsoft.AspNetCore.Mvc

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

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

        <HttpPost("generate")>
        Public Async Function GeneratePdf(<FromBody> request As PdfRequest) As Task(Of IActionResult)
            Dim 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

            Dim pdf = Await renderer.RenderHtmlAsPdfAsync(request.HtmlContent)
            Return File(pdf.BinaryData, "application/pdf", "document.pdf")
        End Function
    End Class

    Public Class PdfRequest
        Public Property HtmlContent As String = String.Empty
    End Class
End Namespace
$vbLabelText   $csharpLabel

ChromePdfRenderer, HTML'yi modern bir tarayıcı gibi tam olarak işlemek için Chromium tabanlı bir motor kullanır. HTML'den PDF'ye dönüştürme, CSS animasyonları, gömülü yazı tipleri, SVG grafikleri ve JavaScript ile oluşturulan içeriği dikkate alır. Sayfa boyutu ve kenar boşluğu ayarları doğrudan son belge düzenine çevrilir.

Başlıklar ve Altbilgiler Ekle

Profesyonel belgeler için, render edici çağırılmadan önce başlıklar ve alt bilgiler 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>"
};
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>"
};
Imports System

renderer.RenderingOptions.HtmlHeader = New HtmlHeaderFooter With {
    .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 With {
    .HtmlFragment = "<div style='text-align:center; font-size:11px;'>Generated by MyCompany App</div>"
}
$vbLabelText   $csharpLabel

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

Xamarin İstemcisi Nasıl Uygulanır?

Xamarin.Forms uygulamasında, API'yi çağıran bir servis sınıfı oluşturun. Servisi hafif tutun -- tek işi HTML yükünü serileştirmek, göndermek ve çağırana ham PDF baytlarını geri 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}");
        }
    }
}
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}");
        }
    }
}
Imports System.Net.Http
Imports System.Text
Imports System.Text.Json

Namespace XamarinPdfApp.Services
    Public Class PdfService
        Private ReadOnly _httpClient As HttpClient
        Private Const ApiUrl As String = "https://your-api.example.com/api/pdf/generate"

        Public Sub New()
            _httpClient = New HttpClient With {
                .Timeout = TimeSpan.FromSeconds(60)
            }
        End Sub

        Public Async Function GeneratePdfAsync(htmlContent As String) As Task(Of Byte())
            Dim payload = New With {Key .HtmlContent = htmlContent}
            Dim json = JsonSerializer.Serialize(payload)
            Dim content = New StringContent(json, Encoding.UTF8, "application/json")

            Dim response = Await _httpClient.PostAsync(ApiUrl, content)

            If response.IsSuccessStatusCode Then
                Return Await response.Content.ReadAsByteArrayAsync()
            End If

            Dim error = Await response.Content.ReadAsStringAsync()
            Throw New InvalidOperationException($"PDF generation failed ({CInt(response.StatusCode)}): {error}")
        End Function
    End Class
End Namespace
$vbLabelText   $csharpLabel

60 saniyelik bir zaman aşımı, birçok görüntü veya CSS kaynağı içeren karmaşık HTML belgelerine uygun. Çok büyük dosyalar için, ikili akışı doğrudan yerine API'den bir imzalı indirme URL'si döndürmeyi düşünün -- bu, mobil bellek kullanımını tahmin edilebilir kılar.

PDF Dosyalarını Cihazda Nasıl Kaydedip Açarsınız?

Servis bayt dizisini geri döndürdükten sonra 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 arayüzü tanımlayın:

using System.Threading.Tasks;

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

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

Namespace XamarinPdfApp.Interfaces
    Public Interface ISaveFile
        Function SavePdfAsync(filename As String, pdfData As Byte()) As Task(Of String)
    End Interface
End Namespace
$vbLabelText   $csharpLabel

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;
        }
    }
}
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;
        }
    }
}
Imports Foundation
Imports QuickLook
Imports UIKit
Imports XamarinPdfApp.Interfaces
Imports Xamarin.Forms

<Assembly: Dependency(GetType(XamarinPdfApp.iOS.SaveFileIOS))>
Namespace XamarinPdfApp.iOS
    Public Class SaveFileIOS
        Implements ISaveFile

        Public Async Function SavePdfAsync(filename As String, pdfData As Byte()) As Task(Of String) Implements ISaveFile.SavePdfAsync
            Dim documents = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)
            Dim filePath = System.IO.Path.Combine(documents, filename)
            Await System.IO.File.WriteAllBytesAsync(filePath, pdfData)
            Return filePath
        End Function
    End Class
End Namespace
$vbLabelText   $csharpLabel

Android için, uygulamanın dış dosyalar dizinine yazın ve URI'yi bir PDF görüntüleyici amacına verebilmeniz için manifestte bir FileProvider kaydedin. Paylaşılan kodda DependencyService.Get<ISaveFile>() çağrısı, çalıştırma zamanında geçerli platform için kaydedilen uygulamayı alır.

Hepsini Bir Araya Getirmek

Xamarin.Forms sayfanız 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")
});
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")
});
Dim htmlContent = BuildInvoiceHtml(invoice)
Dim pdfBytes = Await _pdfService.GeneratePdfAsync(htmlContent)
Dim saver = DependencyService.Get(Of ISaveFile)()
Dim filePath = Await saver.SavePdfAsync("invoice.pdf", pdfBytes)
Await Launcher.OpenAsync(New OpenFileRequest With {
    .File = New ReadOnlyFile(filePath, "application/pdf")
})
$vbLabelText   $csharpLabel

Bu, kaydedilen PDF'i kullanıcının kurulu olan neyse onu görüntülemekte, genellikle hem iOS hem de Android'de yerel bir PDF uygulaması olan her görüntüleyicide açar.

Profesyonel Fatura ve Rapor PDF'leri Nasıl Üretilir?

Bir PDF'in kalitesi neredeyse tamamen render ediciye geçirilen HTML şablonunun kalitesine bağlıdır. Veri odaklı HTML oluşturmak için C# dize enterpolasyonu veya Scriban gibi bir şablonlama kütüphanesi kullanın:

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>";
}
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>";
}
Imports System
Imports System.Linq

Public Function BuildInvoiceHtml(invoice As Invoice) As String
    Dim rows = String.Join(
        vbLf,
        invoice.Öğes.Select(Function(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>"
End Function
$vbLabelText   $csharpLabel

ChromePdfRenderer bu şablonu bir tarayıcı gibi tam olarak işliyor. IronPDF'in filigran API'sini kullanarak su işaretleri ekleyebilir veya gizli taslaklar için özel filigran tasarımları uygulayabilirsiniz. İmza alanı gerektiren belgeler için, IronPDF'in imza 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 gereksinimdir -- sözleşmeler, işe alım anketleri ve denetim kontrol listeleri, önceden doldurulmuş düzenlenebilir alanlardan fayda sağlar. Sunucu API'si, HTML şablonuyla birlikte alan verilerini kabul edebilir ve PDF'yi geri döndürmeden önce form değerlerini ekleyebilir:

[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");
}
[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");
}
Imports Microsoft.AspNetCore.Mvc
Imports IronPdf

<HttpPost("form")>
Public Async Function GenerateForm(<FromBody> request As FormRequest) As Task(Of IActionResult)
    Dim renderer As New ChromePdfRenderer()
    ' Render an HTML form template to create an interactive PDF form
    Dim pdf = Await renderer.RenderHtmlAsPdfAsync(request.HtmlTemplate)

    ' Fill known values before returning
    Dim form = pdf.Form
    For Each field In request.FieldValues
        Dim pdfField = form.Fields.FirstOrDefault(Function(f) f.Name = field.Key)
        If TypeOf pdfField Is IronPdf.Forms.PdfFormTextFieldField Then
            Dim textField = DirectCast(pdfField, IronPdf.Forms.PdfFormTextFieldField)
            textField.Value = field.Value
        End If
    Next

    Return File(pdf.BinaryData, "application/pdf", "form.pdf")
End Function
$vbLabelText   $csharpLabel

Mobil istemci, alan adları ve değerlerinden oluşan bir sözlük gönderir. Sunucu, bunları doldurur ve kullanıcıya gözden geçirebileceği, PDF görüntüleyicisinde herhangi bir kalan alanı doldurabileceği ve gönderebileceği bir form döndürür.

Bir Xamarin Uygulamasından Metin Çıkarma ve PDF'leri Birleştirme Nasıl Yapılır?

Üretimin ötesinde, IronPDF, API uç noktaları olarak sunabileceğiniz geniş bir belge işlemleri yelpazesini destekler:

Bunların her biri ayrı bir API uç noktası haline gelir. Xamarin istemcisi, mobil kodu PDF mantığından arındırarak ve sunucuyu yetkili belge işlemcisi olarak tutarak, diğer REST kaynakları gibi bunları çağırır.

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

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

Xamarin - IronPDF API entegrasyonu için yaygın sorunlar ve önerilen çözümler
SorunSebeplerÖnerilen Çözüm
İstek zaman aşımıBirçok uzak varlığa sahip karmaşık HTML'nin işlenmesi zaman alırHttpClient.Timeout'u artırın ve taraf sunucu işleme seçeneklerinde sunucu tarafı işleme zaman aşımı ayarlayın
Büyük PDF bellek sivrintisiYanıt gövdesi aracılığıyla 20 MB'lık bir PDF akışıBlob depolamaya yükleyin ve yerine kısa ömürlü bir indirme URL'si döndürün
Çevrimdışı oluşturmaKullanıcı bir PDF istediğinde cihaz bağlantısızdırİstekleri yerel olarak sıraya alın ve bağlantı geri geldiğinde yeniden deneyin
Yetkisiz API erişimiUç nokta internete açıktırJWT veya API anahtarıyla güvence altına alın; tüm yollarda HTTPS zorunlu tutun
Gömülü olmayan yazı tipiSunucu işletim sisteminde yazı tipi yüklü değilYazı tipini HTML'ye base64 verisi URI olarak veya CSS @font-face kuralı olarak ekleyin
iOS depolama izniUygulama, kutulanmış bir ortamın daha sıkı olduğu iOS 14+ hedefliyorUygulama sandığında Environment.SpecialFolder.MyDocuments'a yazın

Hız sınırlaması için ASP.NET Core tarafında AspNetCoreRateLimit gibi bir kütüphane kullanarak ara yazılım ekleyin. Yavaş şablonları kullanıcıları etkilemeden önce fark edebilmek için her oluşturma isteğini zamanlama verileri ile birlikte kaydedin.

Xamarin'den .NET MAUI'ye Göç Etmeli misiniz?

2026'da yeni bir mobil proje başlatıyorsanız, .NET MAUI doğru seçimdir. Microsoft, Mayıs 2024'te Xamarin desteğini sonlandırdı, yani artık güvenlik yamaları veya hata düzeltmeleri olmayacak. .NET MAUI doğrudan halefidir ve mevcut IronPDF çalışma zamanı ile uyumlu olan .NET 10'da çalışır.

Bu kılavuzda açıklanan sunucu tarafı mimari, .NET MAUI uygulamaları için aynı şekilde çalışır – istemci HTTP kodu temelde 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ıdır; Microsoft'un ayrıntılı adımları belgeleyen resmi .NET MAUI geçiş kılavuzu bulunmaktadır.

Üretim İçin IronPDF Nasıl Dağıtılır ve Lisanslanır?

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

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

IronPdf.License.LicenseKey = If(Environment.GetEnvironmentVariable("IRONPDF_LICENSE_KEY"), Throw New InvalidOperationException("IronPDF license key not set."))
$vbLabelText   $csharpLabel

Dağıtımınız için doğru katmanı seçmek üzere IronPDF lisanslama sayfasını inceleyin. Bir ücretsiz deneme lisansı, size taahhütte bulunmadan önce tam özellik setini test etme olanağı sağlar. Konteynerleştirilmiş veya sunucusuz dağıtımlar için, lisans katmanının aynı anda çalışan sunucu örnekleri sayısını kapsadığından emin olun.

Lisans aldıktan sonra, konu başına iş parçacığı güvenliği sağlayan ayarlar, PDF/A uyumluluğu ve erişilebilirlik etiketleme dahil olmak üzere gelişmiş yapılandırma seçenekleri için IronPDF belgelerini keşfedin.

Üretim Dağıtım Kontrol Listesi

IronPDF tabanlı PDF oluşturma API'si için dağıtım kontrol listesi
ÖğeÖneri
Lisans anahtarıKaynak kodunda asla saklamayın, ortam değişkenlerinde veya bir gizli yöneticiye yerleştirin
HTTPSTüm API uç noktalarında TLS'yi zorunlu tutun; HTML yüklerini düz HTTP üzerinden asla göndermeyin
Kimlik DoğrulamaJWT taşıyıcı belirteçleri veya API anahtarları kullanın; ihlal durumunda iptal edin
ÖnbelleklemeYinelenen işleme işlemleri azaltmak için kısa TTL için aynı HTML yüklerini önbelleğe alın
ÖlçeklendirmeIronPDF iş parçacığı güvenlidir; yük dengeleyici arkasında birden çok API çoğaltması çalıştırın
İzlemeTemel çizginin üzerindeki ani artışlarda uyarı almak için işleme gecikmesini ve hata oranlarını takip edin

Sunucu tarafı desen, Xamarin veya MAUI istemcisine hiçbir değişiklik yapmadan yatay olarak ölçeklenir. PDF oluşturma hacmi arttıkça, eşit şekilde istek dağıtımını sağlamak için yük dengeleyicisine güvenerek çoğaltmalar ekleyin.

Sıkça Sorulan Sorular

IronPDF, Xamarin.Forms içinde yerel olarak kullanılabilir mi?

IronPDF, Xamarin.Forms içinde yerel olarak çalışmaz, ancak PDF oluşturma ve manipülasyonu ele almak için sunucu-tarafı bir yaklaşım kullanılarak entegre edilebilir.

IronPDF'ü mobil uygulamalarda PDF oluşturmak için kullanmanın faydaları nelerdir?

IronPDF kullanarak PDF dosyaları oluşturabilir, formları doldurabilir, birden fazla sayfayı yönetebilir ve resimler, fontlar ve özel düzenler ekleyebilirsiniz. Bu özellikler mobil uygulama PDF oluşturma yeteneklerinizi geliştirir.

IronPDF, Xamarin'de PDF oluşturma işlemini nasıl ele alır?

IronPDF, Xamarin'de PDF'leri oluşturmak için sunucu-tarafı bir yaklaşım kullanır ve böylece tipik olarak mobil cihazlarda desteklenmeyen karmaşık PDF işlevlerini mümkün kılar.

IronPDF, Xamarin'de PDF formlarını doldurabilir mi?

Evet, IronPDF, Xamarin uygulamaları için kapsamlı PDF işleme özellikleri arasında PDF formlarını doldurmayı destekler.

IronPDF, Xamarin PDF oluşturma konusunda hangi zorluklara çözüm sunar?

IronPDF, doğrudan mobil cihazlarda PDF oluştururken ortaya çıkan hataları ve eksik işlevleri ele alan sunucu-tarafı bir çözüm sunar.

IronPDF, Xamarin uygulamalarında PDF'ler için özel düzenleri işleyebilir mi?

Evet, IronPDF oluşturulan PDF'lerde özel düzenleri içerebilir, bu da belgelerinizin tasarım ve sunumuna dair kontrol sağlar.

IronPDF kullanarak Xamarin'de hangi tür PDF özellikleri uygulanabilir?

IronPDF, Xamarin'de çok sayfalı belgeler, form doldurma, resim ve yazı tipi ekleme ve özel düzenler gibi özelliklerin uygulanmasına olanak tanır.

IronPDF ile Xamarin'de PDF oluşturmak için neden sunucu-tarafı bir yaklaşım önerilir?

Sunucu-tarafı bir yaklaşım, mobil cihazların sınırlamalarını geçtiği için önerilir ve güvenilir PDF oluşturma ve gelişmiş özellikler sağlar.

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