ASP.NET C#とIronPDFでPDFを新しいウィンドウで開く方法
Xamarin.FormsでPDFファイルを作成することは難しい場合があります。 ほとんど for .NET PDF ライブラリはモバイル アプリを直接サポートしていないため、デバイス上で PDF ドキュメントを生成しようとすると、エラーが発生したり、機能が欠落したりすることがよくあります。 ここでIronPDF が役立ちます。
IronPDF はXamarin.Forms アプリ内でネイティブには実行されませんが、サーバー側 API アプローチによってそのギャップがうまく埋められます。 モバイル アプリは HTML コンテンツを API に送信し、完成した PDF ファイルを受け取ります。これにより、フォーム、ヘッダー、フッター、画像、カスタム レイアウトを含むプロフェッショナルな PDF 生成機能にアクセスできます。
重要な注意: Microsoft は 2024 年 5 月に Xamarin のサポートを終了しました。新しいプロジェクトの場合、後継として.NET MAUIが推奨され、 IronPDF をより直接的にサポートします。 このガイドでは、まだメンテナンス中の従来の Xamarin プロジェクトのサーバー側パターンについて説明し、新しく始めるチーム向けの MAUI への移行パスについて説明します。
モバイル PDF 生成にサーバー側のアプローチが機能するのはなぜですか?
IronPDF は、CSS、 JavaScript、複雑なレイアウトを完全にサポートし、HTML コンテンツを洗練された PDF ドキュメントに変換することに優れています。 IronPDF をモバイル アプリケーション内ではなく専用サーバー上で実行することで、iOS および Android 上で直接デバイス上で PDF をレンダリングすることを妨げるプラットフォームの制約を回避できます。
サーバー側パターンには、いくつかの具体的な利点があります。
-一貫した出力:フォント、画像、CSS はサーバー側で解決されるため、Android と iOS ハードウェア間のレンダリングの違いがなくなります。 -機能アクセス: PDF フォームの作成、デジタル署名、透かし、複数ページのレイアウトなどのIronPDF機能はすべて、サーバー上で制限なく利用できます。 -より軽量なモバイル アプリ:デバイスは HTTP リクエストを送信し、返された PDF バイトを保存するだけです。重い PDF エンジンは携帯電話上で実行されません。 -集中ライセンス:各デバイスを個別にライセンスするのではなく、単一のIronPDFライセンスでサーバーの展開をカバーします。
Xamarin.Forms クライアントは API を呼び出し、バイト配列を受け取り、それをローカル ストレージに書き込み、オプションで PDF ビューアーを開きます。 その他すべてはサーバーが処理します。
IronPDF PDF 生成 API をどのように設定しますか?
まず、 ASP.NET Core Web API プロジェクトを作成します。 これは、Azure App Service、AWS、オンプレミス サーバー、Docker コンテナーなど、どこでもホストできる標準 for .NET 10 最小限 API です。
IronPDFをインストールする
以下のいずれかのコマンドを使用して、NuGetからIronPDFをインストールしてください:
Install-Package IronPdf
PDFコントローラーを作成する
IronPDFがインストールされたら、HTML を受け入れて PDF を返すコントローラーを追加します。
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 は、Chromiumベースのエンジンを使用してHTMLを現代のブラウザと同様にレンダリングします。 HTML から PDF への変換では、 CSS アニメーション、埋め込みフォント、SVG グラフィック、JavaScript で生成されたコンテンツが考慮されます。 用紙サイズと余白の設定は、最終的なドキュメントのレイアウトに直接反映されます。
ヘッダーとフッターを追加する
プロフェッショナルなドキュメントの場合は、レンダラーを呼び出す前にヘッダーとフッターを追加します。
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>"
}
ページ番号トークン{total-pages}はレンダー時に自動的に解決されます。
Xamarin クライアントをどのように実装しますか?
Xamarin.Forms アプリケーションで、API を呼び出すサービス クラスを作成します。 サービスをシンプルに保ちます。サービスの唯一の役割は、HTML ペイロードをシリアル化して送信し、生の PDF バイトを呼び出し元に返すことです。
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 秒のタイムアウトは、多数の画像や CSS リソースを含む複雑な HTML ドキュメントに対応します。 非常に大きなファイルの場合、バイナリを直接ストリーミングするのではなく、API から署名済みのダウンロード URL を返すことを検討してください。これにより、モバイル メモリの使用量が予測可能になります。
デバイスに PDF ファイルを保存して開くにはどうすればよいでしょうか?
サービスがバイト配列を返したら、それをデバイス ストレージに書き込み、プラットフォームの PDF ビューアーで開きます。 Xamarin.FormsはDependencyServiceパターンを使用してプラットフォーム固有の実装を呼び出します。
共有コードでインターフェースを定義します。
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の実装をDependencyServiceで登録してください:
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の場合、アプリの外部ファイルディレクトリに書き込み、URIをPDFビューアインテントに渡せるようにFileProviderをマニフェストに登録します。 共有コード内のDependencyService.Get<ISaveFile>()コールは、実行時に現在のプラットフォーム用に登録されている実装を取得します。
すべてを配線する
Xamarin.Forms ページまたは ViewModel で、サービスとプラットフォーム セーバーを組み合わせます。
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")
})
これにより、保存された PDF が、ユーザーがインストールしたビューア (通常は iOS と Android の両方のネイティブ PDF アプリケーション) で開きます。
プロフェッショナルな請求書とレポートの PDF をどのように生成しますか?
PDF の品質は、レンダラーに渡される HTML テンプレートの品質にほぼ完全に依存します。 C# の文字列補間または Scriban などのテンプレート ライブラリを使用して、データ駆動型の HTML を構築します。
public string BuildInvoiceHtml(Invoice invoice)
{
var rows = string.Join(
"\n",
invoice.アイテムs.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>アイテム</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.アイテムs.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>アイテム</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 アイテムs As List(Of アイテム)
Public Property GrandTotal As Decimal
End Class
Public Class アイテム
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.アイテムs.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>アイテム</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でブラウザと同様に正確にレンダリングされます。 IronPDF の透かし APIを使用して透かしを追加したり、機密の下書きにカスタムの透かしデザインを適用したりできます。 署名フィールドを必要とするドキュメントの場合、 IronPDF の署名サポートにより、サーバー側でデジタル署名プレースホルダーを埋め込むことができます。
Xamarin アプリで PDF フォームをどのように処理しますか?
PDFフォームは、モバイルビジネスアプリには一般的に求められる要件です。契約、オンボーディングのアンケート、検査チェックリストなどは、あらかじめ入力された編集可能フィールドの恩恵を受けます。 サーバー API は、HTML テンプレートと一緒にフィールド データを受け入れ、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");
}
[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
モバイル クライアントは、フィールド名と値の辞書を送信します。 サーバーはそれらを入力して、ユーザーが確認し、PDF ビューアで残りのフィールドを入力して送信できるフォームを返します。
Xamarin アプリからテキストを抽出して PDF を結合するにはどうすればよいですか?
生成以外にも、 IronPDF はAPI エンドポイントとして公開できる幅広いドキュメント操作をサポートしています。
- PDF からテキストを抽出: PDF コンテンツを解析してドキュメントのインデックスを作成したり、データ入力フォームを事前入力したりします。
- PDF の結合または分割:複数のレポートを 1 つの PDF に結合したり、大きなドキュメントをセクションごとのファイルに分割したりできます。
- PDF を画像に変換: PDF ページを PNG または JPEG サムネイルとしてレンダリングし、モバイル UI でプレビューします。
これらはそれぞれ個別の API エンドポイントになります。 Xamarin クライアントは、他の REST リソースと同様にこれらを呼び出し、モバイル コードを PDF ロジックから解放し、サーバーを信頼できるドキュメント プロセッサとして維持します。
よくある問題とその解決方法は何ですか?
サーバー クライアント アーキテクチャは単純ですが、いくつかの運用上の懸念事項に注意する必要があります。
| 課題 | 原因 | 推奨される修正 |
|---|---|---|
| リクエストタイムアウト | 多くのリモートアセットを含む複雑なHTMLはレンダリングに時間がかかります | HttpClient.Timeoutを増やし、レンダリング オプションでサーバー側のレンダリング タイムアウトを設定します。 |
| PDFメモリの急上昇 | レスポンスボディを通じて20 MBのPDFをストリーミングする | BLOB ストレージにアップロードし、代わりに短命のダウンロード URL を返します |
| オフライン生成 | ユーザーがPDFを要求したときにデバイスが接続されていない | リクエストをローカルでキューし、接続が回復したら再試行する |
| 不正なAPIアクセス | エンドポイントはインターネットに公開されています | JWT または API キーでセキュリティを確保し、すべてのルートで HTTPS を強制します。 |
| フォントが埋め込まれていません | サーバーOSにフォントがインストールされていません | フォントをbase64データURIまたはCSS @font-faceルールとしてHTMLに埋め込みます。 |
| iOSのストレージ権限 | アプリはより厳密なサンドボックス化によりiOS 14以降をターゲットにしている | アプリサンドボックス内のEnvironment.SpecialFolder.MyDocumentsに書き込む |
レート制限を行うには、 AspNetCoreRateLimitなどのライブラリを使用してASP.NET Core側にミドルウェアを追加します。 各生成リクエストをタイミング データとともにログに記録して、遅いテンプレートがユーザーに影響を与える前に見つけられるようにします。
Xamarin から.NET MAUIに移行する必要がありますか?
2026年に新しいモバイルプロジェクトを開始する場合、 .NET MAUIが最適な選択肢です。Microsoftは2024年5月にXamarinのサポートを終了したため、セキュリティパッチやバグ修正は今後提供されません。 .NET MAUIは直接の後継であり、現在のIronPDFランタイムと一致して.NET 10 上で実行されます。
このガイドで説明されているサーバー側アーキテクチャは、.NET MAUIアプリでも同じように動作します。クライアントの HTTP コードは基本的に同じです。 DependencyServiceのみがMAUIの組み込み依存性注入に置き換えられます。 既存の Xamarin アプリを保守しているチームは、MAUI への移行を計画する必要があります。 Microsoft の公式.NET MAUI移行ガイドには、手順が詳細に説明されています。
IronPDF を本番環境に導入し、ライセンスを取得するにはどうすればよいでしょうか?
デプロイメントは簡単です。ASP.NET ASP.NET Core API を Docker でコンテナー化し、Azure App Service、AWS ECS、または任意の Kubernetes クラスターにプッシュします。 IronPDFライセンス キーは、サーバー上の環境変数として設定されます。
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 のライセンス ページを確認して、展開に適した層を選択してください。 無料の試用ライセンスを使用すると、コミットする前に完全な機能セットをテストできます。 コンテナ化されたデプロイメントまたはサーバーレス デプロイメントの場合、ライセンス レベルが同時に実行されるサーバー インスタンスの数をカバーしていることを確認します。
ライセンスを取得したら、スレッドセーフなレンダリング設定、PDF/A 準拠、アクセシビリティ タグ付けなどの高度な構成オプションについては、 IronPDF のドキュメントを参照してください。
本番環境展開チェックリスト
| アイテム | 推奨事項 |
|---|---|
| ライセンスキー | 環境変数またはシークレット マネージャーに保存し、ソース コードには保存しないでください。 |
| HTTPS | すべての API エンドポイントで TLS を強制します。プレーン HTTP 経由で HTML ペイロードを送信しないでください。 |
| 認証 | JWTベアラートークンまたはAPIキーを使用する。違反があった場合は取り消す。 |
| キャッシング | 冗長なレンダリングを減らすために、同一の HTML ペイロードを短い TTL でキャッシュする |
| スケーリング | IronPDFはスレッドセーフです。ロードバランサーの背後で複数の API レプリカを実行します。 |
| モニタリング | レンダリングの遅延とエラー率を追跡し、ベースラインを超える急上昇があった場合にアラートを発令します。 |
サーバー側パターンは、Xamarin または MAUI クライアントに変更を加えることなく水平方向に拡張できます。 PDF 生成量の増加に応じてレプリカを追加し、ロード バランサーを使用してリクエストを均等に分散します。
よくある質問
IronPDFはXamarin.Formsでネイティブに使用できますか?
IronPDFはXamarin.Formsでネイティブに実行されませんが、サーバーサイドアプローチを使用してPDF作成と操作を処理するために統合できます。
モバイルアプリでのPDF生成にIronPDFを使用する利点は何ですか?
IronPDFを使用することで、PDFファイルを作成し、フォームを埋め、複数のページを扱い、画像、フォント、カスタムレイアウトを含めることができ、モバイルアプリのPDF生成機能を強化します。
IronPDFはXamarinでのPDF作成をどのように処理しますか?
IronPDFはサーバーサイドアプローチを使用してXamarinでPDFを生成し、通常モバイルデバイスでサポートされない複雑なPDF機能を実現します。
IronPDFを使用してXamarinでPDFフォームを埋めることは可能ですか?
はい、IronPDFはXamarinアプリケーション向けの包括的なPDF処理機能の一部としてPDFフォームを埋めることをサポートします。
XamarinでのPDF生成におけるIronPDFの課題は何ですか?
IronPDFはサーバーサイドソリューションを使用して、モバイルデバイスで直接PDFを生成する際のエラーや機能欠落といった課題に対処します。
IronPDFはXamarinアプリでのPDFのカスタムレイアウトを扱えますか?
はい、IronPDFは生成したPDFにカスタムレイアウトを含めることができ、ドキュメントのデザインとプレゼンテーションを制御できます。
XamarinでIronPDFを使用して実装できるPDF機能はどのようなものですか?
IronPDFを使用すると、マルチページドキュメント、フォーム入力、画像やフォントの組み込み、カスタムレイアウトをXamarinで実装できます。
なぜIronPDFを使用してXamarinでPDFを生成するのにサーバーサイドアプローチがお勧めですか?
サーバーサイドアプローチは、モバイルデバイスの制限を回避し、信頼性の高いPDF作成と高度な機能を保証するために推奨されます。

