Linuxの印刷

このテキストについて

このテキストは次の授業で使用されている標準化された教材です。

実際の授業では解説が加わる上に、生徒様に合わせて教材は制作・調整されるため、 このテキストよって得られる理解がMimir Yokohamaの授業のすべてではないことを予めご理解ください。

LR/LPR/LPRng

LPR

初期のUnixシステムで使われていたプリンティングシステムはBerkeley LPRとSystemV LPでした。

LPとは“Line Printer”であり、LPD(Line Printer Daemon)に対してLPR(Line Printer Remote)を介してTCP/IPを用いて印刷ジョブを送信します。

この仕組みはRFC1179で標準化されており、クロスプラットフォームの印刷プロトコルとなっています。 この仕組みの中にネットワークプリンティングの機能が含まれています。

Berkeley LPRはドライバがなく、PostScriptプリンタに対して印刷ジョブを送信します。

LPRng

LPRng ソフトウェアは Berkeley LPR の印刷スプーラ機能に改良・拡張を加えて可搬性を高めた実装です。RFC1179 の要件を満たすインターフェイスを提供しますが、全く新しい実装であり次のような機能が存在します: 軽量な lpr, lpc, lprm プログラム (データベースが不要)。印刷キューの動的なリダイレクト。ジョブの自動管理。詳細な診断。単一のキューで使えるマルチプリンター。SUID root を必要としないクライアントプログラム。緻密なセキュリティチェック。大幅に改善された権限管理・認証機能。

(公式より)

LPRngはCUPSが普及するまで長く使用されていました。

ただし、GTK3/Gnome3やKDE, そしてChrome/ChromiumはLPRでの印刷をサポートしていません。 これらでLPRngで印刷するためには、一旦PDFに印刷してからPDFをpsフィルタを介して印刷するという方法があります。

制御コードとページ記述言語

Postscriptは抽象化されたプリンタ制御プログラムであり、ページに対してどのように印刷するべきかという情報が書かれています。 このようなプログラミング言語をページ記述言語といいます。

PostScriptはその特性からベクターグラフィックスの表現にも用いられ、現在でもAdobe Illustratorで多用される形式であるeps(Encapsulated PostScript)という画像ファイル形式で目にします。 epsファイルはメディア埋め込み用情報をPostScriptに追加したものです。

これに対して直接にプリンタを物理的に制御するものをプリンタ制御コードといい、 CanonのLIPS, EPSONのESC/Pなどがあります。

フィルタ

PostScriptはAdobeへのライセンス料が高額なこともあり、そのほとんどはレーザープリンタに実装されています1

一般ユーザーの場合はなんらかのフィルタを介してPostScriptの印刷ジョブをプリンタに合わせる必要があります。

GhostscriptはPostScriptを別の形式(主にはラスタイメージや制御コード)に変換することができます。 Ghostscriptドライバーはプリンタ制御コードに変換し、プリンタに送信します。

CUPS

概要

CUPS (Common Unix Printing System)はUnix系OS向けの汎用印刷システムです。

Mac OSやWindowsに対してUnix系OSの印刷環境は劣っていました。 開発人員が少ないにも関わらず、互換性のないSystemV LPとberkeley LPRの発展であるLPRngがあり、サポートするのは特殊なラインプリンタとPostScriptプリンタのみ、さらにプリンタが登場するごとにGhostscriptが制御コードあるいはプリンタ用ラスタイメージをサポートする必要がありました。

1999年に誕生したCUPSの主な目標は次のようなものです。

CUPSはプリンタの情報を全てPPDファイルに記述します。 PPDファイルがあることにより、プリンタ用に調整されていないPostScriptデータがそのプリンタに最適化されたPostScriptに変換されます。

ほとんどの普通のプリンターはPostScriptプリンタではなく、PPDファイルだけでは動作しません。 プリンタが理解可能な形式に変換する必要があります。

しかしながら従来のように全てのプリンタに合わせたフィルタを用意する必要はありません。 同一メーカーのシリーズであれば、およそ同じ形式を理解します。 プリンタごとの違いは機種の特徴や機能の違いですが、そのような違いはPPDファイル2に記述されており、 フィルタの開発も容易になりました。

CUPは最終的にプリンタに送信を担うフィルタ(多くの場合Ghostscriptあるいはfoomatic-rip)まで、オプションを渡しながら起動していき、パイプを通して処理していきます。

構造

CUPSはCUPSスケジューラが印刷要求を受け付けます。 CUPSスケジューラは広く使われているIPPと、LPRngで使われていたlpdを受け付けます。

また、CUPSはSystemV LPのlpコマンドと、Berkeley LPRのlprコマンド両方の形式をサポートします。

CUPSスケジューラはモジュール構造となっており、CUPSの初期化と設定を行うコンフィギュレーションモジュール、データ形式の変換のために用いるMIMEモジュール、PPDデータベースを取り扱うPPDモジュール、システムで利用可能なデバイスリストを扱うデバイスモジュール、CUPS内のプリンタとPPDを扱うプリンタモジュールがあります。

スケジューラに入った印刷上部は一連のフィルタを介して印刷可能な形式に変換し、最終段にあるフィルタがバックエンドに送信します。 この最終段のフィルタとしてPDFフィルタがあり、これを用いることでPDFファイルとして保存することができます。

バックエンドとしてはパラレルプリンタ、シリアルプリンタ、USBプリンタ、IPPプリンタ、JetDirectプリンタ、lpdプリンタ、SMDプリンタに対応します。

印刷可能な形式となっていないデータは印刷可能な形式に変換します。 この変換処理はMIMEタイプに基づいて行います。

Foomatic

Foomaticは元はcups-o-magicという名前でした。

