ExcelやPDFファイルを出力するWeb APIをAzure Container Appsで動かしてみる

本記事では「DioDocs(ディオドック)」を使用してExcelやPDFファイルを出力するASP.NET Core Web APIアプリケーションを作成し、Azure Container Appsにデプロイして動作を確認してみます。

Azure Container Appsとは?

「Azure Container Apps」は昨年の「Microsoft Build 2022」でGAになった、Azureでコンテナー化されたアプリケーションを実行するためのフルマネージドなサービスです。

Azure Container Apps を使用すると、サーバーレス プラットフォームでマイクロサービスとコンテナー化されたアプリケーションを実行できます。

Container Appsを使用すると、クラウドインフラストラクチャや複雑なコンテナーオーケストレーターを手動で管理する必要がなくなり、コンテナーを実行するメリットが得られます。

https://docs.microsoft.com/ja-jp/azure/container-apps/overview

ASP.NET Core Web APIアプリケーションの作成

実装する内容

ASP.NET Core Web APIでは、.NET 6から「Minimal API」が利用できるようになっています。Minimal APIでは、従来のコントローラーをベースにしたWeb APIの作成方法よりも、以下のようなシンプルな記述でWeb APIを作成することができます。今回はこちらのMinimal APIを利用してWeb APIを作成します。

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

app.MapGet("/get", () => "Hello World!");
app.Run();
Minimal API

Minimal APIで作成したWeb APIの実行時に、DioDocsを使用してExcelとPDFファイルを作成し、HTTPリクエストのクエリパラメータで受け取った文字列を各ファイルへ追加します。その後、作成したファイルをHTTPレスポンスで直接ローカルへ出力する、といった内容です。

アプリケーションの作成

プロジェクトテンプレートから「ASP.NET Core Web API」を選択します。プロジェクト名には「DioDocsWebApiApp1」を設定します。

アプリケーションの作成(1)

「Docker を有効にする」のチェックをONにして「コントローラーを使用する (最小限の API を使用する場合にはオフにします)」のチェックをOFFにして[作成]をクリックします。

アプリケーションの作成(2)

NuGetパッケージの追加

Visual Studioのソリューションエクスプローラーでプロジェクトを右クリックして[NuGet パッケージの管理]を選択します。「NuGet パッケージ マネージャー」からDioDocsのパッケージGrapeCity.DioDocs.Excel.jaGrapeCity.DioDocs.Pdf.jaをインストールします。

NuGetパッケージの追加

DioDocs for Excelを使うコードを追加

以下のようにProgram.csに以下のコードを追加します。Web APIの/excelexportを実行するとクエリパラメータnameで渡した文字列をワークシートのセルに追加してExcelファイルとして出力します。

app.MapGet("/excelexport", ([FromQuery(Name = "name")] string? name, 
                            HttpResponse response) =>
{
    var workbook = new Workbook();
    workbook.Worksheets[0].Range["A1"].Value = $"こんにちは、{name}!";

    using var ms = new MemoryStream();
    workbook.Save(ms, SaveFileFormat.Xlsx);

    response.Headers.Add("Content-Disposition", "attachment;filename=Result.xlsx");
    response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
    response.Body.WriteAsync(ms.ToArray());

}).WithName("GetExcelExport");

DioDocs for PDFを使うコードを追加

以下のようにProgram.csのコードを更新します。Web APIの/pdfexportを実行するとクエリパラメータnameで渡した文字列をPDFドキュメントに追加してPDFファイルとして出力します。

app.MapGet("/pdfexport", ([FromQuery(Name = "name")] string? name, 
                          HttpResponse response) =>
{
    var doc = new GcPdfDocument();
    var g = doc.NewPage().Graphics;

    g.DrawString($"こんにちは、{name}!",
                 new TextFormat()
                 {
                     FontName = "IPAexゴシック",
                     FontSize = 12
                 },
                 new PointF(72, 72));

    using var ms = new MemoryStream();
    doc.Save(ms, false);

    response.Headers.Add("Content-Disposition", "attachment;filename=Result.pdf");
    response.ContentType = "application/pdf";
    response.Body.WriteAsync(ms.ToArray());

}).WithName("GetPdfExport");

