Azure Functions(分離ワーカーモデル)とDioDocsでExcelやPDFファイルを出力する(2)

前回に引き続き、本記事でもAzure Functions(分離ワーカーモデル)で「DioDocs(ディオドック)」を使用したC#関数アプリを作成して、ExcelやPDFファイルを出力する方法について紹介します。

Azure Functionsの分離ワーカーモデルについて

従来、Azure Functionsでは「インプロセスモデル」を主に使用されていました。しかし、このインプロセスモデルは2026年11月10日でサポート終了がアナウンスされています。

また、インプロセスモデルでは .NET 8までがサポート対象になっており、.NET 9以降では「分離ワーカーモデル」を使用する必要があります。

実装する内容

Azure FunctionsアプリケーションでHTTPトリガーを使用する関数を作成します。関数の実行時にDioDocsを使用してExcelとPDFファイルを作成し、クエリパラメータで受け取った文字列を追加します。前回は作成したExcelとPDFファイルをFileContentResultで直接ローカルへ出力していましたが、今回は作成したExcelとPDFファイルをAzure Blob Storageへ出力するようにします。

アプリケーションを作成

以下のドキュメントを参考にAzure Functionsアプリケーションを作成していきます。

Visual Studio 2022でプロジェクトテンプレート「Azure Functions」を選択して[次へ]をクリックします。

アプリケーションを作成

プロジェクト名「DioDocsFileExportFunctionIsolatedApp2」を入力して[次へ]をクリックします。

アプリケーションを作成

Azure Functionsの追加情報を入力します。「Functions worker」は「.NET 8 Isolated (長期的なサポート)」を選択、「Function」は「Http trigger」を選択して[作成]をクリックします。

アプリケーションを作成

DioDocsFileExportFunctionIsolatedApp2プロジェクトが作成されます。

アプリケーションを作成

NuGetパッケージの追加

Visual Studioの「NuGet パッケージ マネージャー」からDioDocsのパッケージDioDocs.Excel.jaDioDocs.Pdf.jaをインストールします。

NuGetパッケージの追加

また、作成したExcelとPDFファイルをAzure Blob Storageへ出力するために、出力バインドでAzure Blob Storageを使用するので、必要なパッケージMicrosoft.Azure.Functions.Worker.Extensions.Storage.Blobsをインストールします。

NuGetパッケージの追加

Azure Blob StorageとDioDocs for Excelを使うコードを追加

Azure Blob Storageの出力バインドを設定するコードおよびDioDocs for Excelを使用してExcelファイルを作成するコードを追加して、Function1を以下のように更新します。

[Function("Function1")]
public async Task<UploadOutput> Run([HttpTrigger(AuthorizationLevel.Function, "get", "post")] HttpRequest req)
{
    _logger.LogInformation("C# HTTP trigger function processed a request.");

    string? name = req.Query["name"];

    string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
    dynamic? data = JsonConvert.DeserializeObject(requestBody);
    name = name ?? data?.name;

    string Message = string.IsNullOrEmpty(name)
        ? "Hello, World!!"
        : $"Hello, {name}!!";

    MemoryStream outputfile = new();
    Workbook workbook = new();

    workbook.Worksheets[0].Range["B2"].Value = Message;
    workbook.Save(outputfile);

    byte[]? FileData = outputfile.ToArray();

    return new UploadOutput()
    {
        HttpResponse = new OkObjectResult("Excel File Uploaded."),
        OutPutFile = FileData
    };
}

public class UploadOutput
{
    [HttpResult]
    public required IActionResult HttpResponse { get; set; }

    [BlobOutput("output/result.xlsx", Connection = "AzureWebJobsStorage")]
    public byte[]? OutPutFile { get; set; }
}

今回はHTTPトリガーに対するHTTPレスポンスと、DioDocs for Excelで作成したExcelファイルをAzure Blob Storageに保存するための出力バインディングをUploadOutputクラス内でHttpResultBlobOutput属性でそれぞれ定義します。そして関数Function1UploadOutputオブジェクトを返すように設定しています。

なお、Blob Storageの出力バインディングはstringByte[]しか使用できないので今回はByte[]を使用しています。なお、大きいサイズのファイルを保存する場合はこちらの出力バインディングを使用せずに関数内でBlobClientまたはBlobContainerClientを推奨する記載があります。

また、Blob Storageの出力バインディングを使用する場合には、現在以下の報告のようにEvent Gridで複数のイベントが発生する現象が確認されているので使用する際には注意が必要です。

DioDocs for PDFを使う関数を追加

ソリューションエクスプローラーからDioDocsFileExportFunctionIsolatedApp2プロジェクトを右クリックして[追加]-[新しい Azure 関数]を選択して、DioDocsでPDFファイルを作成する関数Function2を追加します。

DioDocs for PDFを使う関数を追加
DioDocs for PDFを使う関数を追加

関数のテンプレートを選択します。Http Triggerを選択して[追加]をクリックします。

DioDocs for PDFを使う関数を追加

Azure Blob StorageとDioDocs for PDFを使うコードを追加

Azure Blob Storageの出力バインドを設定するコードおよびDioDocs for PDFを使用してPDFファイルを作成するコードを追加して、Function2を以下のように更新します。

