【帳票】OutSystemsサーバーと離れた拠点でリモート印刷

# StimulsoftEXとは
OutSystems専用に開発された帳票開発ソリューションで、Forgeにて公開されています。
基本的にStimulsoftEXの帳票システムは、ブラウザ上で動作するJavaScriptによりビューの表示や印刷を行います。
使いなれたブラウザ上で、帳票に関わる操作がすべて完結するので、現代の業務アプリケーションと非常に親和性が高いのが特徴となります。

https://www.outsystems.com/forge/component-overview/12160/stimulsoftex

https://qiita.com/REQWARE/items/c01a3e382629c85722ab

# リモート印刷とは
帳票印刷システムによっては、多くの印刷物を処理するためにプレビューなしで効率よく印刷する仕組みが求められます。また、拠点数が多かったりするなどで各拠点にてプリンター機器を管理したいなどの要件もあります。
このような場合、OutSystemsサーバーから、拠点に設置しているリモートプリントサーバーへデータを転送し直接印刷指示をすることにより、より多くの印刷ジョブを効率よく処理することで解決できます。

# StimulsoftEX リモート印刷
**リモート印刷**のための **RemotePrint** アクションが準備されています。
IPアドレスとポート、その他パラメーターを設定することで、ターゲットプリンターのサーバーへ直接、軽量で効率のよい**プロトコルバッファー**経由で印刷指示を出せるようになります。

印刷処理においては、枠線などの太さや色などの定義情報と印字に必要なレコード情報である**印刷データ**から、レンダリングを行い**印刷オブジェクト**を生成します。一般的に**印刷オブジェクト**のデータは、情報量の多いスプールデータでプリンターへ転送されるので、データサイズは大きくなります。

これに対し、StimulsoftEXの**リモート印刷**ではテキストによる少量の構造化データをバイナリ化し、そのまま遠隔地に転送するので、スプールデータ転送より効率がよいということになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486327/99dea66e-5047-b656-b9e4-33715a034785.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486327/25a9299a-29a3-d3f6-cef2-541529357b2c.png)




# Protocol Buffers（プロトコルバッファー）
プロトコルバッファーは、構造化データを高効率なバイナリへシリアル化する技術で、Google社により開発がすすめられています。
JSON に似ていますが、データサイズは小さく高速であるため、マイクロサービスの中核技術として注目を浴びています。

リモート印刷には圧縮オプションがありますが、プロトコルバッファー自体の効率がよいため、サーバーと拠点が近距離でネットワークスピードが確保されている場合には、非圧縮で送ったほうが圧縮処理のオーバーヘッドがない分、トータルのレスポンスがよい場合があります。

# 転送データサイズの効率化例
例えば、以下のような見積書の場合、印刷スプールで転送されるデータサイズは**1.05MB**にもなりますが、プロトコルバッファー経由だと、圧縮なしの場合でも**308KB**と非常にコンパクトになります。

##### 見積書見本と印刷キューサイズ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486327/14839d2a-48fc-fed1-8e76-e2ad716da427.png) 　<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486327/1925e69c-2268-cab4-5cac-e1a3b5d402ae.png" style="vertical-align=top">

# 開発手順

ボタンクリックなどのアクションに以下のフローを定義します。
通信処理になるので、印刷処理の前にボタンを非活性にして、処理が終了するまでユーザーが2重操作しないようにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486327/00f04773-e8bf-ebd4-20bf-bfeff92c0936.png)

**RemotoePrint** アクションのパラメターは以下となります。

#### ■RemotePrint
| パラメーター | 説明 　　| 
|-----------|--------------|
| IP       | ターゲットサーバーのIPアドレス        | 
| Port     | ターゲットプリンターに設定したポートの値      | 
| Template　  | 帳票テンプレートデータ        |
| SourceData         | 印字データ          |
| IsCompress | 圧縮/非圧縮<br>拠点までの回線速度が遅い場合などに印刷データの圧縮を選択できます。   | 
| IsSSL | 暗号化あり/なし<br>通信をSSLにより暗号化するかを選択できます。   | 
| IsPrintout    | 印刷あり/なし<br>印刷なしでリモートプリントサーバーへ印刷データの送信のみを行います。<br>※拠点までのデータ送信などのテストを行いたい場合に利用します。     |
| PrinterOptions    | 印刷オプション<br>※下の項を参照     |
| Output    | 戻り値<br>処理の成功可否、レスポンス時間、送信データサイズ、ターゲットプリンター名    |


#### ■PrinterOptions
| パラメーター | 説明 　　| 
|-----------|--------------|
| Copies       | 枚数        | 
| Color     | -1[規定値]　0[白黒]　1[カラー]      | 
| Landscape　  | -1[規定値]　0[縦]　1[横]        |
| Duplex         | -1[規定値]　0[片面]　1[長辺両面]　2[短辺両面]         |
| Kind       | 8[A3] 9[A4] 11[A5] 12[B4] 13[B5] 日本ハガキ[43] 0[カスタム]　<br>※原稿のサイズに関係なく、指定のサイズに拡大縮小       | 
| Width    | 用紙幅（カスタム）    |
| Heigth    | 用紙高さ（カスタム）    |


# リモートプリントサーバー
ターゲットサーバーのタスクトレイに常駐するサーバーアプリです。OutSystemsサーバーからの印刷指示を各ポートで待機します。

![img2022-09-09 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486327/e7b4eacb-689b-edb7-1dff-7543d0f10c1f.png)

- インストールとアプリケーション起動
RemotePrintServer.exeを任意のフォルダーに配置し実行ファイルを実行します。
自己完結型アプリケーションなので、.Netなどのライブラリーのインストールは不要です。
また、実行ファイルのショートカットを適切な場所に作成しておくと起動が容易になります。
- ポート設定
リモートプリントサーバーに接続されたプリンターのリストが表示されるので、ポート番号を指定しUpdateボタンを押すと、各プリンターが印刷指示待ちとなります。
- アプリケーション終了
タスクトレイにあるアイコンを右クリックして「Exit」を選択すると終了します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486327/c7629574-b9dd-c607-da19-5e77c27b1dca.png)
- アンインストール
実行ファイルを配置したフォルダを削除するだけです。特にレジストリ等への書き込みは行っていません。

# 暗号化通信（SSL）
**RemotePrint**アクションのパラメータ**IsSSL**を**true**にすることで、通信を暗号化することができます。
また、SSL通信を開始するには、リモートプリントサーバーへPFX形式の証明書を登録する必要があります。
設定するには、証明書ファイル（.pfx）をCertificateボタンで保存しパスワードを入力してください。

注）暗号化処理自身は、それなりに負荷がかかるのでレスポンス性能に影響があります。


# まとめ
如何でしょうか。OutSystemsでは、プロトコルバッファーのように新しい技術を素早く取り入れることができ、規模の大きな印刷業務システムを構築することも可能となります。