#Windowsのプリンタドライバを使わない印刷
具体的には以下の用途です。
PC-PR201、ESC/P、LIPSなどのプリンタ言語を、プログラムで生成するなどして直接プリンタに送信するケース。
PDFファイルを、PDFダイレクト印刷対応のプリンタ・複合機(リコーMP C4503など)にPDFファイルを直接送信しての印刷を行う。
##プリンタドライバとは
プリンタ本体が印刷するのに使うデータ形式があり、それをプログラマが知らなくてもよい、というのが成り立ちでした。
現在では、Windows仕様の印刷データ(プリンタドライバがWindowsから受け取る形式としては1つですが、Windowsがプログラムから受け入れ仕様が厳密には数種類あります)を生成するだけで済み、それをプリンタドライバが変換してくれます。
ここでは、プリンタ本体が印刷するのに使うデータ形式のデータを『プリンタRAWデータ』と呼びます。
なので、プログラムで「A」を印刷というのは、
「A」を Win32Apiや.Netオブジェクト > Windowsの受け入れ仕様 > プリンタドライバで変換 > プリンタRAWデータ > ポート番号 > プリンタ本体
となります。
一般にはこの最初のステップで、Windowsの標準印刷では、GDI+系といわれるもの、.Netのオブジェクトを利用するなど複数あり、ネットに多くの情報があるのはここです。
##プリンタRAWデータの取得方法
プリンタドライバの出力先ポートの設定で、「ファイル」というのがあります。この設定でWindows標準印刷をするとバイナリファイルを保存することができます。
このバイナリファイルこそが、プリンタ本体が印刷するのに使うデータです。
これはメーカーごとに異なるのと、EPSON ESC/P、NEC N201、CANON LIPS IIIといった旧世代のものと、PDF 程度しか仕様が公開されていないので、事実上はWindowsプリンタドライバを利用せざるを得ません。
ただ、この「ファイル」の利用方法がwindows2000の時代からよくわからない、というのが私の認識でした。メーカーはわかる、という表現をされていましたが。
数年前にわかったことですが、この「ファイル」を「そのまま(RAW)」プリンタへ送信すると、プリンタが印刷をします。
当然のように思えますが、プリンタドライバはWindows印刷データを変換する仕様です。
そして、プリンタドライバ(厳密にはプリンタスプーラ)を経由しないで、プリンタへ「ファイル」を「そのまま(RAW)」する、というのが逆に難かったのです。
具体的にはLPTポートをDOSプロンプトからリダイレクト・・・という気の遠くなる方法でやっていました。
このとき、openしてwriteでは相手がファイルではないので(ファイルのように扱うクラスライブラリで可能なだけなので)不安定でした。
##ファイルのようにopenしてwriteできるなら、ファイルコピーしてしまえば!?
ということで、1ページ分のデータをバイナリファイルに書き出して、それをDosプロンプトからLPTポートへファイルコピーしました。
そしたら、あっけなく成功!!!
この発見が非常に重要でした。
##プリンタに来るデータの経路の種類
簡単に利用できる順
1.Windowsのプリンタドライバを共有設定にする
2.LANのIPアドレス
3.LPTリダイレクト
4.LPT(パラレルポート)
1番の「Windowsのプリンタドライバを共有設定にする」について、詳しく書きます。
共有にすると共有名を設定します。ここでは「P1」とします。
もちろん、印刷先ポートもWindowsで設定します。(USBでもLANでも仮想でもOK)
そして印刷先を「ファイル」にしたバイナリファイルなり、ESC/Pの1ページ分のファイルを用意します(数行分でも、数ページ分でも、もちろんOKです)
Dosプロンプトで
copy TESTDATA.BIN ¥¥127.0.0.1¥P1
ただ、これだけです。
127.0.0.1は自分のPCのIPという意味の固定値です。(仕様です)
これをすることで、【プリンタドライバが変換しないだけ】で、他の動作は通常に行われます。
プリンタスプールにデータが溜まり、プリンタへデータが送信されます。
最近のプリンタや複合機ではPDFダイレクト印刷対応のプリンタがあります。
そのプリンタに対してはPDFファイルをコピーしてあげると、そのまま印刷してくれます。
ちなみに、メーカーにPDFダイレクト印刷をしたいので、プリンタに直接PDFをWindowsから送信する方法を教えてください、といっても回答不可で、USBメモリのPDFを複合機本体に差し込むと印刷できますよ・・・という回答になってしまいます。
私がこの手法でのPDFダイレクト印刷を確認した複合機はリコーのMPC4503、MPC5503でした。この世代以降はPDFダイレクト印刷に対応しているようです。
##プリンタからするとファイルが複数であっても、純粋に「命令が順番にくる」だけ
なので、プリンタはこちらが想定した動作をしてくれます。(最近はなかなかそういうケースが無いので、感無量です)
先の複合機、MPC4503だったりはRPJLに対応しています。Ricoh仕様のPJLという意味です。
PDFそのものものがこういった各社PJL(HPが仕様策定したもの)にPDFの仕様として対応しているので、普通にPDFビューワで見れます。
PJLそのもはXMLのタグで「3番トレイの用紙を使って、フィニッシャーで左2か所ステープルをする」という命令を付加するだけです。プリンタ設定情報ですね。
この情報をプログラムで生成して、バイナリファイルに書き出す。それをファイルコピーする。
Windowsも複合機も何のメッセージも出さずに印刷が完了する。
私は感動する。(笑)
こんな感じです。
業務では番号を押したら黙って印刷が始まる、というように、プリンタ等は単純道具としての振る舞いが重要です。
高機能なんだけれど、毎回用紙サイズを設定する必要はないし、ドライバ設定の保存という手法では、ドライババージョンやOSのバージョンで互換性が無いですし、さらには
【最初の1度だけとはいえ、何十台もあるパソコンで、何台分ものプリンタの設定をするという、阿保なことをしなくてすむということです。今は21世紀です。】
RPJLの仕様は「ファイル」に保存したら平文で(PJLが平文仕様なので)書かれていたので、それをコピペ的に再現して利用できるようになったので、今ではリコー押しではありますが、
複合機ではcanonもPJLに対応しているので、やりようはあると思います。
ただ、インクジェットの機種でPDFダイレクト対応のもののが無いので、角2などの封筒印刷はちょっと面倒だなと思います。
また、ドットインパクト プリンタはESC/PかN201対応の機種が現在でも販売されているので、バイナリデータを作れる、もしくは旧来の移植を・・・というケースでも、このファイルコピーはおすすめです。
私のところでは500万円のラインプリンタもこの方法で毎日印刷しています。