Zebra 條碼印表機應用開發實踐

scum發表於2006-08-07

這次做了個專案 其中有一個需求是控制條碼機
要求一是能列印條碼 二是能列印中文的經銷商名稱 還有列印一個點陣圖徽標
測試環境是 Windows 2000/XP/2003 條碼機是 Zebra 的 Z4M Plus
因為以前沒有做過條碼機 所以一開始想得比較簡單 覺得通過列印驅動應該就搞定了
開始編碼測試時發現 控制 Zebra 的列印驅動的確是可以按常規的印表機處理 但有兩個缺陷
一是對列印內容的位置和效果控制不精確 二是列印速度不行
而且客戶方有若干種不同型號的機器 要一一安裝對應的驅動 這也的確是個麻煩事
所以就試著通過串列埠直接控制條碼機

Zebra 系列內建了其自定義的 ZPL 通訊命令集
這其實也幾乎是目前主流品牌機型都支援的標準規範
ZPL 的具體命令內容很多 提供了對條碼機方方面面鉅細不遺的控制
網上很多文章提到了指令的用法 不再贅述
更多詳細的指令說明可以查閱 Zebra 的命令手冊

一、條碼的列印
條碼機列印條碼非常簡單
傳送的指令通常包括了對標籤尺寸、條碼位置、條碼尺寸、條碼型別的設定和具體的條碼內容。

例:
 ^XA^LH0,0^FO130,44^FO20,25^BY4^FO100,100^BCN,104,Y,N,N^FD>;0123456789^FS^PQ1^XZ

注:
 該指令序列將列印 CODE 128 規範的 0-9 的一維數字條碼

二、中文的列印
網上有文章提到 可以用一個名為 fnthex32.dll 的庫 裡面匯出了一個 GetFontHex 函式
功能是將傳入的中文字串轉換為十六進位制編碼並返回 這個庫在網上不太好找 在我做完專案之後數天 有幸找到了一個
想來用起來應該是比較方便 不過專案做完 沒有條碼機測試了 需要的朋友可以試一下

三、圖形的列印
上面提到的 GetFontHex 函式 不知道是不是也是把漢字轉換成圖形編碼的 個人猜想應該是
所以其實條碼機列印非標準字元和列印圖形應該是同樣的方法
對圖形的處理 重點在於要將圖形進行編碼 再加上指令傳送就行了
編碼的方法比較簡單 非常類似於 DOS 下中文平臺中點陣漢字型檔的編碼
即一個點用一個位(bit)表示 每個位元組描述 8 個點 先行後列 從上到下
也就是說 條碼機能列印的只能是二值影象
編碼的時候需要注意的是 如果每行結束時位元組未填滿 應向上擴充至整位元組(用 0 填位)

瞭解了編碼方式 就比較容易處理了
網上有方案提出 直接從點陣漢字型檔裡取點陣資料 這個方法個人覺得不太靈活
一是點陣字型檔較大 釋出麻煩 二是文字大小受限
我的實現方法是 直接使用 API 向記憶體 Bitmap 畫出漢字 這樣漢字的字型和大小可以很方便地控制
然後掃描出點陣資訊 經過編碼 生成最終資料
比如確定好畫成白底黑色 編碼時白字當作 0 黑點當作 1
最終生成的資料 需要按圖形方式下載到條碼機快取內
輸出的時候指定使用該圖形即可
另外需要注意的是 下載圖形指令 ^DG 需要帶上幾個引數 分別指出圖形快取名稱和圖形的總位元組數及每行位元組數
這兩個數字需要計算好 再拼接到命令串中

總位元組數計算方法:
 ( 圖形寬度 * dpm / 8 ) * ( 圖形高度 / 8 )
 dpm 是解析度 即每毫米點數(Dots Per mm)

每行位元組數計算方法:
 ( 圖形寬度 / 8 )

比如圖形為 664 x 40  dpm 為 8(通常取這個值)
 則總位元組數 = ( 664 * 8 / 8 ) * ( 40 / 8 ) = 3320 位元組
 每行位元組數 = ( 664 / 8 ) = 83 位元組

例:
 ^XA^LH0,0^IDR:*.*^XZ~DGIMG0,3320,83,...(編碼後的資料)...^PQ1^XZ
注:
 該指令將編碼後的圖形資料下載至條碼機 並指定儲存到別名為 IMG0 的快取區域中
 之後 用 ^XG 指令即可引用該圖形


//*******************
// 需要注意的問題:
//*******************
一、解析度
如果解析度不是標準的 8dpm 經測試 Zebra Z4M Plus 對資料的處理有時候會有 Error 狀態發生
在 S 系列上則完全正常
但願是我的方法或程式碼有問題

二、處理速度
串列埠傳送資料速度較慢 經測試 3320 位元組大小的資料從傳送到列印完成平均需要 0.5 秒左右
好在這次專案標籤尺寸並不大 速度尚在可接受範圍內
若對速度有更高要求 可以考慮使用並口
USB 口也許更快 但未經測試 不知道方法是否通用

這裡只記錄了我涉及到的應用 記性太差 以後再有類似開發時有案可查 不至於從頭再弄
也但願能給剛開始接觸且需要處理條碼機應用的朋友一些拙劣的啟發

歡迎同好研究探討: scumyang@163.com

scum
2006-08-07
 

相關文章