使用Python+ZPL實(shí)現(xiàn)標(biāo)簽打印與中文排版
分享一下在本項(xiàng)目中,我們是如何利用 Python 優(yōu)雅地解決 ZPL 打印。
1. 什么是 ZPL?
ZPL 是斑馬公司為標(biāo)簽打印機(jī)開發(fā)的一套腳本語言。你可以把它想象成打印機(jī)界的“HTML”。通過發(fā)送一串類似 ^XA^FO50,50^A0N,50,50^FDHello World^FS^XZ 的指令,打印機(jī)就能在指定位置打印出文字。
2. 我們的秘密武器:降維打擊
為了繞過 ZPL 繁瑣的字體配置,我們采用了一種“降維打擊”的策略:將所有內(nèi)容(文字、條碼、二維碼)先在 Python 中渲染成一張圖片,然后將圖片轉(zhuǎn)換成 ZPL 指令發(fā)給打印機(jī)。
這種方案的專業(yè)術(shù)語叫 “文本轉(zhuǎn)位圖”。
核心優(yōu)勢(shì):
- 所見即所得:你在屏幕上看到的字體、間距,打印出來完全一致。
- 支持任意字體:只要你電腦里有的字體(微軟雅黑、阿里巴巴普惠體等),統(tǒng)統(tǒng)都能打印。
- 無需配置打印機(jī):不需要去折騰打印機(jī)的內(nèi)存和字體文件,插上就能打。
3. 技術(shù)實(shí)現(xiàn)拆解
第一步:使用 Pillow 繪制“標(biāo)簽照”
我們利用 Python 的 Pillow 庫,根據(jù)業(yè)務(wù)數(shù)據(jù)創(chuàng)建一個(gè)空白畫布,然后在上面畫圖。
from PIL import Image, ImageDraw, ImageFont
# 創(chuàng)建一個(gè) 203 DPI 的小畫布 (約 40mm x 30mm)
width, height = 320, 240
img = Image.new('1', (width, height), 1) # '1' 表示二值圖(黑白)
draw = ImageDraw.Draw(img)
# 加載心儀的字體
font = ImageFont.truetype("msyh.ttc", 24) # 微軟雅黑
draw.text((20, 20), "智能標(biāo)簽助手", font=font, fill=0)
第二步:將圖片轉(zhuǎn)換為 ZPL 十六進(jìn)制數(shù)據(jù)
ZPL 提供了一個(gè) ^GFA 指令,允許我們發(fā)送原始的圖像字節(jié)數(shù)據(jù)。我們將 Pillow 處理好的黑白像素點(diǎn),轉(zhuǎn)換成打印機(jī)能聽懂的十六進(jìn)制字符串。
在本項(xiàng)目中,src/zpl_utils.py 負(fù)責(zé)這項(xiàng)繁瑣的轉(zhuǎn)換工作,確保每一行像素都能精準(zhǔn)對(duì)應(yīng)。
第三步:發(fā)送 RAW 數(shù)據(jù)到打印機(jī)
Windows 的普通打印驅(qū)動(dòng)通常會(huì)經(jīng)過圖形層處理,速度較慢。為了追求極致響應(yīng),我們通過 pywin32 庫直接向打印機(jī)發(fā)送 RAW(原始) 數(shù)據(jù)。
import win32print
def send_to_printer(printer_name, zpl_data):
hPrinter = win32print.OpenPrinter(printer_name)
try:
# 開啟打印作業(yè),指定類型為 "RAW"
hJob = win32print.StartDocPrinter(hPrinter, 1, ("Label Job", None, "RAW"))
win32print.StartPagePrinter(hPrinter)
win32print.WritePrinter(hPrinter, zpl_data.encode('utf-8'))
win32print.EndPagePrinter(hPrinter)
win32print.EndDocPrinter(hPrinter)
finally:
win32print.ClosePrinter(hPrinter)
4. 必備 ZPL 指令速查
在本項(xiàng)目中,我們雖然主要依賴圖像傳輸,但仍需一些基礎(chǔ)指令來定義標(biāo)簽。以下是核心指令說明:
| 指令 | 說明 | 作用 |
|---|---|---|
| ^XA | 標(biāo)簽開始 | 告訴打印機(jī):這是一張新標(biāo)簽的起點(diǎn)。 |
| ^XZ | 標(biāo)簽結(jié)束 | 告訴打印機(jī):指令發(fā)送完畢,可以開始打印/出紙了。 |
| ^PW | 打印寬度 | 設(shè)置標(biāo)簽的寬度(以點(diǎn) dots 為單位),防止內(nèi)容被截?cái)唷?/td> |
| ^LL | 標(biāo)簽長(zhǎng)度 | 設(shè)置標(biāo)簽的高度,決定了打印機(jī)走紙的距離。 |
| ^LH | 標(biāo)簽原點(diǎn) | 設(shè)置打印的起始坐標(biāo) (0,0) 的物理位置。 |
| ^MD | 打印濃度 | 設(shè)置打印深度(0-30),覺得顏色不夠黑?調(diào)它。 |
| ^FO | 字段坐標(biāo) | Field Origin,定義元素在標(biāo)簽上的 X,Y 軸位置。 |
| ^FS | 字段分隔符 | Field Separator,每個(gè)元素指令后的“句號(hào)”,必不可少。 |
| ^GFA | 圖形 ASCII | 本方案的核心。它負(fù)責(zé)將我們轉(zhuǎn)換好的十六進(jìn)制圖像數(shù)據(jù)“畫”到標(biāo)簽上。 |
5. 總結(jié)
通過 Python + Pillow + ZPL (^GFA) 的組合,我們成功地將復(fù)雜的硬件編程轉(zhuǎn)變成了熟悉的圖形處理編程。
開發(fā)建議:
- DPI 匹配:打印機(jī)通常有 203 DPI 或 300 DPI 兩種,繪圖時(shí)要根據(jù)打印機(jī)型號(hào)計(jì)算好像素尺寸,否則打出來的標(biāo)簽會(huì)偏大或偏小。
- 二值化處理:在發(fā)送給打印機(jī)前,務(wù)必對(duì)圖片進(jìn)行閾值處理,確保只有純黑和純白,避免打印出“麻點(diǎn)”。
- 性能優(yōu)化:對(duì)于固定格式的標(biāo)簽,可以緩存已經(jīng)生成的 ZPL 模板,只替換變化的變量數(shù)據(jù)。
以上就是使用Python+ZPL實(shí)現(xiàn)標(biāo)簽打印與中文排版的詳細(xì)內(nèi)容,更多關(guān)于Python ZPL標(biāo)簽打印與中文排版的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python實(shí)現(xiàn)終端清屏的幾種方式詳解
在使用Python進(jìn)行終端交互式編程時(shí),我們經(jīng)常需要清空當(dāng)前終端屏幕的內(nèi)容,本文為大家整理了幾種常見的實(shí)現(xiàn)方法,有需要的小伙伴可以參考下2025-07-07
帶你徹底搞懂python操作mysql數(shù)據(jù)庫(cursor游標(biāo)講解)
這篇文章主要介紹了帶你徹底搞懂python操作mysql數(shù)據(jù)庫(cursor游標(biāo)講解),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01
python學(xué)習(xí)手冊(cè)中的python多態(tài)示例代碼
多態(tài)是面向?qū)ο笳Z言的一個(gè)基本特性,多態(tài)意味著變量并不知道引用的對(duì)象是什么,根據(jù)引用對(duì)象的不同表現(xiàn)不同的行為方式,下面使用一個(gè)示例學(xué)習(xí)他的使用方法2014-01-01
淺談SciPy中的optimize.minimize實(shí)現(xiàn)受限優(yōu)化問題
今天小編就為大家分享一篇淺談SciPy中的optimize.minimize實(shí)現(xiàn)受限優(yōu)化問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-02-02
Python3基礎(chǔ)之條件與循環(huán)控制實(shí)例解析
這篇文章主要介紹了Python3基礎(chǔ)的條件與循環(huán)控制,需要的朋友可以參考下2014-08-08
Python實(shí)現(xiàn)批量填補(bǔ)遙感影像的無效值NoData
這篇文章主要為大家介紹了如何基于Python中ArcPy模塊,對(duì)大量柵格遙感影像文件批量進(jìn)行無效值(NoData值)填充的方法,感興趣的小伙伴可以了解一下2023-06-06
給Python的Django框架下搭建的BLOG添加RSS功能的教程
這篇文章主要介紹了給Python的Django框架下搭建的BLOG添加RSS功能的教程,示例代碼非常簡(jiǎn)單,需要的朋友可以參考下2015-04-04

