All About ACS: IBM i Access Client Solutions の JPS 印刷

ACS での JPS(Java Print Service) 印刷についてまとめます。
下記もご覧ください。

[IBM i Access Client Solutions での印刷方法と基本機能の比較](https://qiita.com/6onoda/items/13451f7a75f31110dd68)

# 機能

| 機能| 可・不可 | 補足 |
|:----:|:-:|:-:|
|  外字 |  △ |monospaced で Windows外字 |
|  1399拡張文字|  〇 | プリンタードライバーの機能 |
|  再現度 |  △ | Java とプリンタードライバーの機能に依存  |

# 設定

JPS を使うために、下記の3か所を確認します。

「HPTの使用」を「いいえ」にします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/26a3161d-8521-dd75-dfaa-ae5620a39a39.png)

「プリンター定義テーブルの使用」を「いいえ」にします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/82d777c8-e6fe-53f2-16dc-2303f2f71961.png)

「Java印刷サービスの使用」を「はい」にします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/4f311a5c-5fa6-55d2-ac53-34286b6629c1.png)

# プリンター設定は、出力先を選ぶためだけ

「その他」をプリンターとして選び、「プリンターの選択」をクリックすると、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/fa89fe56-49e8-b135-0d05-0e2fa6b76f25.png)

プリンターの選択だけでなく、用紙の指定や、プリンターのプロパティのダイヤログを開くボタンが現れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/afd407d1-5024-557d-2f07-fc042b3f704a.png)

ここで、ACSに対して指定可能なの**プリンターの選択だけ**です。
**プリンターのプロパティ指定は無視されます**。
**プリンターのプロパティを指定したい場合は、プリンターのデフォルトプロパティとして指定します**。

対象のプリンターの「管理」を開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/88a9928f-f342-94a4-6116-0c44bae5f7ea.png)


「プリンターのプロパティ」の項目があるので、こちらでデフォルト値を設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/63ef2634-1bf7-69a9-5381-e94bdc2b9bb8.png)

# ACS で制御できるのは「ページ設定」の項目

ACS で制御できるのは「ページ設定」の項目です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/c02d8172-0e8f-87a0-6ad2-df6f690e4ba7.png)

## ページの向きの自動決定

「はい」を選ぶと、ページ設定で、縦向き用紙が選択されていても、印刷幅が80文字以上の場合に、自動的に横向き用紙への印刷にします。

## 最適化

「はい」を選ぶと、スプールの LPI/CPI を無視して、1ページを選ばれている用紙全体に印刷します。

### 汎用紙 => A4 の自動縮小には、最適化を「はい」

最適化による自動調整は、縮小にも適用されます。
15x11 インチ汎用紙を想定したシステムの出力も、用紙で A4 を選んで最適化を「はい」にすれば、A4 に収まるように縮小されます。

## フォント名

外字を使いたいなら、Monospaced を選びます。

## フォントスタイル

通常「プレーン」です。

## ページ設定

用紙サイズ、向き、マージンを設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/40e302a0-d767-5a09-b4d7-4be52975981a.png)

# FAQ

## 7.5 以外のLPIで印刷したい (2019-07-03 追記)

readmespacs.txt に下記の記載があるため 日本語モードでの JPS の印刷は 7.5 LPI 固定と誤解されておるかもしれません。

ftp://ftp.software.ibm.com/as400/products/clientaccess/solutions/readmespacs.txt

>6. Enhancements to 5250 Print: (RFE 95790, RFE 99537, RFE 107622)
   - The 5250 print support has been significantly updated to enable Java Print Service (JPS) with the following features:
     Characters per inch (CPI)
     Lines per inch (LPI) for SBCS code page sessions (DBCS sessions always use 7.5 LPI)

この記載は、1.1.8.0 で大きくJPS印刷が変わった時の、情報・制約を述べたものです。

同文書の 1.1.8.1 での修正リストの下記のAPARで、スプールのLPIが使えるようになっています。

>APAR SE70063  OSP-PAR-940XMISC JPS DBCS LPI; MARGINS AND START POSITION OF FIRST PRINTED LINE HAS OPTIONS AVAILABLE OR HAS BEEN FIXED.    


APARの情報は、 acssm.ini の変更を示唆していますが、変更の記載はありません。

