Altbilgi içeriğine atla
IRONPDF KULLANARAK

IronPDF ve ASP.NET C# ile Yeni Pencerelerde PDF Nasıl Açılır

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:

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;
    }
}
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'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>"
};
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 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}");
        }
    }
}
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 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);
    }
}
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 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")
});
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, 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>";
}
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 Class Invoice
    Public Property Number As String
    Public Property Date As DateTime
    Public Property DueDate As DateTime
    Public Property ClientName As String
    Public Property GrandTotal As Decimal
    Public Property Öğes As List(Of InvoiceItem)
End Class

Public Class InvoiceItem
    Public Property Name As String
    Public Property Quantity As Integer
    Public Property UnitPrice As Decimal
    Public Property Total As Decimal
End Class

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 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");
}
[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, 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.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

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.

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ülasyonunu ele almak için sunucu taraflı bir yaklaşım kullanılarak entegre edilebilir.

Mobil uygulamalarda PDF oluşturmak için IronPDF kullanmanın avantajları nelerdir?

IronPDF kullanarak PDF dosyaları oluşturabilir, formları doldurabilir, birden fazla sayfayı yönetebilir ve resim, yazı tipleri ve özel düzenler ekleyebilirsiniz, bu da mobil uygulamalarınızın PDF oluşturma yeteneklerini artırır.

IronPDF, Xamarin'da PDF oluşturmayı nasıl ele alır?

IronPDF, Xamarin'da PDF'ler oluşturmak için sunucu taraflı bir yaklaşım kullanır ve bu, mobil cihazlarda genellikle desteklenmeyen karmaşık PDF işlevselliklerini mümkün kılar.

Xamarin'da IronPDF ile PDF formları doldurmak mümkün mü?

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

IronPDF, Xamarin PDF oluşturma sürecinde hangi zorlukları çözer?

IronPDF, mobil cihazlarda doğrudan PDF oluştururken karşılaşılan hatalar ve eksik işlevsellikler gibi zorlukları, sunucu taraflı bir çözüm kullanarak ele alır.

IronPDF, Xamarin uygulamalarındaki PDF'lerde özel düzenleri ele alabilir mi?

Evet, IronPDF, PDF'lerde özel düzenler ekleyebilir, belgelerinizin tasarımı ve sunumu üzerinde kontrol sağlayabilirsiniz.

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

IronPDF, Xamarin'da çok sayfalı belgeler, form doldurma, görüntü ve yazı tipi entegrasyonu ile özel düzenlerin uygulanmasına olanak tanır.

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

Mobil cihazların sınırlamalarını aşmak, güvenilir PDF oluşturma ve gelişmiş özellikler sağlamak amacıyla bir sunucu taraflı yaklaşım önerilir.

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ı...

Daha Fazla Oku

Iron Destek Ekibi

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