Python escpos

escpos是一個Python的庫,可以讓用戶通過python無驅調用熱敏打印機打印文字、圖片、二維碼以及條形碼等以下是該庫的主頁。

https://python-escpos.readthedocs.io/en/latest/index.html

看完主頁之後可以發現文檔寫的相當的爛,要什麼沒什麼。

這個庫對win的支持相當的不友好,會報“usb.core.NoBackendError: No backend available”之類的錯誤。原因是程序要通過lsusb命令訪問系統的usb信息。

當然也是有解決辦法的,可以參見libusb-win32

由於本人在做一個嵌入式的課程設計,很自然還是在linux下完成,這樣就避免了這個問題。

迅速照著文檔安裝完依賴包以及通過lsusb找到設備的VID和PID之後,參見一下官網的例程。

這個太強了,我從來都沒試過第一句就不能過的:”TypeError: Item in “from list” not a string”

本人才疏學淺不知道是為什麼,但是定睛一看,整個程序只用了printer類,於是只把printer類import進來好了。

這段程序更強的是第二句也運行不了。由於文檔太爛,於是只能去看源碼,源碼里的注釋還是比較清晰的。因此去找源碼安裝的位置。

位置在這:

於是編輯查看一下printer.py

最主要的問題在於out_ep的值作者是亂定的。所以得寫個程序獲得這個東西。下面這個程序來自樹莓派實驗室 http://shumeipai.nxez.com/2015/04/14/raspberry-pi-usb-printer-driver.html

查詢到out_ep之後基本上就能實現打印的功能了。

看了自己打印出來的東西,你可能會有點不舒服。然後你可能會思考以下問題:
1. 居中怎麼調?
2. 圖怎麼那麼小?
3. 二維碼怎麼那麼小?
4. 條形碼怎麼那麼短?
5. 怎麼打中文?

這些問題得一個個解決。

1. 居中怎麼調?看看escpos.py

這時候看到”align”了,一切都很明朗。說明只要調用以下函數即可。

2. 圖怎麼那麼小?看看image(…)

這裡提供一種解決方法。利用PIL (Python Imaging Library)庫。

然後import

代碼中的thumbnail((width, height))可以調節大小,這樣就能控制自己打印圖片的大小啦。

3. 二維碼怎麼那麼小?看qr(…)

可以看到,傳參的時候把size改一下就好了。這裡ps一下,想要微信掃二維碼直接進入自己的主頁,要網址前面加上 http:// 哦。

4. 條形碼怎麼那麼短?看barcode(…)。同樣的道理改width就行。height的默認是64,這個值感覺挺合適的。

5. 怎麼打中文?
(1)修改程序的编码方式
(2)修改系统默认编码方式

为什么要改两次?
字符串保存的编码格式由 #coding:XXX 决定,即文件的保存格式确定。py文件默认是ASCII编码,程序中出现中文当然要用utf-8或者gbk。
使用print输出时,python会做一个utf-8/gbk到系统默认编码的转换。对于英文系统来说,默认的是ASCII,隐式转换时,是从代码文件编码格式转换成ASCII,默认是utf-8->ASCII,这样当然打不出中文。因此需要将系统默认编码方式改为gbk

至于这里为什么要reload, 你猜?

據說上面這種方式是最壞的方式。於是我想用encode/decode的方法嘗試。同樣地,我看到了樹莓派實驗室 http://shumeipai.nxez.com/2015/04/14/raspberry-pi-usb-printer-driver.html 的代碼:

然後我encode/decode試了半天程序全部報錯。你真是在kidding我。於是我只好又去看源碼。

原來作者修改了程序,把編碼方式加到了自己的屬性 (self.codepage) 裡面,然後如果設置了self.codepage,就自己內部encode(self.codepage)。當然,輸入字符串 “has to be encoded in unicode.”

那解決方法又很明朗了。

全部綜合看看結果:

全部代碼如下:

最後ps,一定要記得打完中文之後打一個回車,要不然後面打圖片二維碼什麼的全部會變成亂碼。血和淚的教訓。

最最後,不好意思,那是兩隻大熊貓。

9 Comments

    1. 條形碼輸入的數字如果位數不符合的話也會不顯示的。
      二維碼和圖片是亂碼的情況是否是因為你打印文字之後沒有打印一個回車導致的?

  1. 条形码的情况是原本应该出现图形的地方现在只有一个@符号,二维码图片确认打了回车。
    有可能是我打印机M129C/TM-T70的问题吗,但是我看商家是可以打印图片的。

Leave a Comment