[SE70063 - OSP-PAR-940XMISC JPS DBCS LPI; MARGINS AND START POSITION OF FIRST PRINTED LINE HAS OPTIONS AVAILABLE OR HAS BEEN FIXED.](https://www-01.ibm.com/support/docview.wss?uid=nas2SE70063)

>ACS Java Print Services LPI for DBCS is 7.5 unless you modify acssm.ini file each time and you are not using Load Alternate characters.


スプールのLPIを有効にするには、ACS のエミュレーターパス(通常は 「C:\Users\\[ユーザー名]\Documents\IBM\iAccessClient\Emulator」)にある acssm.ini の [Configuration]  セクション内にに下記を追加してください。

```
jpsDBCSUseSplfLPI=true
```

acssm.ini は下記のようになります。

```
[Session Manager]
｢Configuration]
directory=C:\Users\user01\Documents\IBM\iAccessClient\Emulator
dataxferLocation=C:\Users\user01\Documents\IBM\iAccessClient\DataTran
sfer
location=477,62
...
jpsDBCSUseSplfLPI=true 
```

**acssm.ini の編集はACSを終了させた状態で行ってください。**
ACS はすべての 5250 セッションの終了時に ACS が認識している内容で acssm.ini を、書き出します。
ACS起動中に編集しても、起動時になかったので認識していない jpsDBCSUseSplfLPI=true は、この動きにより消去されます。

変更は次回ACSを起動したときに有効になります。

LPIによって文字のサイズも自動調整されます。ただし横方向の印刷位置は CPI に従って計算されるため同じCPIであれば、文字の大小にかかわらず印刷幅は一定です。

なお、7.5 LPI 固定は  Load Alternate characters コマンド(文字イメージの登録コマンド)で バーコード印刷などを行うことを想定してデザインされた機能でした。
スプールの LPI を有効にすると、バーコード印刷などの印刷に影響を与えます。

## 横向き用紙に印刷ができない

Java のバグです。ACS が高付加でループする、白紙が出る、ほぼ全面が真っ黒で印刷されるなどの状況が発生します。

OpenJDK8以降、Oracle Java 9以降で発生します。
Java 12で修正されています。

[Wrong fontMetrics when printing in Landscape (OpenJDK)](https://bugs.openjdk.java.net/browse/JDK-8139178)

2019/07にリリースされるJava 11.0.4 にも修正がバックポートされるようです。

[Wrong fontMetrics when printing in Landscape (OpenJDK)](https://bugs.openjdk.java.net/browse/JDK-8223503)

2020/1にリリースされたJava 8U242 にも修正がバックポートされました。

[Wrong fontMetrics when printing in Landscape (OpenJDK)](https://bugs.openjdk.java.net/browse/JDK-8235298)

Oracle Java 8 か修正されたJavaを使ってください。

## PDFに出力すると、縦向き用紙に横方向印刷される

Java と PDF ライターのプリンタードライバーの動きによるもので、ACSで制御できるものではありません。
CUTE PDF や Windows 10 標準の Microsoft Print to PDF などで、発生します。

RFEが出ていましたが、ACS で 制御できるものではないので、decline になりました。

https://www.ibm.com/developerworks/rfe/execute?use_case=viewRfe&CR_ID=125016

decline のコメントはこちらです。

> Using the software PDF Creator, we are not able to reproduce the issue.   Using CutePDF we can reproduce the issue.  Further analysis indicates the PDF driver is determining the viewer settings and is not something we can control.  You will need to use a different PDF driver such as PDF Creator to get the desired results.  Since it is the PDF driver determining the displayed orientation, we must decline this RFE.

ここにあるように「PDF Creator」というPDFライターを使えば用紙は横向きになり現象は発生しません。


## Access for Windows GDI 印刷と同じ印刷結果にならない

ACS では Java 通して(つまり Java で可能な範囲で) 印刷を行います。
ネイティブな Windows アプリケーションである Access for Windows の GDI 印刷に比べ、どうしても動きに制約がでます。

***
2019-07-03 7.5 以外のLPIで印刷したい項目を追記
2019-09-11 acssm.ini の編集は ACS を終了した状態で行うことを追記
2020-01-22 横向き印刷の修正が8u242で提供されたことを追記
***
「All About ACS」では IBM i に対する新しいクライアント「IBM i Access Client Solutions」の情報をいろいろ提供していきます。
[記事一覧はこちら](http://qiita.com/6onoda/items/2dc925586d8d3b8644f2)で確認いたけます。

許可の無い転載を禁じます。
この記事は筆者の個人的な責任で無保証で提供しています。
当記事に関してIBMやビジネスパートナーに問い合わせることは、固くお断りします。
***