世界を動かす技術を、日本語で。

100行のPythonで自分自身のCUPSプリンタドライバを書く (2018)

概要

pretix 1.8で導入された Shipping管理機能 の解説 高品質なチケット印刷のための 専用プリンタとLinux用ドライバ 開発経緯 CUPS用フィルタと PPDファイル 作成手順 PythonとPillowを用いた 画像変換・FGL出力 の実装概要 pretixの自動印刷ツールや サポート情報 の案内

pretix Shipping管理とチケット印刷の新機能

  • pretix HostedおよびEnterpriseエディションで Shipping管理機能 を新規導入

  • チケットを PDFダウンロードではなく郵送 で送付する運用をサポート

  • ギフト包装や記念品としての用途に適した 高品質チケット印刷 需要への対応

  • 必要機材: サーマルチケットプリンタ と専用チケット用紙

    • BOCA LemurとPractical Automation uITL+2003CFの 2種プリンタを比較検証
      • 印刷品質はほぼ同等
      • uITL+は ネットワーク端子非搭載 だが、 小型金属筐体・低価格 が魅力
      • BOCAは多OS対応ドライバ提供、uITL+は Windows専用ドライバのみ
      • 両機とも FGL(Friendly Ghost Language) 対応

Linux用チケットプリンタドライバ自作の経緯

  • BOCAドライバはライセンス上 他社プリンタ利用不可ソース非公開 ・一部古いOSのみ対応
  • uITL+を Linuxで利用するには独自ドライバ開発が必要
  • UNIX系OSでの印刷は CUPS (Common UNIX Printing System)を利用
    • CUPSは標準でFGL非対応
    • 必要な作業:
      • CUPSフィルタ (ラスタ画像→FGL変換プログラム)作成
      • PPDファイル (プリンタ定義ファイル)作成

