2008/11/24(月)Canon CAPT プリンタ を Ubuntu/amd64 で使う

※これは古い記事です。新しい記事を参照ください


ネット上で結構みんな苦労している、CanonのCAPTプリンタを Ubuntu 8.04LTS/amd64*1で使えるように設定します。x86(ia32)でうまく印刷できない方も参考になると思います。

※印刷するまで格闘していた様子はこちら

*1 : Debian系です

Canon CAPTプリンタとは?

Canonの資料によれば*2、ページ記述言語をもたないプリンタで、PC側(プリンタドライバ側)でビットマップデータを作成してプリンタに転送するものです。プリンタ側の演算回路を省略できるため、低コスト化が計れるようになっています。

color-capt.gif

その他、推測ですがプリンタ側の印刷制御の多くも行っているようです(印刷の状況をみながらデータ転送する等)。

*2 : 掲載画像はリンク先より引用

ドライバのインストール

Linux版のドライバが配布されていますが、執筆時点(2008/11)で「CAPT Printer Driver for Linux Ver1.70」は32bit版しか存在しません。ソースファイルも配布していますが、この中には肝心のプリンタ制御デーモンのソースがありません(これらは32bitバイナリでしか配布されていません)*3

結局、Debian/x86(32bit)パッケージをia32エミュレーションで動かすことになります。

インストールの準備

動作に必要なもの。(CAPT Ver1.70現在)

# apt-get install cupsys
# apt-get install libstdc++5 gcc-3.3-base
# apt-get install libgtk1.2
# apt-get install ia32-libs

最後は、amd64環境で ia32 バイナリを動かすためのものです。これで一応全部です。

これだけで足りると思ったのですが、試行錯誤した結果Linux Desktop環境がないと何故か動作しない現象に襲われました。おそらく、デスクトップ環境に含まれる何かのデータに依存していると思われますが、究明には至りませんでした。*4

# apt-get install ubuntu-desktop-ja
※Ubuntu Serverではない、通常のGUIインストール済環境では不要

ドライバのインストールと設定

ここから、Debian用のドライバを2つダウンロードします。CPUがamd64ではないと怒られるので、"--force-architecture" を付けて無理矢理インストールします。

# dpkg -i --force-architecture cndrvcups-common_1.70-1_i386.deb
# dpkg -i --force-architecture cndrvcups-capt_1.70-1_i386.deb

ccpd(バッファリング/スプーラーデーモン)にプリンタを登録します。必ず接続しているプリンタを登録してください

# ccpdadmin -p LBP3xx0 -o /dev/usb/lp0

この登録情報は /etc/ccpd.conf に記録されます。既にccpdを起動している場合は、登録後にccpdを再起動します。きちんと登録されていることを確認します。

# ccpdadmin
(中略)
 CUPS_ConfigPath = /etc/cups/
 LOG Path        = /var/log/ccpd/
 UI Port         = 59787

 Entry Num  : Spooler   : Backend       : FIFO path             : Device Path   : Status
 ----------------------------------------------------------------------------
     [0]    : LBP3xx0   : ccp           : /var/ccpd/fifo0       : /dev/usb/lp0  :

LOG Pathなどは /etc/ccpd.conf に書き込むことで変更できます。このファイル、設定値の行頭にスペースがあると全く動作しないふざけた仕様ですので注意してください*5

続いて cupsd にプリンタを登録します。CUPSのWebインターフェイスから登録するのが簡単です。

「プリンタの登録」→「Canon Printer Deamon Port#1」→「Canon」→「……」

デバイスポートは必ず「Canon Printer Deamon Port#1」を選択してください。またプリンタも正しく登録してください。RAWにしても絶対動作しません。これにより ccpd 経由で印刷データが送られます。「Canon LBP3xx0 USB #1」を選択してはいけません。

コマンドラインから登録する場合は次のようになります。プリンタの型に該当する部分は適切に書き換えてください。fifo0 というのが「Canon Printer Deamon Port#1」に相当します。

