フッターコンテンツにスキップ
IRONPDFの使用

Xamarin PDF生成器:IronPDFでモバイルPDFアプリを構築する

Xamarin.FormsでPDFファイルを作成することは難しい場合があります。 ほとんどの.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 コンテナーなど、どこでもホストできる標準の.NET 10 最小限 API です。

IronPDFをインストールする

以下のいずれかのコマンドを使用して、NuGetからIronPDFをインストールしてください:

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

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
$vbLabelText   $csharpLabel

CODE-1755は、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>"
}
$vbLabelText   $csharpLabel

CODE-1756--@やCODE-1757--@のようなページ番号トークンは、レンダリング時に自動的に解決されます。

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

Androidの場合は、アプリの外部ファイルディレクトリに書き込み、マニフェストにFileProviderを登録して、PDFビューアインテントにURIを渡せるようにしてください。 共有コードの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")
})
$vbLabelText   $csharpLabel

これにより、保存された 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} &nbsp;|&nbsp; 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} &nbsp;|&nbsp; 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 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} &nbsp;|&nbsp; 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
$vbLabelText   $csharpLabel

このテンプレートは、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
$vbLabelText   $csharpLabel

モバイル クライアントは、フィールド名と値の辞書を送信します。 サーバーはそれらを入力して、ユーザーが確認し、PDF ビューアで残りのフィールドを入力して送信できるフォームを返します。

Xamarin アプリからテキストを抽出して PDF を結合するにはどうすればよいですか?

生成以外にも、 IronPDF はAPI エンドポイントとして公開できる幅広いドキュメント操作をサポートしています。

  • PDF からテキストを抽出: PDF コンテンツを解析してドキュメントのインデックスを作成したり、データ入力フォームを事前入力したりします。
  • PDF の結合または分割:複数のレポートを 1 つの PDF に結合したり、大きなドキュメントをセクションごとのファイルに分割したりできます。
  • PDF を画像に変換: PDF ページを PNG または JPEG サムネイルとしてレンダリングし、モバイル UI でプレビューします。

これらはそれぞれ個別の API エンドポイントになります。 Xamarin クライアントは、他の REST リソースと同様にこれらを呼び出し、モバイル コードを PDF ロジックから解放し、サーバーを信頼できるドキュメント プロセッサとして維持します。

よくある問題とその解決方法は何ですか?

サーバー クライアント アーキテクチャは単純ですが、いくつかの運用上の懸念事項に注意する必要があります。

Xamarin - IronPDF API 統合における一般的な問題と推奨される修正
課題原因推奨される修正
リクエストタイムアウト多くのリモートアセットを含む複雑な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 コードは基本的に同じです。 のみ、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."))
$vbLabelText   $csharpLabel

IronPDF のライセンス ページを確認して、展開に適した層を選択してください。 無料の試用ライセンスを使用すると、コミットする前に完全な機能セットをテストできます。 コンテナ化されたデプロイメントまたはサーバーレス デプロイメントの場合、ライセンス レベルが同時に実行されるサーバー インスタンスの数をカバーしていることを確認します。

ライセンスを取得したら、スレッドセーフなレンダリング設定、PDF/A 準拠、アクセシビリティ タグ付けなどの高度な構成オプションについては、 IronPDF のドキュメントを参照してください。

本番環境展開チェックリスト

IronPDF ベースの PDF 生成 API のデプロイメント チェックリスト
アイテム推奨事項
ライセンスキー環境変数またはシークレット マネージャーに保存し、ソース コードには保存しないでください。
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作成と高度な機能を保証するために推奨されます。

カーティス・チャウ
テクニカルライター

Curtis Chauは、カールトン大学でコンピュータサイエンスの学士号を取得し、Node.js、TypeScript、JavaScript、およびReactに精通したフロントエンド開発を専門としています。直感的で美しいユーザーインターフェースを作成することに情熱を持ち、Curtisは現代のフレームワークを用いた開発や、構造の良い視覚的に魅力的なマニュアルの作成を楽しんでいます。

開発以外にも、CurtisはIoT(Internet of Things)への強い関心を持ち、ハードウェアとソフトウェアの統合方法を模索しています。余暇には、ゲームをしたりDiscordボットを作成したりして、技術に対する愛情と創造性を組み合わせています。

アイアンサポートチーム

私たちは週5日、24時間オンラインで対応しています。
チャット
メール
電話してね