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

.NET PDF API .NET開発者のためのチュートリアル

How to Build a Centralized PDF Generation Service with ASP.NET Core and IronPDF.

最新のアプリケーションで作業する場合、.NET開発者は一元化されたPDF生成サービスを構築する必要性に気づくかもしれません。請求書、報告書、証明書、契約書のいずれを生成する場合でも、専用の.NET PDF APIを持つことは、PDFファイルを効率的に管理するために有益です。 では、PDF生成タスクをどのように改善することができるのでしょうか? これは、デスクトップおよびWebアプリケーション全体で一貫性、保守性、拡張性を提供することによって実現されます。 これまでにないほど、ドキュメントのコンテンツ、PDFページ、PDFフォームフィールドを管理することが簡単になりました。

このチュートリアルでは、ASP.NET Coreと強力な.NET PDFライブラリであるIronPDFを使用して、プロダクション対応のPDF APIを構築する方法を学びます。 HTMLからPDFを生成したり、文書をマージしたり、透かしを追加したり、Web APIでのさまざまな実践的なPDF生成シナリオを処理できるRESTfulエンドポイントを作成します。

専用PDF APIを構築する理由

.NET PDF API .NET開発者のためのチュートリアル:イメージ1 - PDF APIアーキテクチャ図

コードに飛び込む前に、専用PDF APIを作成する意義を理解しましょう:

  • ロジックの一元化:すべてのPDF生成ロジックが一箇所に集約されているため、メンテナンスや更新が容易です。
  • マイクロサービス・アーキテクチャ:異なるアプリケーションがPDF機能を必要とするサービス指向アーキテクチャに最適です。
  • パフォーマンスの最適化:大きなPDFファイル、複数のページ、動的なデータに対して、専用サービスの拡張と最適化を容易にします。
  • 言語にとらわれない:どのようなクライアントアプリケーションでも、プログラミング言語に関係なくAPIを利用できます。
  • 一貫した出力:組織全体のすべてのPDF文書が、一貫した文書レイアウト、段落書式、PDFコンテンツを維持するようにします。

構築開始の準備はできましたか? IronPDFの無料トライアルをダウンロードして、このチュートリアルに従って、.NET FrameworkプロジェクトでPDFファイルをプログラムで作成する方法を学びましょう。

IronPDF: 完全な.NET PDFライブラリ

.NET PDF API .NET開発者のためのチュートリアル:画像2 - .NET PDF API a tutorial for .NET developers に関連する7件の画像中2件目。

IronPDFは、.NET開発者のための最高のPDFライブラリとして際立っており、Web APIプロジェクトでのPDF生成を簡単で信頼性の高いものにする包括的な機能のセットを提供しています。 Chromeのレンダリングエンジン上に構築されているため、ピクセルパーフェクトなHTMLからPDFへの変換が可能です。 すべてのスタイリング、JavaScript実行、レスポンシブレイアウトを維持しながら、これを実行します。

IronPDFが.NET PDF API開発に理想的な理由となる主な機能:

  • Chromeベースのレンダリング:Google Chromeのレンダリングエンジンを活用し、HTMLコンテンツからPDFドキュメントを正確に変換し、埋め込まれた画像やその他のWeb資産を完全にサポートします。
  • 豊富な機能セット:デジタル署名、PDF フォーム、注釈、暗号化、圧縮など、新規および既存の文書の編集をサポートします。
  • セキュアなPDFドキュメントの作成:暗号化、電子署名、文書保護により、機密性の高い PDF コンテンツを管理します。
  • 複数の入力フォーマット:HTML、URL、画像Office文書を使用してPDF文書を作成します。
  • 高度な操作:PDF ページの結合、ドキュメントの分割、透かしの適用、インタラクティブな PDF フォームの作成、プログラムによる PDF ファイルの操作。
  • クロスプラットフォーム サポート: Windows、 Linux 、macOS、 Docker 、クラウド プラットフォームで動作します。
  • パフォーマンスの最適化:非同期操作、効率的なメモリ管理、高速レンダリング。

PDFドキュメントAPIプロジェクトのセットアップ方法

新しいASP.NET Core Web APIプロジェクトを作成し、必要なパッケージをインストールするところから始めましょう。

前提条件

  • .NET 6.0 SDK以降
  • Visual Studio 2022またはVisual Studio Code
  • Postmanまたは類似のAPIテストツールを使ったPDF REST APIのテスト

プロジェクトの作成

まず、PDF生成ツールを構築するプロジェクトを作成しましょう。

dotnet new webapi -n PdfApiService
cd PdfApiService
dotnet new webapi -n PdfApiService
cd PdfApiService
SHELL

IronPDFのインストール

次のステップは、NuGetを介してIronPDFをプロジェクトに追加することです。

dotnet add package IronPDF
dotnet add package IronPDF
SHELL