Grant Taylor氏がCUPSの「プリンタ情報をPPDに書く」というアプローチに対して、 「自分が持っているプリンタ情報を元にPPDを自動生成しよう」と考えたものです。

foomatic-dbはXMLが書かれた機種情報を元にPPDを生成します。 機種情報はOpenPrinting Databaseにあります。

OpenPrinting Databaseはユーザーが機種情報またはPPDをアップロードすることができます。

PPDには例えば「給紙トレイ(InputSlot)はTray1, Tray2, Manualがある」のような記述があります。 OpenPrinting Databaseはこうした情報をより見やすく、扱いやすくするためにXML形式で書かれた機種情報を受け付けます。

foomatic-dbによって生成されるPPDファイルによって、プリンタに対してどのような操作が可能か(給紙トレイが何段あるのか、カラー印刷は可能か、両面印刷は可能か、など)ということがわかり、印刷クライアントプログラムはそれを元に印刷を要求することができます。

FoomaticはCUPS専用ではありませんが、現在Foomaticを使っているのは事実上CUPSのみで、 CUPSに付属するFoomaticはLPRngサポートが外されています。 ただし、LPRngサポートつきFoomaticを使って、LPRngのドライバとしてFoomatic-ripを使うことができます。

ハードウェアとドライバ

Ghostscript RIP

Ghostscriptはプリンタの制御コードあるいはプリンタにそのまま送信できるラスタイメージを生成して送信するドライバ機能があります。

従来、ほとんどの普通のケースにおいてはLPRngあるいはCUPSはGhostscriptにプリンタへの送信まで行う最終段を委ねていました。

プリンタに対する要求によって変化するオプション(例えば、どの給紙トレイから紙を取るのか)を組み込んだ上でコードを生成し、プリンタに送信します。

多くの場合、純粋な意味でのプリンタドライバはGhostscriptが持っています。 ただし、プリンタが理解する言語は比較的種類が少ないため、プリンタごとの差異が埋まれば開発コストはかなり下がります。

foomatic-rip

foomatic-ripは標準入力からデータを受取、任意のコマンド文字列をパイプで実行します。 この際にPPDに記述された選択肢に変数の代入することができます。

コマンド実行前に変数の置換を行い、コマンドを実行することでプリンタに対して印刷ジョブの情報を付加したり、 印刷ジョブを送信したりします。

これらの処理は大部分をGhostscriptとPerlで行っています。

プリンタはプリンタが動作するプリンタの言語があります。 これはPostScriptであったり、あるいは制御コードであったりです。

このほかにPJLがあり、PJLはプリントジョブの情報を送るモードです。 UELという文字列(<ESC>%-12345X)を送るとプリンタはPJL受け付けモードとなります。

PJL受け付けモードの間はプリンタはプリンタ言語ではなくPJLを受け付けます。 プリントジョブの情報はプリンタ言語で送ることもできますが、プリンタによって異なるプリンタ言語での送信は誤動作の確率が高まるため、foomatic-ripはなるべくPJLで送るようにしています。

@PJL ENTER LANGUAGE=xxxというPJLコマンドを送信するとプリンタはプリンタ言語xxxモードになります。

CUPSもPPDファイルによってある程度差異を埋めることができますが、 これだけでは完全な動作が得られません。なんだかんだで細かな調整・加工が必要になります。

PPDファイルでプリンタの仕様が分かっている状態になっていますから、プリンタごとの差異は吸収できています。 Ghostscriptがプリンタ言語に変換して出力することができます。

foomatic-ripによって柔軟なプリンタドライバ開発が可能となっています。

Gutenprint

GutenprintはGhostscript/CUPS向けの高品位ドライバーを提供するオープンソースソフトウェアプロジェクトです。

フォトレタッチソフトウェアのGimp向けの拡張プリントプラグインも同じコードベースで提供しており、細かな調整も可能にします。

プロプライエタリドライバ

プロプライエタリドライバはメーカーが提供するクローズドソースのLinux向けのプリンタドライバです。

Canon及びEPSON3, 富士ゼロックス, Brother, NECがプロプライエタリドライバを提供しています。

これらのドライバはCUPS用, LPRng用, Ghostscriptドライバ, あるいはPostScriptやPDFファイルを入力して印刷できるドライバとなります。

現在はfoomaticドライバの充実によりプロプライエタリドライバを必要とするケースは少なくなっており、 またプロプライエタリドライバの提供も安定しなくなっているため、プロプライエタリドライバを使用することは少なくなっています。

また、プロプライエタリドライバは更新されないため、古い形式のプリンタのドライバは使用しているライブラリやアーキテクチャが古く、どんどん顎かなくなり、プリンタが使えなくなることはありがちです。

foomaticはバイナリではないため、foomaticを使うことで古いプリンタでも動作させることができます。

hplip

hplipはHPが提供するHP製プリンタ, スキャナ, オールインワンデバイスに対するオープンソースのプリンティングソリューションパッケージです。

hplipには

があります。

HP製プリンタはHPの積極的な提供により、Linuxで安心して使うことができます4


  1. 低価格なPSインクジェットプリンタとしては、Espon PX-S7050PSがダイレクトショップで89,980円となっています(2017年12月現在)。ビジネス用プリンタ以外はさすがにみかけません。

  2. CUPS PPDの記述内容としては、「LIPS 4Vをプリンタ言語として使用し、InputSlot(給紙トレイにFront1からFront6、手差しのManual1とManual2を持っている」といったものになります。

  3. エプソンのプロプライエタリドライバはエプソンアヴァシスが提供しています。

  4. ただし、これは「確実に使える」以上の意味には乏しいと言えます。カラーコントロールや位置合わせの精度など、HPプリンタがCanonやEPSONと比べ印刷品質を重視していないということを置いておくとしてもWindowsほとのクオリティでは印刷できません。

Fullsized Image