ODC版のUltimate PDFを確認(1)

OutSystemsで作成したScreenをPDFとして出力するForgeコンポーネントUltimate PDFのODC版が公開されている。
そこで、コンポーネントの概要と使い方を見ていく。
以下では、日本語を含むシンプルな帳票を作る手順を確認する。

# 環境情報
ODC Studio(Version 1.3.16)
[Ultimate PDF](https://www.outsystems.com/forge/component-overview/15988/ultimate-pdf) (Version 1.1.5)
[UltimatePDF_ExternalLogic](https://www.outsystems.com/forge/component-overview/15989/ultimatepdf-externallogic) (Version 0.1.5)

[GitHubプロジェクトページのドキュメント](https://github.com/OutSystems/UltimatePDF-ExternalLogic)

# インストール
Ultimate PDFをインストールすると、内部で利用するUltimatePDF_ExternalLogic も同時にインストールされる。

# 帳票用のScreenを作成する
Screenを普通に作成し、Authorization > Accessible by = Everyoneに設定する。ちなみに、これだと誰でも画面にアクセスできてしまうため、セキュリティ上の問題がある。対策はあるようだが、そちらについては別途動作確認して記事にまとめる予定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/a81ead90-4701-1c0d-e99c-dde7d11e1361.png)

Layout Block（Screen直下のBlock）を、Ultimate PDFのPrintLayoutに置き換える。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/c028bbb4-9def-1151-1482-87314a80679a.png)

# 日本語フォントを設定
[GitHubのKnwon Limitationsセクション](https://github.com/OutSystems/UltimatePDF-ExternalLogic?tab=readme-ov-file#known-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」を利用することにする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/7d5ef03e-6247-fd00-0db3-9be969547e1d.png)

ScreenのOn Initialize Eventにハンドラーを設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/853768d6-6f91-7b7e-861d-ce01236b5a9d.png)

Ultimate PDFのSetDocumentFont Client Action呼び出しを配置し、Input Parameter Fontに↑で決めたFonts Static EntityのIdを設定する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/a55dbb64-1487-0490-e8b3-6ae527b23740.png)

これによって、ページ内のbodyタグにIBM Plex Sans JPというfont-familyが適用される。

# 帳票デザイン
テストなのでシンプルに以下の構造にしてみた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/d8ed8d41-05ff-9458-1907-1d1126069f1e.png)

## PrintLayout Blockを画面のルートに配置
PDF出力用の画面やマージンサイズを設定する処理が含まれている。
このLayoutのPlaceholder内に適当なUIを配置していく。

## HideOnPrint Blockを使ってWebページとしてどうさするときのみ出力するUIを定義
Placeholder Content内に配置したUIは、その画面をブラウザで開いたときにのみ表示される。PDFとして出力したときには表示されない。
PrintLayoutをLayoutとして使った場合、ブラウザで画面にアクセスしただけではPDFは出力されない。そこで、Buttonを配置し、クリックしたときにUltimate PDFが提供するPDF出力Actionを呼び出すようにする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/865707e9-3321-9122-d4df-f0746063315e.png)

CurrEnvironment Action: ブラウザのタイムゾーンやロケールを返すAction
PrintToPDF Action: 指定した画面のURLをChromiumで開き、印刷してPDFにしたものを返す

## ページ番号とページ数を提供されるBlockで表示する
PageNumber Block: PDF出力したときにページ番号を出力する
PageCount Block: PDF出力したときに総ページ数を出力する

# 出力結果サンプル
ODC Studio上でのScreen
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/fd612708-8462-8922-3540-810306d0b33a.png)

これをPDFに出力した結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/1b5afcc7-a7f1-c490-2e2a-9c1410e0aa57.png)

# 注意点：セキュリティ
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）がある