SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

クラウド時代にマッチする、ドキュメント生成・更新APIライブラリ「DioDocs(ディオドック)」(AD)

DioDocsとAzure Functionsで帳票生成サービスを作ろう!

  • X ポスト
  • このエントリーをはてなブックマークに追加

帳票生成サービスの実装

 ここまでで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ファイルから取得するように改修しましょう。

Before
var jsonContent =
    new StringContent(
        "{\"Message\":\"Hello, Azure Functions with JSON!\"}",
        Encoding.UTF8,
        "application/json");
After
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からパッケージをインストールすればすぐに評価利用することが可能です。皆さんもぜひ試してみてください。その魅力を感じていただけるはずです。

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
クラウド時代にマッチする、ドキュメント生成・更新APIライブラリ「DioDocs(ディオドック)」連載記事一覧

もっと読む

この記事の著者

中村 充志(リコージャパン株式会社)(ナカムラ アツシ)

 Microsoft MVP for Visual Studio and Development Technologies リコージャパン株式会社 金融事業部 金融ソリューション開発部所属。 エンタープライズ領域での業務システム開発におけるアプリケーション アーキテクト・プログラマおよび中間管理職。 業務ではWPFおよびASP.NETを用いた業務システム開発が中心。 SI案件において、テスト・保守容易性を担保した、アーキテクチャ構築を得意としている。 GitHub:https://github.com/nuitsjp Twitter:@nuits_jp 著書 『Essential Xamarin ネイティブからクロスプラットフォームまで モバイル.NETの世界』(共著) 『Extensive Xamarin ─ひろがるXamarinの世界─』(共著)

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

【AD】本記事の内容は記事掲載開始時点のものです 企画・制作 株式会社翔泳社

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/11704 2019/09/11 12:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング