本記事では「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で作成したWeb APIの実行時に、DioDocsを使用してExcelとPDFファイルを作成し、HTTPリクエストのクエリパラメータで受け取った文字列を各ファイルへ追加します。その後、作成したファイルをHTTPレスポンスで直接ローカルへ出力する、といった内容です。
アプリケーションの作成
プロジェクトテンプレートから「ASP.NET Core Web API」を選択します。プロジェクト名には「DioDocsWebApiApp1」を設定します。
「Docker を有効にする」のチェックをONにして「コントローラーを使用する (最小限の API を使用する場合にはオフにします)」のチェックをOFFにして[作成]をクリックします。
NuGetパッケージの追加
Visual Studioのソリューションエクスプローラーでプロジェクトを右クリックして[NuGet パッケージの管理]を選択します。「NuGet パッケージ マネージャー」からDioDocsのパッケージGrapeCity.DioDocs.Excel.ja
、GrapeCity.DioDocs.Pdf.ja
をインストールします。
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」を設定して保存する必要があります。
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)」を選択します。
続けてコンテナーアプリとレジストリ、ビルド方法をそれぞれ設定します。最後に[完了]ボタンをクリックして実行プロファイルを作成します。
[発行]ボタンをクリックしてデプロイを開始します。
デプロイが完了すると、アプリケーションのURLでブラウザが起動します。
ASP.NET Core Web APIのテンプレートではデフォルトでSwagger UIは開発環境のみで使えるように設定されていますが、以下のように変更しておくことでデプロイ先でも使うことができます。
if (app.Environment.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseSwagger();
app.UseSwaggerUI();
Web APIの/pdfexport
と/pdfexport
をそれぞれ実行するとExcelファイルとPDFファイルの出力を確認できます。
さいごに
弊社Webサイトでは、製品の機能を気軽に試せるデモアプリケーションやトライアル版も公開していますので、こちらもご確認いただければと思います。
また、ご導入前の製品に関するご相談やご導入後の各種サービスに関するご質問など、お気軽にお問合せください。