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
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
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>"
}
{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
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
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
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")
})
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} | 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} | 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} | 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
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
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:
- PDF'den metin çıkar: Belgeleri indekslemek veya veri giriş formlarını önceden doldurmak için PDF içeriğini çözümle.
- PDF'leri birleştir ya da böl: Birkaç raporu tek bir PDF'de birleştir veya büyük bir belgeyi bölüm başına dosyalara böl.
- PDF'yi görüntüye çevir: Mobil UI'da önizleme için PDF sayfalarını PNG veya JPEG küçük resimleri olarak render et.
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:
| Sorun | Sebepler | Önerilen Çözüm |
|---|---|---|
| İstek zaman aşımı | Birçok uzak varlığa sahip karmaşık HTML'nin işlenmesi zaman alır | HttpClient.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 sivrintisi | Yanı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şturma | Kullanı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şimi | Uç nokta internete açıktır | JWT veya API anahtarıyla güvence altına alın; tüm yollarda HTTPS zorunlu tutun |
| Gömülü olmayan yazı tipi | Sunucu işletim sisteminde yazı tipi yüklü değil | Yazı tipini HTML'ye base64 verisi URI olarak veya CSS @font-face kuralı olarak ekleyin |
| iOS depolama izni | Uygulama, kutulanmış bir ortamın daha sıkı olduğu iOS 14+ hedefliyor | Uygulama 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."))
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
| Öğe | Öneri |
|---|---|
| Lisans anahtarı | Kaynak kodunda asla saklamayın, ortam değişkenlerinde veya bir gizli yöneticiye yerleştirin |
| HTTPS | Tüm API uç noktalarında TLS'yi zorunlu tutun; HTML yüklerini düz HTTP üzerinden asla göndermeyin |
| Kimlik Doğrulama | JWT taşıyıcı belirteçleri veya API anahtarları kullanın; ihlal durumunda iptal edin |
| Önbellekleme | Yinelenen işleme işlemleri azaltmak için kısa TTL için aynı HTML yüklerini önbelleğe alın |
| Ölçeklendirme | IronPDF iş parçacığı güvenlidir; yük dengeleyici arkasında birden çok API çoğaltması çalıştırın |
| İzleme | Temel ç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.




