始めの言葉

「プリンターから印刷できて当たり前」と、ユーザーからもSIerからも軽視されがちなプリンターの世界ですが、実際にはお困りだったり、思ったような印刷結果が得られないまま我慢してお使いの皆様のために、今までの経験が役立てばと、このブログを立ち上げました。印刷の基本から、応用情報、問題の解決方法を情報発信すると共に、PDF化など、これからどうするかについても、ご相談に乗れれば幸いです。ご質問はコメントでお寄せください。

2016年3月27日日曜日

連続用紙への印刷から、カット紙への印刷に移行する -第3回 キャラクター・モードを使った縮小印刷指定-

3. 印刷データの先頭に、縮小率や用紙方向、余白の値等を指定するコマンドを付加してプリンターに送信する方法があります。
この方法を使えば、ユーザーは、単に印刷指示するだけで、望みの設定で印刷結果を得られますから、ユーザーから見れば最も望ましい方式と言えます。
一方、システムの担当者から見れば、そのようなコマンドを付加して印刷データを生成するように、プログラムの修正が必要になりますので、その点では、最も手間の掛かる方式ということになります。
OS/400 の世界で標準の SCS というコマンド体系の中には、縮小等、これらのコマンドが元々ありません。SCS というコマンド体系ができた時には、そのような機能を持ったカット紙対応のレーザーが無かったことが原因と思われます。
そこで、プリンター側では持っている、PAGES モードの中にある縮小等のコマンドを、どうやって OS/400 上のプログラムから送信するかという課題を解決する必要が出てきます。
PAGES モードのプリンターで考え出された方法が、"キャラクター・モード"と呼ぶものです。
キャラクター・モードについては、バーコードの印刷方法 - 第2回 コマンドを使う、もう一別の方法 - の回で簡単にご紹介していますが、ここではもう少し詳しくお話します。
PAGES設定の中のキャラクター・モード設定

キャラクター・モードの基本的な考え方は、OS/400 上のプログラムの中では、あくまでも文字データとして扱われるが、それが、対応するプリンターに届くと、プリンターの中ではコマンドとして扱われるというものです。
それを実現するために
1. 先頭に"&$%$"という、通常のデータとしてはあり得ないような4文字を付ける。これを受信したデータは、キャラクター・モードが始まったと認識します。
2. 次に、後続のデータの内、何バイトの文字をコマンドとして扱うのかを知らせるための、バイト数を送ります。
3. その後ろに、実際に送りたい PAGES のコマンドを指定します。
という構造になっています。

キャラクター・モードの特徴と注意点は、次のとおりです。
1. 16進データではなく、文字データとして扱いますので、5250端末画面でスプールを表示した時に、指定したバイト数やコマンドが、そのまま文字として表示されますので、デバッグし易くなります。また、そのままプリンターに印刷させることによってもデバッグになります。
2. 文字データである限り、実際には文字として印刷されることはありませんが、ページの中の場所を取りますので、ページの中のどの場所に配置するかを考慮する必要があります。言い方を変えると、"Current Print Position"(現在の印字位置、ドット・プリンターでは印字ヘッドが印刷のために移動して、現在いる場所)は、キャラクター・モードのデータ分は移動しているということを忘れてはいけないということです。
3. キャラクター・モード開始を示す4文字には、"&$%$"の他に"$?!#"という組み合わせもあります。プリンターの初期設定のデフォルトは、"Off"になっていて、この設定をどちらかの組み合わせに変更することで、有効になります。どちらか一方しか指定できませんので、キャラクター・モードを使ってコマンドを送信するためにプログラムを編集する際には、初期設定と合わせた文字列に統一します。

では、A4用紙に横長で、縦横75%に縮小して印刷するためのコマンドをサンプルに、キャラクター・モードを使って、どのようにデータを送るかをご説明します。
1. 開始の文字列は、"&$%$"とします。
2. 送りたいコマンドは、次のコマンドでこの順番に並べることが重要です。
1B 7E 46 00 05 00 00 13 00 00       /* A4指定自動選択       */
1B 7E 51 00 01 01                       /* 縦・横75%     */
1B 7E 50 00 01 03                        /* 左下 270度回転 横長  */
3. 次にコマンドのバイト数を数えますが、2文字で1バイトになりますから、
10バイト(A4指定) + 6バイト(75%縮小) + 6バイト(横長) = 22バイト
22を16進数に変換すると、"x16" になりますから、キャラクター・モードで送る文字データとしては、全体で次のようになります。
&$%$00161B7E46000500001300001B7E510001011B7E50000103
この文字列を、印刷データの先頭に配置するように、プログラムを編集します。

0 件のコメント:

コメントを投稿