【OutSystems】UltimatePDFでPDFデータを生成する②

# 0. INDEX
- つづきだよ！
- UltimatePDFでPDFデータを生成する
- あとがき


# 1. つづきだよ！
こっちの記事の続き。基本的な使い方から知りたい場合はどうぞ。

https://qiita.com/neonemo/items/58d46119f0cb1e89ccb1

PDFバイナリデータをサクッと得たい人は今見ているページだけでOK！
もっと言うと、**結論だけ欲しい人はプロジェクトファイルを入手して、あとがきへGO！**


# 2. UltimatePDFでPDFデータを生成する
1つ目の記事と同じプロジェクトファイルだが貼っておく。`Service Studio`で内容を確認しながら記事を読むと良いかと。
[PDFOutput.oml - GitHub](https://github.com/mahny-b/OutSystemsExample/blob/master/PDFOutput.oml)

デモページも同様デス。スリープされてアクセス不可だったら諦めて下さいω
https://personal-ppneswkx.outsystemscloud.com/PDFOutput/Home


## 2.1. 概要
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92447/16b039b9-f668-f745-f4ac-fc7a126ba0af.png)

バイナリデータを得る為には、このインターフェースのURLを指定しなければならない。
で、試行錯誤した所、ユーザがブラウザで設定するURLの形で良さそうなので、こういう感じにサンプルを作ってみた。

1. 画面から、サーバアクションを起動するだけのボタンを置く
2. サーバアクションで`PrintToPDF`を呼び出す
3. `PrintToPDF`で生成したバイナリデータを、`Download`ウィジェットで保存させる


## 2.2. 実装

### 2.2.1. 画面と処理のインターフェースを整える
ボタンや空のアクションの側を作っていく。

`サーバアクション経由でダウンロード`という何のひねりもないボタンをおく。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92447/ddd3f0b7-2f07-9391-a80c-a8698103b346.png)

更にクリックイベントには、任意の名前でClient Actionを紐づけておく。（ここでは`DownloadViaActButtonOnClick`とした）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92447/92f62147-b8ba-9015-4f30-3633de5b16cf.png)

作成したClient Actionから、生成したPDFバイナリデータをやり取りするServer Actionを作る。（ここでは`DownloadPdfAction`とした）
引数はないが、戻り値には`OutData`という名前で`Binary Data`型のデータを用意した。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92447/fb89e027-ba82-4cb8-cd23-28759a7a7f68.png)

最初に作ったClient Actionに、Server Actionの呼び出しと受け取ったデータのダウンロードの処理を追記する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92447/952dc9d6-a318-7e9d-d3ce-46ee15650b97.png)

これで、後はServer Action側で正しくPDFバイナリが出来ればファイルダウンロード処理が走るハズ。


### 2.2.2. PrintToPDF用のURLを作り、Server Actionを完成する
まずは、`PrintToPDF`または`PrintToPDF_Advanced`を追加する。
ちなみに、下の画像がそうだが、`PrintToPDF`に設定するURLは、べた書きで良いならPDF用Screenのプレビューをブラウザで開いて、アドレスバーから**クエリストリングを除いたもの**をコピーして使えば目的は達成できる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92447/6a1381c0-68aa-2259-7d3c-fd68f1a8245c.png)

まあ、それではアレなのでちゃんと作るが、↑をすると正しいURLは分かるので、APIから動的生成するURLはこんな書式になりそうだ。

`https://（ドメイン名）/（アプリ名）/（スクリーン名）`


そこで、リファレンスを見るとこの辺が使えそうなので、APIをDependencyしておく。

**HTTPRequestHandler API**

https://success.outsystems.com/ja-jp/Documentation/11/Reference/OutSystems_APIs/HTTPRequestHandler_API

**Text API**

https://success.outsystems.com/ja-jp/Documentation/11/Reference/OutSystems_APIs/Text_API


実際にURLを作る為にこういう変数の構成にした

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92447/2954140e-ebfb-1f9e-d044-fd5cf51ee17c.png)

| 変数名               | 型          | 用途 |
|----------------------|-------------|------|
| OutData              | Binary Data | PDFデータ |
| Message              | Text        | エラーメッセージなどがあったら入れる |
| IsSuccess            | Boolean     | Actionの実行成否 |
| PDFScrrenInternalURL | Text        | Screenの一時URLを格納する為に使用 |
| PDFScreenURL         | Text        | PrintToPDF Actionの引数URLに使用 |


実装したフローについては次のようにAPIを組み合わせて作った。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92447/6551f990-631d-e622-5fa9-0e83a45ea512.png)

1つ目の`Assign`ではこんな感じの文字列が得られる
`https://personal-ppneswkx.outsystemscloud.com/PDFOutput/BlankPDF.aspx`

しかし、拡張子が付いた状態のURLは内部的なものなので、2つ目の`Assign`で拡張子以降を除去してこの形の文字列になる。
`https://personal-ppneswkx.outsystemscloud.com/PDFOutput/BlankPDF`

出来上がったURLを`PrintToPDF`の`URL`に割り当て、その戻り値を3つ目の`Assign`で`OutData`に割り当てたら完了だ。


### 2.3. 動作確認
ファイルがダウンロード出来て、内容も確認出来たらOK。
そういえば、サーバアクションを使っているせいか、JSTでなくUTCになってるようで9時間ズレてますね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92447/1f901927-ceaf-8cac-ee6e-ecb4c41a9889.png)


# 3. あとがき
…という事で、さっくりまとめると
**PrintToPDFのサーバアクションに、適切にPDF用スクリーンのURLを渡せればバイナリが得られるよ！**
って事でした。
自身のメモでもあるので過剰なまでに細かくグダグダ書いてますが、やる事はこれだけだした。

PDF出力についてはこれで終わり。
さて、とりあえずこれで何か作りたい欲求に駆られてるけどなんかあるかなあ…。

以上。