OutSystemsで作成したScreenをPDFとして出力するForgeコンポーネントUltimate PDFのODC版が公開されている。
そこで、コンポーネントの概要と使い方を見ていく。
以下では、日本語を含むシンプルな帳票を作る手順を確認する。
環境情報
ODC Studio(Version 1.3.16)
Ultimate PDF (Version 1.1.5)
UltimatePDF_ExternalLogic (Version 0.1.5)
インストール
Ultimate PDFをインストールすると、内部で利用するUltimatePDF_ExternalLogic も同時にインストールされる。
帳票用のScreenを作成する
Screenを普通に作成し、Authorization > Accessible by = Everyoneに設定する。ちなみに、これだと誰でも画面にアクセスできてしまうため、セキュリティ上の問題がある。対策はあるようだが、そちらについては別途動作確認して記事にまとめる予定。
Layout Block(Screen直下のBlock)を、Ultimate PDFのPrintLayoutに置き換える。
日本語フォントを設定
GitHubのKnwon Limitationsセクションによると、
The version of chromium bundle with the forge component only has Open Sans font installed meaning it only supports a subset of languages.
ということで、デフォルトではOpen Sans Fontのみがインストールされている。
Ultimate PDFのFonts Static EntityのRecordの値は利用できるようだ。その中で、JPという文字が含まれる「IBM_Plex_Sans_JP」を利用することにする。
ScreenのOn Initialize Eventにハンドラーを設定
Ultimate PDFのSetDocumentFont Client Action呼び出しを配置し、Input Parameter Fontに↑で決めたFonts Static EntityのIdを設定する。
これによって、ページ内のbodyタグにIBM Plex Sans JPというfont-familyが適用される。
帳票デザイン
PrintLayout Blockを画面のルートに配置
PDF出力用の画面やマージンサイズを設定する処理が含まれている。
このLayoutのPlaceholder内に適当なUIを配置していく。
HideOnPrint Blockを使ってWebページとしてどうさするときのみ出力するUIを定義
Placeholder Content内に配置したUIは、その画面をブラウザで開いたときにのみ表示される。PDFとして出力したときには表示されない。
PrintLayoutをLayoutとして使った場合、ブラウザで画面にアクセスしただけではPDFは出力されない。そこで、Buttonを配置し、クリックしたときにUltimate PDFが提供するPDF出力Actionを呼び出すようにする。
CurrEnvironment Action: ブラウザのタイムゾーンやロケールを返すAction
PrintToPDF Action: 指定した画面のURLをChromiumで開き、印刷してPDFにしたものを返す
ページ番号とページ数を提供されるBlockで表示する
PageNumber Block: PDF出力したときにページ番号を出力する
PageCount Block: PDF出力したときに総ページ数を出力する
出力結果サンプル
注意点:セキュリティ
Appのテンプレートを提供するTemplate_UltimatePDFには、Authorization > Accessible by = Everyoneとしたことによるセキュリティ問題を解決する方法が含まれる。
こちらの方法は後で別の記事にまとめる。
O11版のコンポーネントとの比較
帳票の作成方法はO11の頃と同じ。
- Screenに帳票出力用のレイアウトBlockを配置し、画面作成と同じ方法で帳票をデザインする
- 各種Blockなどは基本的に同じ構成
ドキュメントを見る限り、Chromiumの特定バージョンを組み込んでいるようだ(O11のときには、最初の実行時にChromiumをダウンロードしてくる動作もあった)。
処理の本体が、O11におけるExtension(C#で作成したロジックをPlatform Serverのメモリ上で動作する)から、ODCにおけるExternal Logic(C#で作成したロジックをOutSystems外のAWS Lambdaで動作する)に変わっている。
External Logicであることにより
- モジュールから直接コードを見られない(が、↑にリンクしたGitHubプロジェクトページにソースコードがある)
- オンメモリではないため、PDF出力を要求したユーザーの認証情報を引き継ぐのは難しそう
- Parameterのサイズ上限(5.5MB)がある