前回と前々回の記事では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明朝";
セルではなくシート全体のフォントを設定したい場合はこちらのナレッジベースを参考にしてください。
ワークシートを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」フォルダにコピーしています。
AWSのコンソールでAWS Lambdaの「レイヤー」を選択し、[レイヤーの作成]をクリックします。
レイヤーの名前に「DioDocs-Japanese-Fonts」を、説明に「DioDocsで使う日本語フォント」を設定して[アップロード]をクリックします。
先ほどローカル環境で作成したZIPファイル「.fonts.zip」を選択して[作成]ボタンをクリックします。
Lambdaレイヤーが作成されます。「バージョン ARN」は、デプロイしたLambda関数からLambdaレイヤーを追加する際に使用するのでコピーしておきます。
AWSコンソールからLambdaの[関数]をクリックし、デプロイした関数名をクリックします。表示された詳細画面の下部にある[レイヤーの追加]をクリックします。
「レイヤーを追加」画面で「ARN を指定」を選択し、「ARN を指定」欄に先ほどコピーしたLambdaレイヤーのARNを入力して、[追加]をクリックします。
Lambda関数にLambdaレイヤーが追加されます。
Visual StudioからLambda関数をデプロイする際に、以下の画面で[Add…]をクリックして環境変数を追加します。変数名はHOME
で値は/opt
を設定します。/opt
はLambdaレイヤーが展開されるディレクトリです。この設定によりLambda関数を実行するパス(ホームディレクトリ)が/opt
になるので、Lambdaレイヤーに格納した.fonts
配下に含まれる日本語フォント「IPAexゴシック」が利用できます。
この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 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;
}
弊社Webサイトでは、製品の機能を気軽に試せるデモアプリケーションやトライアル版も公開していますので、こちらもご確認いただければと思います。
また、ご導入前の製品に関するご相談やご導入後の各種サービスに関するご質問など、お気軽にお問合せください。