# lpadmin -p LBP3xx0 -m CNCUPSLBP3xx0CAPTJ.ppd -v ccp:/var/ccpd/fifo0 -E

続いてデーモンを起動します。cupsd は既に起動されていたら省略してください。

# /etc/init.d/cupsys start
# /etc/init.d/ccpd start

*3 : Ubuntuでソースから構築するのは辛い思いをすることになるのでやめた方が良いです。

*4 : ちなみに自分は ubuntu-desktop-ja ではなく kubuntu-desktop を入れました。ja版はamd64には対応なしだそうです……

*5 : そもそも、LOG Pathを設定してもログが記録されている様子がありません……。

リモート印刷の設定・印刷設定

プリンタをWindowsから印刷できるよう登録します。

リモート印刷の設定 by CUPS

CUPSで印刷設定する場合 /etc/cups/cupsd.conf に記述します。192.168.xxx.yyyがサーバのIPです。

Listen 192.168.xxx.yyy
<Location />
  # Allow remote administration...
  Order allow,deny
  Allow @LOCAL
  Allow from 192.168.xxx.0/24
</Location>

cupsd(cupsys)を再起動してブウラザから http://192.168.xxx.yyy:631/ にアクセスしてCUPSの画面およびプリンタが正しく表示されることを確認してください。

Windowsからはプリンタ追加ウィザードを開き、インターネット印刷を選択して、http://192.168.xxx.yyy:631/printers/(登録したときのプリンタ名) を指定します。登録名をプリンタ型番と一緒にしてあれば、http://192.168.xxx.yyy:631/printers/LBP3xx0 とかです。*6

リモート印刷の設定 by Samba

smb.confに次のように設定します。

printing = cups
printcap name = cups

[printers]
        comment = Printers
        path = /var/spool/samba
        browseable = yes
        guest ok = yes
        printable = yes
        use client driver = yes
        printer admin = userXX

これはサンプルです。参考程度にしてください。サーバからドライバを自動インストールするためには [print$]というセクションを作る必要がありますが、ここでは省略します。

*6 : このアドレスはブラウザでも開くことができます。

Linux上からの印刷

Linux/CUPS印刷の仕組み

Linuxから印刷する仕組みを説明します。まずUNIX系では標準の出力形式は今も昔も Postscript です。これには変わりありません。CUPSでは、Ghostscript を使用して、PostScriptをそれぞれのプリンタにあった出力形式に変換しています。

$ gs -h

としてみれば、対応している形式がたくさん出てきます。この中に、あきらかにプリンタ名になっているものが沢山出てくると思います。相互変換のための仕組みが Ghostscript に組み込まれているためです。

しかし Canon の CAPT プリンタは Ghostscript には組み込まれていません。このようなプリンタのために変換部を外部ライブラリとして提供する仕組みがあります。これが opvpoprpと呼ばれるものです。amd64環境では、これらドライバが32bitでしか提供されていないため、そのままでは印刷ができません。

設定方法

まず Ghostscript をインストールします。

# apt-get install gs

Ghostscript が opvp に対応していることを確認します。*7

$ gs -h | grep opvp
oki182 oki4w okiibm omni oprp opvp paintjet pam pbm pbmraw pcl3 pcx16

現在提供されている Canon CAPTプリンタは*8

  • libcanonc3pl.so
  • libcanoncapt.so

のどちらかの形式(ライブラリ)になっています。これらは幸いなことにGPL2ライセンスであり*9ソースファイルが配布されています。

コンパイルとインストール

(注意)必ずパッケージを導入後に行ってください。この手順以降はパッケージを上書き導入しないでください。

上に示したGhostscriptライブラリのコンパイルにはいくつかモジュールが必要です。(コンパイル済バイナリも下においてあります)

# apt-get install automake libcupsys2-dev

ソースを展開して必要な物のみコンパイルします。*10

