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
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>"
}
{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
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
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 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")
})
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} | 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 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} | 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 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
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:
- PDF'den metin çıkartma: PDF içeriğini analiz edin, belgeleri endeksleyin veya veri giriş formlarını önceden doldurun.
- PDF'leri Birleştirme veya Bölme: Birden fazla raporu tek bir PDF'de birleştirin veya büyük bir belgeyi bölüm dosyalarına ayırın.
- PDF'yi resme dönüştürme: PDF sayfalarını mobil UI'de önizleme için PNG veya JPEG küçük resimler olarak render edin.
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:
| Sorun | Çünkü | Önerilen Çözüm |
|---|---|---|
| İstek zaman aşımı | Birçok uzak varlık içeren karmaşık HTML'nin işlenmesi zaman alır | HttpClient.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şturma | Kullanı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şimi | Uç nokta internete açık | JWT 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ğil | Yazı tipini HTML içerisinde base64 veri URI'si veya bir CSS @font-face kuralı olarak gömün |
| iOS depolama izni | Uygulama iOS 14+ hedefliyor ve daha sıkı bir güvenlik ortamı var | Uygulama 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."))
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
| Öğe | Öneri |
|---|---|
| Lisans anahtarı | Çevre değişkenlerinde veya bir gizli yöneticiye saklayın, asla kaynak kodda tutmayın |
| HTTPS | Tüm API uç noktalarında TLS uygulayın; düz HTTP üzerinden HTML yükleri göndermeyin |
| Kimlik Doğrulama | JWT taşıyıcı jetonlar veya API anahtarları kullanın; ihlal durumunda iptal edin |
| Önbelleğe alma | Tekrarlayan renderleri azaltmak için aynı HTML yüklerini kısa TTL ile önbelleğe alın |
| Ölçekleme | IronPDF iplik güvenlidir; bir yük dengeleyici arkasında birden çok API replikası çalıştırın |
| İzleme | Render 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.

