public_notes/content/20240515161721 感熱紙プリンターをpythonで制御 windowsの場合.md

53 lines
No EOL
4.3 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 20240515161721 感熱紙プリンターをpythonで制御 windowsの場合
#tech #python #thermal_printer #windows
## Overview
Windowsに接続すると、 "POS58" と表示される謎の感熱紙プリンターをコマンドラインから使いたい。なかなかうまくいかない。
[Model: MPT-II](http://www.weinprinter.com/products_detail.aspx?ProductsID=126&ProductsCateId=74&CurrCateID=74&CateID=74) 使ったのはこれ。なんとかならないか?を色々やってとりあえずできるようになった。
たとえば、[これ](https://ja.aliexpress.com/item/1005004682527307.html?)は見た目が近いけど、上記と微妙に違う。ここに書いてある情報がどこまで汎用性があるのか不明なので注意。
## 困ったこと
コマンドライン経由での印刷が、期待どおりにならない。画像を印刷しようとしたのだが、上下が切れる、極端に小さいなどで、感熱ロール紙の全面に画像を印刷できなかった。印刷ダイアログを開いてプリンタを指定、その他オプションなどを設定すればうまくいくが、毎回ダイアログで設定する必要があり、pythonで自動化ができない。
## 解決方法
[python-escpos](https://github.com/python-escpos/python-escpos) というライブラリがある・・・のだが、これはwindowsでは20240516時点ではうまく動かない。その代わり、 [python-escpos-win](https://pypi.org/project/python-escpos-win/) があるので、こちらをインストール。おそらく共存はできないと思うので、python-escposをインストールしている場合は、`pip uninstall python-escpos` を実行して、使わないほうのライブラリを削除してからインストールする。
python-escpos-win経由で使用するためには、ドライバをlibusbのものに変更する必要がある。
そのためにzadigが必要。 [Zadig - USB driver installation made easy](https://zadig.akeo.ie/) からダウンロードして実行、ドライバをlibusbに変更する。
Options > List All Devices をメニューから選んで、プリンタを選択。ドライバをlibusbに変更して、"Reinstall WCID Driver"を押して、しばらく待つ。
オリジナルのドライバを入れないと、ここに表示されないのかは未検証。また、今回のプリンタの場合、ドライバがwindowsしか無かったが、USBのVID、PIDが分かればmac/linuxなどで使用できたかもしれないが、そこは検証していない。
ここまでの作業で、pythonから使えるようになるので、あとはコードを書けば使えた。
```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](https://www.imagemagick.org/) を使うなどして、画像ファイルを回転させる処理を、上記コードの印刷する前に追加すればうまくいった。
```python
import subprocess
# 画像を回転させる
subprocess.run(['magick', 'convert', "hoge.jpg", '-rotate', '90', "hoge_r.jpg"])
```
## Refs.
- これを参考にしたが、自分はうまくいかなかった(20240516)。 [サーマルプリンターをpython-escpos経由でTouchDesignerから動かすWindows10sanmal](https://note.com/ocha307/n/n80eb244588e2)
- ESCPOS というのはEPSONの感熱プリンターのコマンドらしい。もともとはUART経由制御で、USBは後からつけられた規格のようだ。 [はじめに - TM Printer - ESC/POS Command - Tech.Reference - POS - Epson](https://download4.epson.biz/sec_pubs/pos/reference_ja/escpos/index.html)