# tar zxvf cndrvcups-common-1.70-1.tar.gz
# cd c3plmod_ipc
# make
# cp libcanonc3pl.so.1.0.0 /usr/lib
# tar zxvf cndrvcups-capt-1.70-1.tar.gz
# cd cndrvcups-capt-1.70/driver
# make
# cp libcanonc3pl.so.1.0.0 /usr/lib
# ./autogen.sh
# make
# cp .libs/libcanoncapt.so.1.0.0 /usr/lib/

これで問題なくLinux上から印刷できるようになります(CUPS画面上のテストページの印刷が成功するようになります)。再起動等は不要です。

Canon opvpドライバ、コンパイル済バイナリ

Canon opvpドライバをMITライセンスに基づき、amd64環境(Ubuntu8.04)でコンパイルしたバイナリを配布します。Debian系なら多分そのまま動くでしょう。

canon-opvp-libs-1.70.tar.gz

でできた lib* ファイル2つを /usr/lib に上書きコピーしてください。

*7 : 対応していないときは(対応しているとは思いますが)、gs ではなく gs-esp をインストールしてください。

*8 : これを調べるには、/etc/cups/ppd/(プリンタ名).ppd ファイルを開き「opvpDriver: "libx????.so"」となっている行を探します。

*9 : Ghostscriptとリンクしているから幸いでもなんでもなく当たり前なんですが

*10 : 迂闊に全部コンパイル&インストールするとcaptドライバ側を32bitで動作させているため動かない可能性があり、opvpライブラリのみ64bit環境でコンパイル&インストールします。

トラブルと注意点

  • CanonのCAPTプリンタは、/dev/usb/lp0(=/dev/usblp0)に直接データを送信してもプリンタは全く受付ません。バッファデーモン(ccpd = Canon CAPT Printer Deamon)を起動させ、それ経由で出力する必要かあります。*11
  • CanonのCAPTプリンタには機種固有の制御デーモンが必要です。これは ccpd(cupsd?) から印刷時に自動で呼び出されます*12。例えば、LBP3300ならば captmonlbp3300、LBP3310ならば captmoncnab7 が起動します。

うまく印刷出来ないときは

  • cupsd が起動しているか確認する。
  • ccpd が起動しているか確認する。
  • デバイスURIが ccp:/var/ccpd/fifo0 等になっているか確認する。
  • 印刷データ送信後に プリンタ(固有の)制御デーモンが起動しているか確認する。

よくある事例

ps ax をしたとき。

  • ccp:/var/ccpd/fifo0 というプロセスがずっとある。→FIFOバッファデーモン(ccpd)から先に送られていない。プリンタ制御デーモンがうまく動作していない。
  • usb:/dev/usb/lp0 というプロセスがずっとある。→ccpdが動作していないか、CUPS上の設定(デバイスURI)が ccp:/var/ccpd/fifo0 になっていない。
  • 印刷データを送ると「すぐに印刷完了する」が、実際には印刷されない。→上のドライバインストール偏を参照

正しいはずなのにうまく印刷出来ない

プリンタに妙なデータが送られていると、うまく印刷できなくなることがあります。そのときの復旧方法。

  1. プリンタを再起動する。(電源を一度切って入れる)
  2. ccpd を再起動(/etc/init.d/ccpd restart)

プリンタ非使用時は電源を切っておき、使用するときだけ電源を入れて印刷データを送るという使い方をしても問題ないようでした。ただし、CUPS起動後に一度は電源をいれてプリンタを認識させる必要があります。

*11 : おそらく印刷データを一度スプールして、この先に制御ドライバ経由で送り込んでいるようです。

*12 : 一度でも印刷データを送信しないと起動しません。ccpdをただ起動しただけでは起動しません。

感想その他

今時、64bit版を公開しないのはどうかしてる。そもそも全ソース公開すればいいのに。おまけにCUPSとプリンタの間にccpdデーモンが仲介するせいで、送信済プリンタジョブをCUPS上から削除できない等管理に問題がありすぎる。

この一件で、Canonが嫌いになりました。今後余程の理由がない限り、Canonのプリンタを買うことはないでしょう

参考リンク