帳票生成サービスの実装
ここまででAzure Functions上での実装課題が解消され、JSONとExcelからPDF帳票の生成が可能となりました。最後にこれらを組み合わせてAzure Functions上での帳票生成を実現しましょう。
現時点のAzure Functionsの実装は次の通りです。
[FunctionName("CreateReport")] public static async Task<IActionResult> Run( [HttpTrigger(AuthorizationLevel.Function, "post", Route = null)] HttpRequest req, [Blob("templates/Invoice.xlsx", FileAccess.Read)]Stream template, [Blob("reports", FileAccess.Write)] CloudBlobContainer outputContainer, ILogger log) { await outputContainer.CreateIfNotExistsAsync(); var fileName = $"{Guid.NewGuid()}.txt"; var cloudBlockBlob = outputContainer.GetBlockBlobReference(fileName); using (var output = await cloudBlockBlob.OpenWriteAsync()) { req.Body.CopyTo(output); } return new OkObjectResult(fileName); }
ここにJsonReportBuilderを利用して、PDFを生成する処理を追加します。
[FunctionName("CreateReport")] public static async Task<IActionResult> Run( [HttpTrigger(AuthorizationLevel.Function, "post", Route = null)] HttpRequest req, [Blob("templates/Invoice.xlsx", FileAccess.Read)]Stream template, [Blob("reports", FileAccess.Write)] CloudBlobContainer outputContainer, ILogger log) { await outputContainer.CreateIfNotExistsAsync(); var fileName = $"{Guid.NewGuid()}.pdf"; // 1. var cloudBlockBlob = outputContainer.GetBlockBlobReference(fileName); var builder = new JsonReportBuilder(template); // 2. using (var input = new StreamReader(req.Body, Encoding.UTF8)) // 3. using (var output = await cloudBlockBlob.OpenWriteAsync()) { builder.Build(input, output, SaveFileFormat.Pdf); // 4. } return new OkObjectResult(fileName); }
元のコードに対して4カ所、追加・修正を行いました。
ひとつは、生成する拡張子をtxtからpdfに変更しました。
var fileName = $"{Guid.NewGuid()}.pdf";
続いて、BLOB Storageに格納されたExcelを読み取るためのStreamが引数で渡されてくるので、それをもとにJsonReportBuilderを生成します。
var builder = new JsonReportBuilder(template);
3つ目に、以下のようにHTTP RequestボディからTextReaderを生成します。
using (var input = new StreamReader(req.Body, Encoding.UTF8))
最後に、JSONをBLOBにそのまま書き出していた箇所を、JsonReportBuilderでPDFを生成してBLOBに書き出すように修正します。
builder.Build(input, output, SaveFileFormat.Pdf);
これで完成です。公開して実際に動作させてみましょう。
先ほどコンソールから実行したプログラムのJSONデータを指定していた箇所を、JSONファイルから取得するように改修しましょう。
var jsonContent = new StringContent( "{\"Message\":\"Hello, Azure Functions with JSON!\"}", Encoding.UTF8, "application/json");
var jsonContent = new StreamContent(File.Open("Request.json", FileMode.Open));
JSONファイルの中身はこちら(GitHub)の通りです。
実行結果が以下の通りです。一番左のExcelテンプレートから、中央と右の2ページのPDFが生成されます。
無事動作しましたね! これで帳票生成マイクロサービスの完成です!
まとめと注意事項
さて本稿では次のような帳票生成サービスを構築しました。
- Azure Functions上の帳票生成マイクロサービス
- Excelベースの帳票テンプレートからのPDF帳票生成
- 帳票生成ロジックとテンプレートを分離しコード修正なく帳票レイアウトが変更可能
ところで本稿の検証をしていく中で注意すべき点があることに気が付きました。
DioDocs for Excelを利用したPDF生成はAzure Functionsの従量課金プランでは十分な性能が出ない可能性があるということです(本稿の「Azure Functionsのプラン選択」参照)。
それでも、やはりExcelベースでの帳票生成は非常に手軽で、その点に強い魅力を感じました。
DioDocsはNuGetからパッケージをインストールすればすぐに評価利用することが可能です。皆さんもぜひ試してみてください。その魅力を感じていただけるはずです。