Power Apps で PDF 出力を得たい
A matter of business. Regard it as a matter of business — business that must be done.
- Jarvis Lorry, A Tale of Two Cities
ビジネス上の問題だ。ビジネス上の問題として扱え ― 為さなくてはならないものとして。
- ジャーヴィス・ローリー、「二都物語」より
以下の画像のように、PDF関数に関するプレビュー機能を有効化しなければならない。
さもなくば PDF 関数の実行時にエラーが発生し正常に動作しない。
大まかには次の処理をたどる。
- PDF として出力したい領域をコンポーネントないし画面それ自体で囲う。
-
PDF()
関数に領域を引数として渡す。 -
PDF()
関数をボタンのOnSelect
プロパティや画面のOnVisible
プロパティで実行させる。 - その結果(PDF の blob である)を変数に代入する。
Set()
でもUpdateContext()
でも構わない。 - PDF Viewer コンポーネントを用意する。
- PDF Viewer コンポーネントの
Document
プロパティに上述の変数を指定する。
こうすれば動くはず。
参考:
PDF()
実行時か PDF Viewer のレンダリング時かタイミングは掴めないものの、全体として実行するときは少し処理に時間がかかる。おそらく MS のどこかのサーバにレンダリングを委託している。
必要な追加調査:
- フォームコンポーネントのレンダリング試験
- ローカルに PDF を保存させる方法の調査
例えばテキストボックス PDF(C)
を実行すると、
そのため、DisplayMode
プロパティを変数を介して制御することで、通常は編集出来つつも必要なときだけ枠線を消すことで見栄えをよくできる。
(例)前述のコンポーネント
DisplayMode = viewMode;
UpdateContext({ viewMode: DisplayMode.View });
UpdateContext({ pdf: PDF(C, { Size: PaperSize.A4 })});
UpdateContext({ viewMode: DisplayMode.Edit });
変数を介在させる方法ではレンダリング対象のコンポーネントが増えても DisplayMode
に変数を置けば同じように動作するため冪等性が高い。
もっとも特定のテキストボックス コンポーネントを基準にして、そのプロパティを見る(すなわち DisplayMode = T2.DisplayMode;
)としてもよいし、こちらはより Power Apps らしい。一方でコンポーネント間の依存性が出来て状態の追跡性が低下するため、一概に良いとは言い切れない。
Print() 関数でもコンポーネントを指定できればいいのに。