Visual Studioで開発する際の注意点

Visual StudioではProgram.csなどのソースファイルを保存する際の文字コードはデフォルトが「Shift-JIS」となっています。このままAzure Container Appsへデプロイして実行するとPDFファイルに出力する日本語文字列が文字化けします。この文字化けを解消するためにVisual Studioでソースファイルを保存する際は「UTF-8」を設定して保存する必要があります。

Visual Studioで開発する際の注意点(1)
Visual Studioで開発する際の注意点(2)

Dockerfileの修正

上記でソースファイルを保存する際の文字コードを変更しましたが、実行環境(Linux)に日本語フォント(本記事ではIPAexフォント)がインストールされていない状態なので、まだ日本語文字列が文字化けします。

そこで以下を参考にしてDockerfileに日本語フォントをインストールするコードを追加します。

#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.

FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

#フォントのインストール
RUN apt-get update && apt-get install -y wget && apt-get install -y zip unzip && apt-get install -y fontconfig
RUN wget https://moji.or.jp/wp-content/ipafont/IPAexfont/IPAexfont00401.zip
RUN unzip IPAexfont00401.zip
RUN mkdir -p /usr/share/fonts/ipa
RUN cp IPAexfont00401/*.ttf /usr/share/fonts/ipa
RUN fc-cache -fv

FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
COPY ["DioDocsWebApiAzContainerApps/DioDocsWebApiAzContainerApps.csproj", "DioDocsWebApiAzContainerApps/"]
RUN dotnet restore "DioDocsWebApiAzContainerApps/DioDocsWebApiAzContainerApps.csproj"
COPY . .
WORKDIR "/src/DioDocsWebApiAzContainerApps"
RUN dotnet build "DioDocsWebApiAzContainerApps.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "DioDocsWebApiAzContainerApps.csproj" -c Release -o /app/publish /p:UseAppHost=false

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "DioDocsWebApiAzContainerApps.dll"]

Azure Container Appsにデプロイして確認

Visual Studioのソリューションエクスプローラーでプロジェクトを右クリックして[発行]を選択します。デプロイ先のサービスとして「Azure Container Apps (Linux)」を選択します。

Azure Container Appsにデプロイして確認(1)

続けてコンテナーアプリとレジストリ、ビルド方法をそれぞれ設定します。最後に[完了]ボタンをクリックして実行プロファイルを作成します。

Azure Container Appsにデプロイして確認(2)
Azure Container Appsにデプロイして確認(3)
Azure Container Appsにデプロイして確認(4)

[発行]ボタンをクリックしてデプロイを開始します。

Azure Container Appsにデプロイして確認(5)

デプロイが完了すると、アプリケーションのURLでブラウザが起動します。

Azure Container Appsにデプロイして確認(6)

ASP.NET Core Web APIのテンプレートではデフォルトでSwagger UIは開発環境のみで使えるように設定されていますが、以下のように変更しておくことでデプロイ先でも使うことができます。

if (app.Environment.IsDevelopment())
{
    app.UseDeveloperExceptionPage();
}
app.UseSwagger();
app.UseSwaggerUI();
Azure Container Appsにデプロイして確認(7)

Web APIの/pdfexport/pdfexportをそれぞれ実行するとExcelファイルとPDFファイルの出力を確認できます。

Azure Container Appsにデプロイして確認(8)
Azure Container Appsにデプロイして確認(9)
Azure Container Appsにデプロイして確認(10)
Azure Container Appsにデプロイして確認(11)

さいごに

弊社Webサイトでは、製品の機能を気軽に試せるデモアプリケーションやトライアル版も公開していますので、こちらもご確認いただければと思います。

また、ご導入前の製品に関するご相談やご導入後の各種サービスに関するご質問など、お気軽にお問合せください。

\  この記事をシェアする  /