C#-利用ZPL語言完成條形碼的生成和列印
最近因為公司專案的需要,研究了一項對我來說算是新的技術—條形碼的生成和列印。因為之前沒有接觸過這方面的知識,所以剛開始還有點小迷茫和小興奮,不過一步一步來,問題總會解決的。現在來總結一下做條形碼這塊的收穫。
條形碼的生成沒有什麼難度,就是運用一些字串處理函式自動生成一串字母或數字的組合。這裡主要說明一下如何把生成的條碼值打印出來。首先我們要接觸一種新的語言ZPL(ZebraProgramming
Language)看名字zebra就知道和斑馬有關;的確,ZPL是斑馬公司自主設計的語言(斑馬公司的業務主要是製作斑馬條形碼印表機)。現在大部分條碼印表機都是可以識別ZPL
下面來舉個Demo說明一下具體的操作:
這是我編寫好的一個模板:(名稱為BarcodePath,儲存格式為.TXT或者.PRN格式,而且一定要注意是大寫!!)
---------------------------------------------------------------------------------------------------------
^XA
^PW1000
^MD30
^LH0,0
#CN_DATA1#;|宋體|20|15|^FO150,0
#CN_DATA2#
^FO70,0^BY2.0,3.0^BCN,120,Y,N,N,A^FD#ID1#^FS
^FO570,0^BY2.0,3.0^BCN,120,Y,N,N,A^FD#ID2#^FS
^PQ1,0,1,Y
^XZ
ZPL語言還是很好理解的,都是一些固定的指令,瞭解就行。
---------------------------------------------------------------------------------------------------------
^XA和^XZ:分別代表一個指令塊的開始和結束, 是固定的東西。
^PW:列印寬度,如果寬度較小,則會出現列印不全的效果。
^MD:設定標籤顏色的深度,取值範圍為 -30 to 30,上面的指令將顏色調到了最深。
^LH:設定條碼紙的邊距,本模板未進行設定。
---------------------------------------------------------------------------------------------------------
以下以字串abc^edf~L000001^L000002為例進行說明(abc、edf分別為漢字,L000001、L000002為條形碼值)
#CN_DATA1#:為abc的佔位符。
#CN_DATA2#:為edf的佔位符。
|宋體|20|15|:指字型為宋體,字元高度為20,寬度為15
^FO:設定條碼左上角的位置的座標(70,0)。
^BY:設定條形碼顯示樣式, 這是該模板最重要的一個部分, 2.0是條碼的縮放級別(可接受的數值:1-10點 ),這個數值下打出的條碼很小, 3.0是條碼中粗細柱的比例(可接受的數值:2.0到3.0,增量0.1,對固定比例的條碼無效 ), 120是條碼高度。
^BCN:是列印code128的指令。
^FD:設定要列印的內容
^FS:表示換行
#ID1#:指L000001
#ID2#:指L000002
---------------------------------------------------------------------------------------------------------
^PQ50,10,1,Y:列印總數50張標籤每個序列號只打一張。列印每組數量是10,但在每組間不暫停。
^PQ50,10,1,N:列印總數50張標籤每個序列號只打一張。列印每數量是10,每組列印後暫停。
這裡可以寫成^PQ1,0,1,Y,即每次列印一張,不暫停。因為列印總張數可以在程式中進行控制。
---------------------------------------------------------------------------------------------------------
建議:編寫模板需要自己嘗試,可以先編寫一個列印的demo,根據打印出來的效果,不斷的除錯改動模板,以達到預期的效果。
模板講到這裡應該就差不多了。下面說明如何進行列印。
首先需要引入一個封裝好的DLL檔案SMT.ZEBRA.dll,列印操作主要就是靠它來完成的,在他內部封裝了一個ZebraPrinter類,包含方法PrintLabEx
// 說明:
// 列印條形碼、RFID等型別標籤
//
// 引數:
// n_strTemplateFilePath:
// 標籤模版檔名稱,不含路徑,如:"TEMPLATE.TXT"
//
// n_strLabels:
// 標籤資料集合字串,多個標籤行用'|'分割,單個標籤行資料內部用'^'(欄位)分割或'~'(文字或條碼)分割, 如"研發部^51296829~8019^8020|11G~51296829^8001^8012"註明瞭如下列印要點:
// 1. 列印兩行標籤(俗稱兩枚) 2. 第一行標籤列印兩個文字("研發部"、"51296829"),2個條形碼(分別是"8019"、"8020")
// 3. 第二行標籤列印1個文字("11G"),3個條形碼("51296829"、"8001"、"8012")
// n_strPrinterName:
// 印表機名稱等,比如"ZDesigner 888-TT"
public bool PrintLabEx(string n_strTemplateFilePath, string n_strLabels, string n_strPrinterName);
客戶端程式碼:
private void button1_Click(object sender, EventArgs e)
{
try
{
//例項化一個列印類
ZebraPrinter printer = new ZebraPrinter();
//定義兩個標籤值
string str1 = "L000001";
string str2 = "L000002";
//按照格式,格式化成新的字串
str1 = string.Concat(" ", "^", " ", "~", str1, "^", str2); //雙排條形碼
//str = string.Concat(" ", "~", str); //單排條形碼
//printPath:模板名稱
//comboBox1.Text:印表機名稱
string printPath = "BarcodePath.TXT";
printer.PrintLabEx(printPath, str1, comboBox1.Text);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private void SmtZebraWinFormZPL_Load(object sender, EventArgs e)
{
//獲取本地計算機上安裝的所有印表機,儲存到集合strCollects中
PrinterSettings.StringCollection strCollects = PrinterSettings.InstalledPrinters;
string strPrinterName = string.Empty;
//遍歷集合,將所有印表機載入到下拉列表comboBox1中
foreach (String strName in strCollects)
{
strPrinterName = strName.ToString();
comboBox1.Items.Add(strPrinterName);
}
comboBox1.SelectedIndex = 0x00;
}
列印效果:
有問題的地方歡迎指出!
oノo════════════════════════════╲
│ヽ.程式設計學習ing.... 歡迎交流。 │
╲═════════════════════════════ヾ