2
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

今さら聞けないWindowsでプリンタドライバを使わない印刷

Last updated at Posted at 2019-12-18

#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万円のラインプリンタもこの方法で毎日印刷しています。

2
7
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?