Closed8

Power Apps で PDF 出力を得たい

ARGIAARGIA

A matter of business. Regard it as a matter of business — business that must be done.
- Jarvis Lorry, A Tale of Two Cities

ビジネス上の問題だ。ビジネス上の問題として扱え ― 為さなくてはならないものとして。
- ジャーヴィス・ローリー、「二都物語」より

ARGIAARGIA

以下の画像のように、PDF関数に関するプレビュー機能を有効化しなければならない。
さもなくば PDF 関数の実行時にエラーが発生し正常に動作しない。

Power Apps の PDF 関数に関する設定項目

ARGIAARGIA

大まかには次の処理をたどる。

  1. PDF として出力したい領域をコンポーネントないし画面それ自体で囲う。
  2. PDF() 関数に領域を引数として渡す。
  3. PDF() 関数をボタンの OnSelect プロパティや画面の OnVisible プロパティで実行させる。
  4. その結果(PDF の blob である)を変数に代入する。Set() でも UpdateContext() でも構わない。
  5. PDF Viewer コンポーネントを用意する。
  6. PDF Viewer コンポーネントの Document プロパティに上述の変数を指定する。

こうすれば動くはず。

参考:
https://learn.microsoft.com/ja-jp/power-apps/maker/canvas-apps/how-to/pdf-function

ARGIAARGIA

PDF() 実行時か PDF Viewer のレンダリング時かタイミングは掴めないものの、全体として実行するときは少し処理に時間がかかる。おそらく MS のどこかのサーバにレンダリングを委託している。

ARGIAARGIA

必要な追加調査:

  • フォームコンポーネントのレンダリング試験
  • ローカルに PDF を保存させる方法の調査
ARGIAARGIA

例えばテキストボックス \mathrm{T} などを含むコンテナー \mathrm{C} があったとする。ここで PDF(C) を実行すると、\mathrm{T} の枠線も一緒にレンダリングされてしまい美学的ではない。

そのため、\mathrm{T}DisplayMode プロパティを変数を介して制御することで、通常は編集出来つつも必要なときだけ枠線を消すことで見栄えをよくできる。


(例)前述のコンポーネント \mathrm{C}\mathrm{T} に加え、レンダリングのためのボタン コンポーネント \mathrm{B} を定義する。このときそれぞれのコンポーネントに設定するべき値は次のようになる。

\mathrm{T}

DisplayMode = viewMode;

\mathrm{B}

UpdateContext({ viewMode: DisplayMode.View });
UpdateContext({ pdf: PDF(C, { Size: PaperSize.A4 })});
UpdateContext({ viewMode: DisplayMode.Edit });

変数を介在させる方法ではレンダリング対象のコンポーネントが増えても DisplayMode に変数を置けば同じように動作するため冪等性が高い。

もっとも特定のテキストボックス コンポーネントを基準にして、そのプロパティを見る(すなわち DisplayMode = T2.DisplayMode;)としてもよいし、こちらはより Power Apps らしい。一方でコンポーネント間の依存性が出来て状態の追跡性が低下するため、一概に良いとは言い切れない。

ARGIAARGIA

Print() 関数でもコンポーネントを指定できればいいのに。

このスクラップは2023/09/07にクローズされました