AWS LambdaとDioDocsでExcelやPDFファイルを出力する(3)

前回前々回の記事ではAWS Lambdaで「DioDocs(ディオドック)」を使用したC#( .NET Core 3.1)のLambda関数アプリケーションを作成し、ExcelやPDFファイルを出力する方法について紹介しました。

今回はAWS LambdaでDioDocsを利用する際に、日本語フォントを使用するTipsを紹介します。

セルに追加するテキストの日本語フォント(DioDocs for Excel)

セルに追加するテキストの日本語フォントを設定したい場合は、Fontプロパティを使用します。

Workbook workbook = new Workbook();
workbook.Worksheets[0].Range["A1"].Font.Name = "MS P明朝";
セルに追加するテキストの日本語フォントを設定する(DioDocs for Excel)

セルではなくシート全体のフォントを設定したい場合はこちらのナレッジベースを参考にしてください。

「シート全体のフォントを設定する方法」を見る

ワークシートをPDF出力する際の日本語フォント(DioDocs for Excel)

.NET Core 3.1のランタイムが含まれるLambda関数の実行環境OSは、「Amazon Linux 2」になっています。Windows OSとは違ってAmazon Linux 2には日本語フォントは含まれていませんので、デフォルトの状態でPDF出力を実行すると文字化けが発生したり文字列そのものが表示されない現象が発生します。

参考:「Linux環境でPDFエクスポートすると文字化けが発生する」を見る

そこでAWS LambdaでDioDocsを使用する場合は、Lambdaレイヤーを使用して日本語フォントを追加する必要があります。

まずローカル環境の適当な場所に「.fonts」フォルダを作成し、そこにフォントファイルを格納後、「.fonts」フォルダをZIPファイルへ圧縮します。本記事では「IPAexフォント」を「.fonts」フォルダにコピーしています。

作成したワークシートをPDF出力する際の日本語フォントを設定する(DioDocs for Excel)

AWSのコンソールでAWS Lambdaの「レイヤー」を選択し、[レイヤーの作成]をクリックします。

作成したワークシートをPDF出力する際の日本語フォントを設定する(DioDocs for Excel)

レイヤーの名前に「DioDocs-Japanese-Fonts」を、説明に「DioDocsで使う日本語フォント」を設定して[アップロード]をクリックします。

作成したワークシートをPDF出力する際の日本語フォントを設定する(DioDocs for Excel)

先ほどローカル環境で作成したZIPファイル「.fonts.zip」を選択して[作成]ボタンをクリックします。

作成したワークシートをPDF出力する際の日本語フォントを設定する(DioDocs for Excel)

Lambdaレイヤーが作成されます。「バージョン ARN」は、デプロイしたLambda関数からLambdaレイヤーを追加する際に使用するのでコピーしておきます。

作成したワークシートをPDF出力する際の日本語フォントを設定する(DioDocs for Excel)

AWSコンソールからLambdaの[関数]をクリックし、デプロイした関数名をクリックします。表示された詳細画面の下部にある[レイヤーの追加]をクリックします。

作成したワークシートをPDF出力する際の日本語フォントを設定する(DioDocs for Excel)

「レイヤーを追加」画面で「ARN を指定」を選択し、「ARN を指定」欄に先ほどコピーしたLambdaレイヤーのARNを入力して、[追加]をクリックします。

作成したワークシートをPDF出力する際の日本語フォントを設定する(DioDocs for Excel)

Lambda関数にLambdaレイヤーが追加されます。

作成したワークシートをPDF出力する際の日本語フォントを設定する(DioDocs for Excel)

Visual StudioからLambda関数をデプロイする際に、以下の画面で[Add…]をクリックして環境変数を追加します。変数名はHOMEで値は/optを設定します。/optはLambdaレイヤーが展開されるディレクトリです。この設定によりLambda関数を実行するパス(ホームディレクトリ)が/optになるので、Lambdaレイヤーに格納した.fonts配下に含まれる日本語フォント「IPAexゴシック」が利用できます。

作成したワークシートをPDF出力する際の日本語フォントを設定する(DioDocs for Excel)

このLambdaレイヤーで日本語フォントを追加したLambda関数で、以下のコードのように「IPAexゴシック」を設定したセルに日本語の文字列を持つExcelワークブックをPDFファイルへ出力すると、日本語が文字化けしたりすることなく「IPAexゴシック」が設定されて正しく文字列が表示されていることが確認できます。

public APIGatewayProxyResponse FunctionHandler(APIGatewayProxyRequest input, ILambdaContext context)
{
    APIGatewayProxyResponse response;

    string queryString;
    input.QueryStringParameters.TryGetValue("name", out queryString);

    string Message = string.IsNullOrEmpty(queryString)
        ? "こんにちは、世界!"
        : $"こんにちは、{queryString}!";

    Workbook workbook = new Workbook();

    workbook.Worksheets[0].Range["A1"].Font.Name = "IPAexゴシック";

    workbook.Worksheets[0].Range["A1"].Value = Message;

    var base64String = "";

    using (var ms = new MemoryStream())
    {
        workbook.Save(ms, SaveFileFormat.Pdf);
        base64String = Convert.ToBase64String(ms.ToArray());
    }

    response = new APIGatewayProxyResponse
    {
        StatusCode = (int)HttpStatusCode.OK,
        Body = base64String,
        IsBase64Encoded = true,
        Headers = new Dictionary<string, string> {
            { "Content-Type", "application/pdf" },
            { "Content-Disposition", "attachment; filename=Result.pdf"},
        }
    };

    return response;
}
作成したワークシートをPDF出力する際の日本語フォントを設定する(DioDocs for Excel)

PDFドキュメントを保存する際の日本語フォント(DioDocs for PDF)

DioDocs for PDFで作成したPDFドキュメントで日本語フォントを利用する場合も、「作成したワークシートをPDF出力する際の日本語フォントを設定する(DioDocs for Excel)」と同じ手順でLambdaレイヤーを使用して日本語フォントを追加します。

以下のコードのように「IPAexゴシック」を設定した日本語の文字列を持つPDFドキュメントを出力すると、日本語が文字化けしたりすることなく「IPAexゴシック」が設定されて正しく文字列が表示されていることが確認できます。

public APIGatewayProxyResponse FunctionHandler(APIGatewayProxyRequest input, ILambdaContext context)
{
    APIGatewayProxyResponse response;

    string queryString;
    input.QueryStringParameters.TryGetValue("name", out queryString);

    string Message = string.IsNullOrEmpty(queryString)
    ? "こんにちは、世界!"
    : $"こんにちは、{queryString}!";

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

    g.DrawString(Message,
        new TextFormat() { FontName = "IPAexゴシック", FontSize = 12 },
        new PointF(72, 72));

    var base64String = "";

    using (var ms = new MemoryStream())
    {
        doc.Save(ms, false);
        base64String = Convert.ToBase64String(ms.ToArray());
    }

    response = new APIGatewayProxyResponse
    {
        StatusCode = (int)HttpStatusCode.OK,
        Body = base64String,
        IsBase64Encoded = true,
        Headers = new Dictionary<string, string> {
            { "Content-Type", "application/pdf" },
            { "Content-Disposition", "attachment; filename=Result.pdf"},
        }
    };

    return response;
}
作成したワークシートをPDF出力する際の日本語フォントを設定する(DioDocs for Excel)