20240515161721 感熱紙プリンターをpythonで制御 windowsの場合

techpythonthermal_printerwindows

Overview

Windowsに接続すると、 “POS58” と表示される謎の感熱紙プリンターをコマンドラインから使いたい。なかなかうまくいかない。

Model: MPT-II 使ったのはこれ。なんとかならないか?を色々やってとりあえずできるようになった。

たとえば、これは見た目が近いけど、上記と微妙に違う。ここに書いてある情報がどこまで汎用性があるのか不明なので注意。

困ったこと

コマンドライン経由での印刷が、期待どおりにならない。画像を印刷しようとしたのだが、上下が切れる、極端に小さいなどで、感熱ロール紙の全面に画像を印刷できなかった。印刷ダイアログを開いてプリンタを指定、その他オプションなどを設定すればうまくいくが、毎回ダイアログで設定する必要があり、pythonで自動化ができない。

解決方法

python-escpos というライブラリがある・・・のだが、これはwindowsでは20240516時点ではうまく動かない。その代わり、 python-escpos-win があるので、こちらをインストール。おそらく共存はできないと思うので、python-escposをインストールしている場合は、pip uninstall python-escpos を実行して、使わないほうのライブラリを削除してからインストールする。

python-escpos-win経由で使用するためには、ドライバをlibusbのものに変更する必要がある。 そのためにzadigが必要。 Zadig - USB driver installation made easy からダウンロードして実行、ドライバをlibusbに変更する。

Options > List All Devices をメニューから選んで、プリンタを選択。ドライバをlibusbに変更して、“Reinstall WCID Driver”を押して、しばらく待つ。

オリジナルのドライバを入れないと、ここに表示されないのか?は未検証。また、今回のプリンタの場合、ドライバがwindowsしか無かったが、USBのVID、PIDが分かればmac/linuxなどで使用できたかもしれないが、そこは検証していない。

ここまでの作業で、pythonから使えるようになるので、あとはコードを書けば使えた。

from escpos.printer import Usb
import time
 
image = "hoge.jpg"
 
 
# プリンターに画像を印刷する
p = Usb(0x6868, 0x0200, 0) # 上記のプリンターの場合。製品によって異なるので USBView https://learn.microsoft.com/ja-jp/windows-hardware/drivers/debugger/usbview などで調べる必要がある。
time.sleep(1) # 1秒待つ(プリンターが接続するまでちょっと時間がかかる。これがないと次の行でエラーになった)
p.image(image)

その他の注意点

画像を印刷したい場合、画像を90度回転させたいことがあると思う。レシートのように印刷方向に垂直に読めればいいなら不要だけど、横長の画像だと、横向きに印刷したかったりする。そういう場合は imagemagick を使うなどして、画像ファイルを回転させる処理を、上記コードの印刷する前に追加すればうまくいった。

import subprocess
# 画像を回転させる
subprocess.run(['magick', 'convert', "hoge.jpg", '-rotate', '90', "hoge_r.jpg"])

Refs.