CUPSフィルタ(rastertofgl)の実装ポイント

  • Python を選択(クロスコンパイル不要・開発効率重視)
  • CUPS Raster Format v3の読み込み
    • structモジュール でバイナリデータをパース
    • 各ページの画像データ・メタ情報を namedtuple で管理
  • 画像処理部分は Pillow を利用
    • CUPSはグレースケール画像を送信、プリンタは 白黒のみ対応
    • ディザ処理 で階調表現を維持
    • チケットは 横向き印刷 前提で画像回転
  • FGL形式でのデータ送信
    • 8ラインごとに1バイトへ変換し、 <RCy,x><Gnn> コマンドで送信
    • 最後に カット制御コマンド(<p>または<q> を付加

PPDファイル(プリンタ定義)の作成方法

  • CUPS付属の ppdcツール とDRVファイルで記述効率化
  • プリンタ名・フィルタ指定・DPI・カラーモデルを記述
  • カッター動作オプション (切断しない/ジョブ毎/チケット毎)を選択可能
  • 対応用紙サイズ を複数定義(例:8x3.25インチなど)

動作検証・導入手順

  • サンプルラスタデータを cat sample.raster | ./rastertofgl > /dev/usb/lp1 でテスト
  • フィルタ・PPDを正しいディレクトリに設置しCUPS経由で利用可能
  • Arch Linux・Debian向けパッケージ を用意
  • GitHubでソースコード公開、今後の改善余地あり(GTK系PDFビューアからの印刷時の不具合等)

pretix Shipping機能・サポート案内

  • pretixの Shipping機能 ・自動印刷ツールの利用推奨
  • チケットプリンタ・用紙の販売サポート も実施
    • 購入・詳細問い合わせは sales@pretix.eu まで

Hackerたちの意見

Pretixはイベントチケットを販売するためのオープンソースソフトウェアで、すごく面白いよね。チケットプリンターのドライバーを書くために挑戦してるのも素晴らしい!応援してるよ。

https://gimp-print.sourceforge.io/ はCUPSを使って、古いCanonプリンターを復活させるのに役立ったよ。メーカーがmacOS用の更新ドライバーを提供しなかったから、捨てようと思ってたんだけど、最新のmacOSバージョンで動かないからって、まだ使えるハードウェアを諦めるのは嫌だったんだ。PerplexityがGutenprintを教えてくれて、すごくうまくいった!ただ、スキャナー機能だけは動かないけどね。

何年も前だけど、32ビットから64ビットへの移行の時に、たくさんのプリンターでWindowsサポートが消えたのを覚えてる。その頃、LinuxやBSDでの印刷の仕組みを学んで、プリンターを救おうとしてたんだ。

スキャナー部分については、http://sane-project.orgを試してみた?いくつかのCanonに対応してるみたいだから、運が良ければ使えるかも!

2014年にCanonのスキャナー用にVueScanを買ったんだけど、まだあるみたいだね: https://www.hamrick.com/

これ、めっちゃ懐かしい!初めての実践的な低レベルプログラミングをやったときのことを思い出す。古い24ピンのEpsonドットマトリクスプリンター用に、PNMビットマップをワイヤフォーマットに変換するちょっとしたCプログラムを書いたんだ。詳細は覚えてないけど、90年代初頭に初めてのLinuxシステムからPostScriptドキュメントを印刷するためにGhostviewを使ったプラグインシステムと一緒に使ってたよ。

でも、BOCAドライバーのライセンスでは、他のベンダーのプリンターを制御するためにそのドライバーを使うことは禁止されてるんだ。プリンターだから、これは「サードパーティのインクを使っちゃダメ」っていうのと同じだと思ってる:気にしないよ。

個人的には、私もそう思う。でも、ビジネスなら、たとえ嫌でも気にしなきゃいけないこともあるよね。

あ!EPSONのプリンタードライバーを見てみて。これには以下のことが禁止されてるよ:1. ドライバーのライセンスに同意しない限り、他の誰かとプリンターを共有すること(ビジネス設定を含む) 2. インターネット上で無条件にプリンターを共有すること、これはライセンスに同意しない人がドライバーを使えるようにするから 3. ドライバーを「収益を生む製品やサービス」に組み込むこと https://download.ebz.epson.net/la/linux/inkjet_for_linux.htm... 1. ライセンスの付与。[…] ソフトウェアは、(i) 単一の場所(例えば、家庭やオフィス、ビジネスの場所)でのみ使用されること、またはモバイルデバイスの場合は、あなたが所有または管理するデバイス上でのみ使用されること、(ii) あなたが所有するEpsonハードウェアと関連してのみ使用されること。あなたは、ネットワークに接続されたEpsonハードウェアの他のユーザーがソフトウェアを使用することを許可できますが、そのユーザーが本契約に従ってソフトウェアを使用することを確実にする責任を負うことに同意します。あなたは、そうしたユーザーによる使用の結果として発生する責任についてEpsonに対して補償することに同意します。3. その他の権利と制限。[…] さらに、あなたは、ソフトウェアを公共ネットワーク(インターネットなど)を通じてアクセス可能な共有環境に置いたり、上記のセクション1で言及された単一の場所の外にいる他の人がアクセスできるようにすることに同意しません。あなたは、ソフトウェアを第三者に貸したり、リースしたり、配布したり、収益を生む製品やサービスに組み込むことはできません。

残念ながら、CUPSはグレースケール値を送ってくるけど、うちのプリンターは完全に黒か白のピクセルしかサポートしてないんだ。グレースケール値を完全に捨てたくないから、ディザリングを適用したいんだよね。CUPSは1ビットの白黒データをディザリングして送れるから、PPDファイルのオプションを正しく設定すればいいだけ。回転も自分で処理できるし。それ以外は、かなり良くて正確な記事だね!50行未満のPythonコードでドライバー(フィルター)を書けるんじゃないかな :P

これすごいね。今までCUPSのドライバーはCで書かなきゃいけないと思ってたけど、内部APIにリンクするために。安い中国製のサーマルプリンターは、明らかにGPLに違反してるドライバーが付いてて、プリコンパイルされたバイナリなんだ。つまり、信頼できるマルウェアがあると仮定すると、半分の確率でうまくいかないってことだね。

理想的には、サーマルプリンターは買わない方がいいよ。紙にはたいていBPAが含まれてるから。BPAフリーって書いてあるのを見つけた?うん、BPSに切り替えたんだ。それも有毒で生殖健康に悪影響があるよ。どうしても必要なら、ヨーロッパの供給業者を使ってね。そっちではサーマルペーパーは両方とも禁止されてるから。

受け取りのレシートを舐めてるって疑うコメントを書こうと思ったけど、まず調べてみることにした。サーマルペーパーを扱うだけでBPAにさらされるみたいだね [0]。残念だな、サーマルプリンターは唯一、サタンが私たちを怒りの思考に誘惑するための陰謀だとは疑わない印刷機器なんだ。サーマルプリンターは信じられないほど信頼性が高いし、いくつかのビジネスのITを担当してたけど、サーマルラベルプリンターはキーボードよりもトラブルが少なかった。問題が少ない機器のクラスを考えるのが難しいくらいだ。やっぱり、何か悪巧みがあるんじゃないかって疑うべきだったかな。だって、プリンターだし、サポートしなきゃいけなかった他のプリンターは常に面倒な問題の源だったからね。[0] https://www.pca.state.mn.us/business-with-us/bpa-and-bps-in-...

ドイツにはこの会社が完全に安全なサーマルペーパーを提供してるよ: https://www.oekobon.de/ フランスにも似たような会社があるけど、名前を忘れちゃった。

CUPSのおかげで、古いコモドール64のプリンターが動いたんだ、ハハ。すごいことができるよ。

ここにいる著者です。これがまたここに出てくるとは面白いね!最近はもう使ってないんだ。まず、今は主にオリジナルのBocaプリンターを使ってて、公式ドライバーを使えるから。それに、99%の印刷をAndroidデバイスからやってて、プロトコル変換も自分たちでやってるけど、CUPSなしだとずっと簡単なんだ。それでも、あの頃は楽しかったな!