[Function("Function2")]
public async Task<UploadOutput> Run([HttpTrigger(AuthorizationLevel.Function, "get", "post")] HttpRequest req)
{
    _logger.LogInformation("C# HTTP trigger function processed a request.");

    string? name = req.Query["name"];

    string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
    dynamic? data = JsonConvert.DeserializeObject(requestBody);
    name = name ?? data?.name;

    string Message = string.IsNullOrEmpty(name)
        ? "Hello, World!!"
        : $"Hello, {name}!!";

    MemoryStream outputfile = new();
    GcPdfDocument doc = new GcPdfDocument();
    GcPdfGraphics g = doc.NewPage().Graphics;

    g.DrawString(Message,
        new TextFormat() { Font = StandardFonts.Helvetica, FontSize = 12 },
        new PointF(72, 72));

    doc.Save(outputfile, false);

    byte[]? FileData = outputfile.ToArray();

    return new UploadOutput()
    {
        HttpResponse = new OkObjectResult("PDF File Uploaded."),
        OutPutFile = FileData
    };

}

public class UploadOutput
{
    [HttpResult]
    public required IActionResult HttpResponse { get; set; }

    [BlobOutput("output/result.pdf", Connection = "AzureWebJobsStorage")]
    public byte[]? OutPutFile { get; set; }
}

先程と同じように、DioDocs for PDFで作成したPDFファイルをAzure Blob Storageに保存するための出力バインディングをUploadOutputクラス内でBlobOutput属性で定義します。そして関数Function2UploadOutputオブジェクトを返すように設定しています。

デバッグ実行で確認

今回はAzure Functionアプリケーションの関数で作成するExcelとPDFファイルの出力先として、関数の出力バインドで設定しているAzure Blob Storageを使用しています。ローカルでの確認にはAzurite エミュレーターを使用します。

Visual Studioのソリューションエクスプローラーから「ストレージ Azurite エミュレーター (ローカル)」を右クリックして表示されるメニューから[Azure Storage Explorerを開く]を選択します。

デバッグ実行で確認

Azure Storage ExplorerではExcelとPDFファイルを出力するBLOBコンテナとして新しく「output」を作成しておきます。これで準備は完了です。

デバッグ実行で確認
デバッグ実行で確認

作成したAzure Functionsアプリケーションをローカルでデバッグ実行して確認します。Visual Studioからデバッグ実行すると、Windowsターミナルで以下のように表示されます。

デバッグ実行で確認

アプリケーションに含まれる関数のURLはhttp://localhost:7145/api/Function1http://localhost:7145/api/Function2となっています。それぞれURLにクエリパラメータと文字列?name=DioDocs for Excel?name=DioDocs for PDFを追加して、それぞれの関数をブラウザで実行します。

デバッグ実行で確認
デバッグ実行で確認

Azurite エミュレーターのコンテナーoutputに保存されたresult.xlsxresult.pdfを確認します。クエリパラメータで渡した文字列(DioDocs for ExcelおよびDioDocs for PDF)が表示されていれば成功です。

デバッグ実行で確認
デバッグ実行で確認
デバッグ実行で確認

Azureへデプロイ

作成したAzure FunctionsアプリケーションをAzureへデプロイして確認します。ソリューションエクスプローラーからDioDocsFileExportFunctionIsolatedApp2プロジェクトを右クリックして[発行]を選択します。

Azureへデプロイ

公開するターゲットは「Azure」、特定のターゲットは「Azure 関数アプリ」を選択します。

Azureへデプロイ
Azureへデプロイ

アプリケーションの名前やリソースグループなどを入力して新しいインスタンスを作成します。以下の画面に切り替わったら[完了]をクリックします。

Azureへデプロイ

これで公開の準備が完了しました。[発行]をクリックして作成したAzure FunctionアプリケーションをAzureへデプロイします。

Azureへデプロイ

公開が完了するとメッセージが表示されます。

Azureへデプロイ

デプロイしたアプリケーションを確認

Azure Functionsアプリケーションを実行する前に、ローカルでの確認と同じく関数の出力バインドで設定しているAzure Blob Storageのコンテナーoutputを作成しておきます。

デプロイしたアプリケーションを確認

Azureポータルで「概要」を選択するとAzure Functionsアプリケーションに含まれる関数Function1Function2が表示されます。

デプロイしたアプリケーションを確認

関数Function1をクリックして「コードとテスト」タブを選択します。「関数の URL の取得」が表示されるのでこちらをクリックします。

デプロイしたアプリケーションを確認

関数のURLが表示されます。ここでは特定の関数URLへのアクセスのみを許可するキーを使用する「default (ファンクション キー)」のURLをコピーして使用します。

デプロイしたアプリケーションを確認

コピーしたURLをブラウザに貼り付けて、さらにクエリパラメータと文字列&name=DioDocs for Excelを追加します。

デプロイしたアプリケーションを確認

関数を実行するとデバッグ実行時と同じように、クエリパラメータで渡した文字列が追加されたExcelファイルがAzure Blob Storageのコンテナoutputに出力されます。関数Function2も同じ手順で確認できます。

動作を確認できるAzure Functionsアプリケーションのサンプルはこちらです。

さいごに

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

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

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