または、Visual StudioのNuGetパッケージマネージャーコンソールを使用して:

Install-Package IronPDF

プロジェクト構造

C#開発の重要な側面は、クリーンでよく構造化されたプロジェクトフォルダを維持することです。 例えば:

.NET PDF API .NET開発者のためのチュートリアル:イメージ3 - プロジェクトフォルダ構造

最初のPDFエンドポイントを作成する方法

HTMLをPDF形式に変換するシンプルなエンドポイントを構築しましょう。 まず、サービスインターフェースと実装を作成します:

PDFサービスの作成

まず、IPdfService.csファイルに以下を追加します:

public interface IPdfService
{
    byte[] GeneratePdfFromHtml(string htmlContent);
    byte[] GeneratePdfFromUrl(string url);
}
public interface IPdfService
{
    byte[] GeneratePdfFromHtml(string htmlContent);
    byte[] GeneratePdfFromUrl(string url);
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

PdfService.csファイルに、次のように追加します:

using IronPdf;
public class PdfService : IPdfService
{
    private readonly ChromePdfRenderer _renderer;
    public PdfService()
    {
        _renderer = new ChromePdfRenderer();
        // Configure rendering options for optimal PDF generation in .NET
        _renderer.RenderingOptions.MarginTop = 20;
        _renderer.RenderingOptions.MarginBottom = 20;
        _renderer.RenderingOptions.PrintHtmlBackgrounds = true;
    }
    public byte[] GeneratePdfFromHtml(string htmlContent)
    {
        // Generate PDF from HTML using the .NET PDF API
        var pdf = _renderer.RenderHtmlAsPdf(htmlContent);
        return pdf.BinaryData;
    }
    public byte[] GeneratePdfFromUrl(string url)
    {
        // Convert URL to PDF in the REST API
        var pdf = _renderer.RenderUrlAsPdf(url);
        return pdf.BinaryData;
    }
}
using IronPdf;
public class PdfService : IPdfService
{
    private readonly ChromePdfRenderer _renderer;
    public PdfService()
    {
        _renderer = new ChromePdfRenderer();
        // Configure rendering options for optimal PDF generation in .NET
        _renderer.RenderingOptions.MarginTop = 20;
        _renderer.RenderingOptions.MarginBottom = 20;
        _renderer.RenderingOptions.PrintHtmlBackgrounds = true;
    }
    public byte[] GeneratePdfFromHtml(string htmlContent)
    {
        // Generate PDF from HTML using the .NET PDF API
        var pdf = _renderer.RenderHtmlAsPdf(htmlContent);
        return pdf.BinaryData;
    }
    public byte[] GeneratePdfFromUrl(string url)
    {
        // Convert URL to PDF in the REST API
        var pdf = _renderer.RenderUrlAsPdf(url);
        return pdf.BinaryData;
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

PdfServiceは、HTMLをPDFに変換するコアプロセスを処理します。 IronPDFのChromePdfRendererを利用して、このクラスはページマージンや背景レンダリングのような賢明なデフォルトを設定し、洗練された最終ドキュメントを作成します。

コントローラーが生のHTMLを通過させると、サービスはIronPDFを使用してそれをプロフェッショナル品質のPDFにレンダリングし、その結果をダウンロード準備が整ったバイトデータとして返します。 また、URLを直接PDFに変換して、ウェブページ全体を処理することも可能です。

コントローラの作成

次に、APIのコントローラを作成する時が来ました。 これにより、HTMLからPDFファイルを生成するAPIエンドポイントが提供されます。 その後、PDFドキュメントをシステムにダウンロードして保存し、さらなる使用や共有が可能です。

// Controllers/PdfController.cs
using Microsoft.AspNetCore.Mvc;
[ApiController]
[Route("api/[controller]")]
public class PdfController : ControllerBase
{
    private readonly IPdfService _pdfService;
    public PdfController(IPdfService pdfService)
    {
        _pdfService = pdfService;
    }
    [HttpPost("html-to-pdf")]
    public IActionResult ConvertHtmlToPdf([FromBody] HtmlRequest request)
    {
        try
        {
            var pdfBytes = _pdfService.GeneratePdfFromHtml(request.HtmlContent);
            // Return as downloadable file
            return File(pdfBytes, "application/pdf", "document.pdf");
        }
        catch (Exception ex)
        {
            return BadRequest($"Error generating PDF: {ex.Message}");
        }
    }
}
// Controllers/PdfController.cs
using Microsoft.AspNetCore.Mvc;
[ApiController]
[Route("api/[controller]")]
public class PdfController : ControllerBase
{
    private readonly IPdfService _pdfService;
    public PdfController(IPdfService pdfService)
    {
        _pdfService = pdfService;
    }
    [HttpPost("html-to-pdf")]
    public IActionResult ConvertHtmlToPdf([FromBody] HtmlRequest request)
    {
        try
        {
            var pdfBytes = _pdfService.GeneratePdfFromHtml(request.HtmlContent);
            // Return as downloadable file
            return File(pdfBytes, "application/pdf", "document.pdf");
        }
        catch (Exception ex)
        {
            return BadRequest($"Error generating PDF: {ex.Message}");
        }
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

次に、HtmlRequest.csファイルに、次のように追加します:

// Models/HtmlRequest.cs
public class HtmlRequest
{
    public string HtmlContent { get; set; }
    public string FileName { get; set; } = "document.pdf";
}
// Models/HtmlRequest.cs
public class HtmlRequest
{
    public string HtmlContent { get; set; }
    public string FileName { get; set; } = "document.pdf";
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

最初のファイルでは、HTMLをダウンロード可能なPDFに変換するシンプルなAPIエンドポイントを設定します。 誰かが単純なPOSTリクエストでapi/pdf/html-to-pdfルートにHTMLコンテンツを送信すると、PdfControllerはそれをPDFに変換する仕事を専用のサービスに渡します。

PDFが作成されると、コントローラはそれをすぐにダウンロードできるファイルとしてユーザーに返します。リクエスト自体は、HtmlRequestモデルを使用して構造化され、生のHTMLと最終ドキュメントのオプションのファイル名の両方を運びます。 要するに、このセットアップにより、クライアントはHTMLを送信してすぐに洗練されたPDFを取得することが容易になります。

サービスの登録

PDFサービスを登録するために、Program.csを更新してください:

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
// Register PDF service
builder.Services.AddSingleton<IPdfService, PdfService>();
var app = builder.Build();
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}
app.UseHttpsRedirection();
app.MapControllers();
app.Run();
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
// Register PDF service
builder.Services.AddSingleton<IPdfService, PdfService>();
var app = builder.Build();
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}
app.UseHttpsRedirection();
app.MapControllers();
app.Run();
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

さまざまなレスポンスタイプの処理方法

APIは、クライアントのニーズに基づいてPDFを返すさまざまな方法をサポートすべきです:

[HttpPost("generate")]
public IActionResult GeneratePdf([FromBody] PdfRequest request)
{
    var pdfBytes = _pdfService.GeneratePdfFromHtml(request.HtmlContent);
    switch (request.ResponseType?.ToLower())
    {
        case "base64":
            return Ok(new
            {
                data = Convert.ToBase64String(pdfBytes),
                filename = request.FileName
            });
        case "inline":
            return File(pdfBytes, "application/pdf");
        default: // download
            return File(pdfBytes, "application/pdf", request.FileName);
    }
}
[HttpPost("generate")]
public IActionResult GeneratePdf([FromBody] PdfRequest request)
{
    var pdfBytes = _pdfService.GeneratePdfFromHtml(request.HtmlContent);
    switch (request.ResponseType?.ToLower())
    {
        case "base64":
            return Ok(new
            {
                data = Convert.ToBase64String(pdfBytes),
                filename = request.FileName
            });
        case "inline":
            return File(pdfBytes, "application/pdf");
        default: // download
            return File(pdfBytes, "application/pdf", request.FileName);
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

ここで、コントローラにより柔軟なPDF生成エンドポイントを追加しました。 常にファイルのダウンロードを強制する代わりに、GeneratePdfメソッドでは、クライアントがどのように結果を返したいかを選択できます。 このオプションは柔軟性を提供し、PDFをさまざまな形式で表示できるようにします:ダウンロード可能なファイルとして、ブラウザ内で直接表示、またはAPIで簡単に使用できるBase64文字列として。

リクエストはPdfRequestモデルで定義され、以前のHtmlRequestをベースに、ResponseTypeオプションが追加されています。 要するに、これにより、ユーザーがPDFを受け取る方法に関する制御が強まり、APIがもっと多様性を持ち、ユーザーフレンドリーになります。

今プログラムを実行すると、Swaggerでこの出力が表示されます。

.NET PDF API .NET開発者のためのチュートリアル:画像4 - Swagger UI.

共通のPDF操作を実装する方法

さまざまなPDF生成シナリオを処理するために、サービスを拡張しましょう:

URLからPDFへの変換

[HttpPost("url-to-pdf")]
public async Task<IActionResult> ConvertUrlToPdf([FromBody] UrlRequest request)
{
    try
    {
        var pdfBytes = await Task.Run(() =>
            _pdfService.GeneratePdfFromUrl(request.Url));
        return File(pdfBytes, "application/pdf",
            $"{request.FileName ?? "website"}.pdf");
    }
    catch (Exception ex)
    {
        return BadRequest($"Failed to convert URL: {ex.Message}");
    }
}
public class UrlRequest
{
    public string Url { get; set; }
    public string FileName { get; set; }
}
[HttpPost("url-to-pdf")]
public async Task<IActionResult> ConvertUrlToPdf([FromBody] UrlRequest request)
{
    try
    {
        var pdfBytes = await Task.Run(() =>
            _pdfService.GeneratePdfFromUrl(request.Url));
        return File(pdfBytes, "application/pdf",
            $"{request.FileName ?? "website"}.pdf");
    }
    catch (Exception ex)
    {
        return BadRequest($"Failed to convert URL: {ex.Message}");
    }
}
public class UrlRequest
{
    public string Url { get; set; }
    public string FileName { get; set; }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

このエンドポイントは、クライアントがURLを送信すると、そのウェブページのダウンロード可能なPDFを返します。 POST /api/pdf/url-to-pdf リクエストが来ると、コントローラは _pdfService を使用して、与えられた URL をバックグラウンドで PDF バイトに変換し、ファイルのダウンロードとして返します。 変換中に何かがうまくいかなかった場合、明確なエラーメッセージで優雅に応答します。

"https://www.apple.com/nz" のURLを使用してPOSTリクエストを試してみましょう。以下は取得した出力です。

出力

.NET PDF API .NET開発者のためのチュートリアル:画像5 - URL PDF出力

カスタム透かしの追加

public byte[] AddWatermarkFromFile(string filePath, string watermarkText)
{
    // Load PDF directly from file
    var pdf = PdfDocument.FromFile(filePath);
    pdf.ApplyWatermark(
        $"<h1 style='color:red;font-size:72px;'>{watermarkText}</h1>",
        75,
        IronPdf.Editing.VerticalAlignment.Middle,
        IronPdf.Editing.HorizontalAlignment.Center
    );
    return pdf.BinaryData;
}
public byte[] AddWatermarkFromFile(string filePath, string watermarkText)
{
    // Load PDF directly from file
    var pdf = PdfDocument.FromFile(filePath);
    pdf.ApplyWatermark(
        $"<h1 style='color:red;font-size:72px;'>{watermarkText}</h1>",
        75,
        IronPdf.Editing.VerticalAlignment.Middle,
        IronPdf.Editing.HorizontalAlignment.Center
    );
    return pdf.BinaryData;
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

ここでは、テスト目的のためにローカルファイルを手動で読み込んでいます。 ただし、PDF APIでPDFドキュメントを生成し、それにカスタムの透かしを適用するよう調整することができます。

透かしの出力

.NET PDF API .NET開発者のためのチュートリアル:画像6 - 上記のコード例からの透かし出力

テンプレートで動的データを追加する方法

実際の世界のアプリケーションでは、動的データを含むテンプレートからPDFを生成する必要がよくあります:

[HttpPost("from-template")]
public IActionResult GenerateFromTemplate([FromBody] TemplateRequest request)
{
    // Simple template replacement
    var html = request.Template;
    foreach (var item in request.Data)
    {
        html = html.Replace($"{{{{{item.Key}}}}}", item.Value);
    }
    var pdfBytes = _pdfService.GeneratePdfFromHtml(html);
    return File(pdfBytes, "application/pdf", request.FileName);
}
public class TemplateRequest
{
    public string Template { get; set; }
    public Dictionary<string, string> Data { get; set; }
    public string FileName { get; set; } = "document.pdf";
}
[HttpPost("from-template")]
public IActionResult GenerateFromTemplate([FromBody] TemplateRequest request)
{
    // Simple template replacement
    var html = request.Template;
    foreach (var item in request.Data)
    {
        html = html.Replace($"{{{{{item.Key}}}}}", item.Value);
    }
    var pdfBytes = _pdfService.GeneratePdfFromHtml(html);
    return File(pdfBytes, "application/pdf", request.FileName);
}
public class TemplateRequest
{
    public string Template { get; set; }
    public Dictionary<string, string> Data { get; set; }
    public string FileName { get; set; } = "document.pdf";
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Razor、Handlebars、他のエンジンを使用した高度なテンプレートシナリオについては、IronPDFのHTMLからPDFへのドキュメンテーションをご確認ください。 また、MVCアプリケーションでのCSHTMLからPDF変換や、BlazorアプリケーションでのRazorからPDF変換を探索することもできます。

パフォーマンスを最適化する方法

本番PDF APIを構築する際には、パフォーマンスが重要です。 最適化のための重要な戦略は以下の通りです:

非同期オペレーション

I/Oオペレーションを含むプロジェクトを構築する際には、非同期コーディングを使用するのが賢明です。 これは特に、PDFコンテンツが外部リソースから来る場合に役立ちます:

  • HTML ページのダウンロード (RenderUrlAsPdf<//code>)
  • 画像、CSS、フォントのHTTPによる取得
  • ディスクやクラウドストレージへの読み込み/書き込み

これらのオペレーションはスレッドをブロックする可能性がありますが、非同期を使用することでAPIスレッドが待機状態になることを防ぎます。

例:

public async Task<byte[]> GeneratePdfFromHtmlAsync(string htmlContent)
{
    return await Task.Run(() =>
    {
        var pdf = _renderer.RenderHtmlAsPdf(htmlContent);
        return pdf.BinaryData;
    });
}
public async Task<byte[]> GeneratePdfFromHtmlAsync(string htmlContent)
{
    return await Task.Run(() =>
    {
        var pdf = _renderer.RenderHtmlAsPdf(htmlContent);
        return pdf.BinaryData;
    });
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

レンダリングオプション

IronPDFを最適なパフォーマンスに設定します:

_renderer.RenderingOptions.EnableJavaScript = false; // If JS not needed
_renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print;
_renderer.RenderingOptions.RenderDelay = 0; // Remove if no JS
_renderer.RenderingOptions.Timeout = 30; // Set reasonable timeout
_renderer.RenderingOptions.EnableJavaScript = false; // If JS not needed
_renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print;
_renderer.RenderingOptions.RenderDelay = 0; // Remove if no JS
_renderer.RenderingOptions.Timeout = 30; // Set reasonable timeout
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

PDF APIをセキュリティで守る方法

セキュリティは、どの本番APIにおいても不可欠です。 シンプルなAPIキーベースの認証アプローチは以下の通りです:

// Middleware/ApiKeyMiddleware.cs
public class ApiKeyMiddleware
{
    private readonly RequestDelegate _next;
    private const string ApiKeyHeader = "X-API-Key";
    public ApiKeyMiddleware(RequestDelegate next)
    {
        _next = next;
    }
    public async Task InvokeAsync(HttpContext context)
    {
        if (!context.Request.Headers.TryGetValue(ApiKeyHeader, out var apiKey))
        {
            context.Response.StatusCode = 401;
            await context.Response.WriteAsync("API Key required");
            return;
        }
        // Validate API key (in production, check against database)
        var validApiKey = context.RequestServices
            .GetRequiredService<IConfiguration>()["ApiKey"];
        if (apiKey != validApiKey)
        {
            context.Response.StatusCode = 403;
            await context.Response.WriteAsync("Invalid API Key");
            return;
        }
        await _next(context);
    }
}
// In Program.cs
app.UseMiddleware<ApiKeyMiddleware>();
// Middleware/ApiKeyMiddleware.cs
public class ApiKeyMiddleware
{
    private readonly RequestDelegate _next;
    private const string ApiKeyHeader = "X-API-Key";
    public ApiKeyMiddleware(RequestDelegate next)
    {
        _next = next;
    }
    public async Task InvokeAsync(HttpContext context)
    {
        if (!context.Request.Headers.TryGetValue(ApiKeyHeader, out var apiKey))
        {
            context.Response.StatusCode = 401;
            await context.Response.WriteAsync("API Key required");
            return;
        }
        // Validate API key (in production, check against database)
        var validApiKey = context.RequestServices
            .GetRequiredService<IConfiguration>()["ApiKey"];
        if (apiKey != validApiKey)
        {
            context.Response.StatusCode = 403;
            await context.Response.WriteAsync("Invalid API Key");
            return;
        }
        await _next(context);
    }
}
// In Program.cs
app.UseMiddleware<ApiKeyMiddleware>();
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

高度な認証シナリオを検討してください:

実践例: 請求書生成API

完全な実装を示す実用的な請求書生成エンドポイントを構築しましょう。 この例はどのように本番環境の.NET PDF APIが動的データを持つプロフェッショナルな請求書を生成できるか示しています。

今IronPDFを始めましょう。
green arrow pointer

まず、Modelsフォルダ内に新しいファイルを作成します。 ここでは、Invoice.csとしました。 その後、新しいファイルに次のコードを追加します。

public class Invoice
{
    public string InvoiceNumber { get; set; }
    public DateTime Date { get; set; }
    public string CustomerName { get; set; }
    public string CustomerAddress { get; set; }
    public List<InvoiceItem> Items { get; set; }
    public decimal Tax { get; set; }
}
public class InvoiceItem
{
    public string Description { get; set; }
    public int Quantity { get; set; }
    public decimal UnitPrice { get; set; }
    public decimal Total => Quantity * UnitPrice;
}
public class Invoice
{
    public string InvoiceNumber { get; set; }
    public DateTime Date { get; set; }
    public string CustomerName { get; set; }
    public string CustomerAddress { get; set; }
    public List<InvoiceItem> Items { get; set; }
    public decimal Tax { get; set; }
}
public class InvoiceItem
{
    public string Description { get; set; }
    public int Quantity { get; set; }
    public decimal UnitPrice { get; set; }
    public decimal Total => Quantity * UnitPrice;
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

次に、請求書ジェネレーターのための新しいサービスファイルを作成する必要があります。 Servicesフォルダ内に次のコードを追加します。 私の場合は、InvoiceService.csという新しいファイルを作りました。 このコードはInvoice PDFファイルのスタイリングとレイアウトの処理をします。

public class InvoiceService
{
    private readonly ChromePdfRenderer _renderer;
    public InvoiceService()
    {
        _renderer = new ChromePdfRenderer();
        _renderer.RenderingOptions.MarginTop = 10;
        _renderer.RenderingOptions.MarginBottom = 10;
        _renderer.RenderingOptions.PrintHtmlBackgrounds = true;
    }
    public byte[] GenerateInvoice(Invoice invoice)
    {
        var html = BuildInvoiceHtml(invoice);
        // Add footer with page numbers
        _renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
        {
            MaxHeight = 15,
            HtmlFragment = "<center><i>{page} of {total-pages}</i></center>",
            DrawDividerLine = true
        };
        var pdf = _renderer.RenderHtmlAsPdf(html);
        return pdf.BinaryData;
    }
    private string BuildInvoiceHtml(Invoice invoice)
    {
        var subtotal = invoice.Items.Sum(i => i.Total);
        var taxAmount = subtotal * (invoice.Tax / 100);
        var total = subtotal + taxAmount;
        var itemsHtml = string.Join("", invoice.Items.Select(item =>
            $@"<tr>
                <td>{item.Description}</td>
                <td class='text-center'>{item.Quantity}</td>
                <td class='text-right'>${item.UnitPrice:F2}</td>
                <td class='text-right'>${item.Total:F2}</td>
            </tr>"));
        return $@"
        <!DOCTYPE html>
        <html>
        <head>
            <style>
                body {{ font-family: Arial, sans-serif; }}
                .invoice-header {{
                    background-color: #f8f9fa;
                    padding: 20px;
                    margin-bottom: 20px;
                }}
                table {{
                    width: 100%;
                    border-collapse: collapse;
                }}
                th, td {{
                    padding: 10px;
                    border-bottom: 1px solid #ddd;
                }}
                th {{
                    background-color: #007bff;
                    color: white;
                }}
                .text-right {{ text-align: right; }}
                .text-center {{ text-align: center; }}
                .total-section {{
                    margin-top: 20px;
                    text-align: right;
                }}
            </style>
        </head>
        <body>
            <div class='invoice-header'>
                <h1>Invoice #{invoice.InvoiceNumber}</h1>
                <p>Date: {invoice.Date:yyyy-MM-dd}</p>
            </div>
            <div>
                <h3>Bill To:</h3>
                <p>{invoice.CustomerName}<br/>{invoice.CustomerAddress}</p>
            </div>
            <table>
                <thead>
                    <tr>
                        <th>Description</th>
                        <th>Quantity</th>
                        <th>Unit Price</th>
                        <th>Total</th>
                    </tr>
                </thead>
                <tbody>
                    {itemsHtml}
                </tbody>
            </table>
            <div class='total-section'>
                <p>Subtotal: ${subtotal:F2}</p>
                <p>Tax ({invoice.Tax}%): ${taxAmount:F2}</p>
                <h3>Total: ${total:F2}</h3>
            </div>
        </body>
        </html>";
    }
}
public class InvoiceService
{
    private readonly ChromePdfRenderer _renderer;
    public InvoiceService()
    {
        _renderer = new ChromePdfRenderer();
        _renderer.RenderingOptions.MarginTop = 10;
        _renderer.RenderingOptions.MarginBottom = 10;
        _renderer.RenderingOptions.PrintHtmlBackgrounds = true;
    }
    public byte[] GenerateInvoice(Invoice invoice)
    {
        var html = BuildInvoiceHtml(invoice);
        // Add footer with page numbers
        _renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
        {
            MaxHeight = 15,
            HtmlFragment = "<center><i>{page} of {total-pages}</i></center>",
            DrawDividerLine = true
        };
        var pdf = _renderer.RenderHtmlAsPdf(html);
        return pdf.BinaryData;
    }
    private string BuildInvoiceHtml(Invoice invoice)
    {
        var subtotal = invoice.Items.Sum(i => i.Total);
        var taxAmount = subtotal * (invoice.Tax / 100);
        var total = subtotal + taxAmount;
        var itemsHtml = string.Join("", invoice.Items.Select(item =>
            $@"<tr>
                <td>{item.Description}</td>
                <td class='text-center'>{item.Quantity}</td>
                <td class='text-right'>${item.UnitPrice:F2}</td>
                <td class='text-right'>${item.Total:F2}</td>
            </tr>"));
        return $@"
        <!DOCTYPE html>
        <html>
        <head>
            <style>
                body {{ font-family: Arial, sans-serif; }}
                .invoice-header {{
                    background-color: #f8f9fa;
                    padding: 20px;
                    margin-bottom: 20px;
                }}
                table {{
                    width: 100%;
                    border-collapse: collapse;
                }}
                th, td {{
                    padding: 10px;
                    border-bottom: 1px solid #ddd;
                }}
                th {{
                    background-color: #007bff;
                    color: white;
                }}
                .text-right {{ text-align: right; }}
                .text-center {{ text-align: center; }}
                .total-section {{
                    margin-top: 20px;
                    text-align: right;
                }}
            </style>
        </head>
        <body>
            <div class='invoice-header'>
                <h1>Invoice #{invoice.InvoiceNumber}</h1>
                <p>Date: {invoice.Date:yyyy-MM-dd}</p>
            </div>
            <div>
                <h3>Bill To:</h3>
                <p>{invoice.CustomerName}<br/>{invoice.CustomerAddress}</p>
            </div>
            <table>
                <thead>
                    <tr>
                        <th>Description</th>
                        <th>Quantity</th>
                        <th>Unit Price</th>
                        <th>Total</th>
                    </tr>
                </thead>
                <tbody>
                    {itemsHtml}
                </tbody>
            </table>
            <div class='total-section'>
                <p>Subtotal: ${subtotal:F2}</p>
                <p>Tax ({invoice.Tax}%): ${taxAmount:F2}</p>
                <h3>Total: ${total:F2}</h3>
            </div>
        </body>
        </html>";
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

最後に、新しい請求書をAPIを通じて作成およびアクセスするための新しいコントローラーを作成する必要があります。

[ApiController]
[Route("api/[controller]")]
public class InvoiceController : ControllerBase
{
    private readonly InvoiceService _invoiceService;
    public InvoiceController(InvoiceService invoiceService)
    {
        _invoiceService = invoiceService;
    }
    [HttpPost("generate")]
    public IActionResult GenerateInvoice([FromBody] Invoice invoice)
    {
        try
        {

```cs
public IActionResult GeneratePDF(Invoice invoice)
{
    try
    {
        var pdfBytes = _invoiceService.GenerateInvoice(invoice);
        var fileName = $"Invoice_{invoice.InvoiceNumber}.pdf";
        return File(pdfBytes, "application/pdf", fileName);
    }
    catch (Exception ex)
    {
        return StatusCode(500, $"Error generating invoice: {ex.Message}");
    }
}
[ApiController]
[Route("api/[controller]")]
public class InvoiceController : ControllerBase
{
    private readonly InvoiceService _invoiceService;
    public InvoiceController(InvoiceService invoiceService)
    {
        _invoiceService = invoiceService;
    }
    [HttpPost("generate")]
    public IActionResult GenerateInvoice([FromBody] Invoice invoice)
    {
        try
        {

```cs
public IActionResult GeneratePDF(Invoice invoice)
{
    try
    {
        var pdfBytes = _invoiceService.GenerateInvoice(invoice);
        var fileName = $"Invoice_{invoice.InvoiceNumber}.pdf";
        return File(pdfBytes, "application/pdf", fileName);
    }
    catch (Exception ex)
    {
        return StatusCode(500, $"Error generating invoice: {ex.Message}");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

請求書の出力

.NET PDF API .NET開発者のためのチュートリアル:画像7 - PDF請求書出力

コンテナーデプロイメントの考慮

このチュートリアルはローカル開発に焦点を当てていますが、PDF APIをコンテナ化する簡単な概要は以下の通りです:

基本的なDockerfile

FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
WORKDIR /app
EXPOSE 80
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
COPY ["PdfApiService.csproj", "."]
RUN dotnet restore
COPY . .
RUN dotnet build -c Release -o /app/build
FROM build AS publish
RUN dotnet publish -c Release -o /app/publish
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
# IronPDF requires additional dependencies on Linux
RUN apt-get update && apt-get install -y \
    libgdiplus \
    libc6-dev \
    libx11-dev \
    && rm -rf /var/lib/apt/lists/*
ENTRYPOINT ["dotnet", "PdfApiService.dll"]

あなたの.NET PDF APIのための詳細なデプロイメントガイドはこちら:

エラーハンドリングのベストプラクティス

より耐障害性のあるプログラムを作成するために、以下のような一貫したエラーレスポンスのためのグローバルエラーハンドラーを実装することがベストプラクティスです:

// Middleware/ErrorHandlingMiddleware.cs
public class ErrorHandlingMiddleware
{
    private readonly RequestDelegate _next;
    public ErrorHandlingMiddleware(RequestDelegate next)
    {
        _next = next;
    }
    public async Task InvokeAsync(HttpContext context)
    {
        try
        {
            await _next(context);
        }
        catch (Exception ex)
        {
            await HandleExceptionAsync(context, ex);
        }
    }
    private static async Task HandleExceptionAsync(HttpContext context, Exception ex)
    {
        context.Response.ContentType = "application/json";
        context.Response.StatusCode = 500;
        var response = new
        {
            error = "An error occurred processing your request",
            message = ex.Message
        };
        await context.Response.WriteAsync(JsonSerializer.Serialize(response));
    }
}
// Middleware/ErrorHandlingMiddleware.cs
public class ErrorHandlingMiddleware
{
    private readonly RequestDelegate _next;
    public ErrorHandlingMiddleware(RequestDelegate next)
    {
        _next = next;
    }
    public async Task InvokeAsync(HttpContext context)
    {
        try
        {
            await _next(context);
        }
        catch (Exception ex)
        {
            await HandleExceptionAsync(context, ex);
        }
    }
    private static async Task HandleExceptionAsync(HttpContext context, Exception ex)
    {
        context.Response.ContentType = "application/json";
        context.Response.StatusCode = 500;
        var response = new
        {
            error = "An error occurred processing your request",
            message = ex.Message
        };
        await context.Response.WriteAsync(JsonSerializer.Serialize(response));
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

特定のIronPDFトラブルシューティングシナリオについては、IronPDFトラブルシューティングガイドを参照してください。

結論

これで、ASP.NET CoreおよびIronPDFを使用した強力な.NET PDF APIを構築し、さまざまなドキュメント生成のシナリオを処理できるようになりました。 このREST APIは、アプリケーション全体で集中管理されたPDF操作のための堅牢な基盤を提供します。

主なポイント:

  • IronPdfはChromeベースのレンダリングにより、Web APIプロジェクトでのPDF生成を簡単にします。
  • IronPDFの高度な編集ツールを使って、既存のPDFドキュメントを編集するためのWeb APIを簡単に調整することができます。
  • RESTful設計の原則は、PDF APIが直感的で保守可能であることを保証します。
  • 適切なエラー処理とセキュリティ対策は、本番環境では不可欠です。
  • 非同期操作とキャッシュによるパフォーマンスの最適化により、スケーラビリティが向上します。
  • スケーラブルなドキュメントソリューションで、デスクトップおよびウェブアプリケーションをサポートしていただきます。

IronPDFは開発者にPDFドキュメントを作成し、PDFファイルを保存し、HTMLを効率的に変換させることで、現代の.NET Frameworkアプリケーションに必須のPDFドキュメントAPIを提供します。

次のステップ

本番用.NET PDF APIにIronPDFを実装する準備はできましたか? 次のアクションはこちらです:

1.無料トライアルを開始 - IronPDFの全機能を開発環境でテストしてください。 2.高度な機能を探求する - デジタル署名PDFフォーム、およびその他の高度なPDF機能をチェックしてください。

3.自信を持って拡張する - 本番APIのニーズのために、ライセンスオプションを確認してください。

あなたの.NET PDF APIを今日構築して、アプリケーション全体のドキュメント生成をIronPDFで合理化してください!

よくある質問

IronPDFは.NETアプリケーションで何に使われていますか?

IronPDFは.NETアプリケーション内でPDFを生成、操作、変換するために使用され、集中型PDFサービスの作成に理想的です。

IronPDF はどのようにASP.NET Coreと統合できますか?

IronPDF NuGetパッケージをインストールすることで、IronPDFをASP.NET Coreに統合し、集中型のPDF生成サービスを構築することができます。

PDF生成のためのIronPdfの主な機能は何ですか?

IronPDFの主な機能には、HTMLからPDFへの変換、PDFの結合と分割、ヘッダーとフッターの追加、テキストと画像の抽出などがあります。

IronPdfは複雑なPDFレイアウトに対応できますか?

IronPDFはHTMLやCSSのコンテンツを正確にレンダリングされたPDFドキュメントに変換するため、複雑なPDFレイアウトを扱うことができます。

IronPDFでPDF作成をカスタマイズすることは可能ですか?

はい、IronPdfはPDFの作成において、ページサイズや余白の設定、透かしや注釈の追加などのカスタマイズが可能です。

IronPDFはPDFのセキュリティ機能をサポートしていますか?

IronPDFは生成されたPDFドキュメントを保護するためにパスワード保護や暗号化などのPDFセキュリティ機能をサポートしています。

IronPDFはどのようなフォーマットをPDFに変換できますか?

IronPdfはHTML、URL、ASPXファイルを含む様々なフォーマットをPDFに変換することができます。

IronPDFはどのように大規模なPDF生成に対応していますか?

IronPDFはパフォーマンスのために最適化されており、.NETアプリケーション内で大規模なPDF生成タスクを効率的に処理することができます。

IronPDFはクラウドベースのアプリケーションで使用できますか?

はい、IronPdfはクラウドベースのアプリケーションで使用することができ、スケーラブルなPDFサービスのためにAzureやAWSのようなプラットフォームへのデプロイをサポートします。

IronPDFはどのバージョンの.NETをサポートしていますか?

IronPDFは.NET Coreと.NET Frameworkを含む複数の.NETバージョンをサポートし、幅広いプロジェクトとの互換性を保証します。

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

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

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