Добрый день, Хабрахабр.
Благодаря тепло принятой прошлой публикации, я могу опубликовать здесь эту статью. Спасибо всем, кто ставил плюсы.
По долгу службы мне частенько приходится формировать отчеты для этикеточных принтеров семейства Zebra.
![](https://habrastorage.org/files/ba9/75d/946/ba975d946cee40a794b84da452bc6d4d.gif)
Зебры они такие
Механизм формирования этикеток выглядит следующим образом: сначала с машины пользователя (компьютер, терминал сбора данных) на принтер отправляется специальным образом оформленная строка, затем внутренний процессор принтера обрабатывает эту строку, и выводит ее на печать.Но язык, на котором формируется строка для принтера (называется ZPL) на первый взгляд вызывает у непосвящённых нервную икоту и мандраж.
Прошу под кат, всех кто хочет разобраться в данном вопросе.
Пример:
^XA
^FO 0,10
^GB632,0,2^FS
^FO0,25
^FB632,1,0,C,0
^ASN,70,70
^FDWAR INC.^FS
^FO0,100
^GB632,0,2^FS
^FO0,120
^FB632,1,0,C,0
^ASN,60,60
^FDGoose^FS
^FO0,180
^FB632,1,0,C,0
^ASN,60,60
^FDWild^FS
^FO0,240
^GB632,0,2^FS
^FO120,260
^BY2
^BCN,70,N,N,N
^FDSECRECTCODE^FS -
^XZ
А на печать выводится такой аккуратный бейджик:
![](https://habrastorage.org/files/afb/af0/232/afbaf0232bbe477b875fe9585fae006e.jpg)
Давайте разберемся, что же написано в этом коде, и рассмотрим основные элементы.
Первую часть своего выступления я посвящу разбору синтаксиса этого языка, в объеме достаточном для создания этикеток удовлетворительного качества. Во-второй части, приведу примеры кода на Java и VisualBasic, для того, чтобы отправить этикетку на печать самостоятельно. На основе этих примеров, вы сможете самостоятельно построить свою програму, для печати.
Часть 1. Синтаксис ZPL
Во первых, все измерения в ZPL указываются в точках (points). Поэтому, для более ясного представления вы должны посмотреть в документации на принтер, какая у вас плотность точек на единицу измерения длины.
Сначала кратко пробежимся по основным командам, затем рассмотрим их более подробно в связке.
1. Начало и конец ZPL-кода:
^XA – начало кода, ^XZ – конец кода;
2.Отступы для последующего содержимого:
^FO x,y где: x – отступ от левого края, y – отступ сверху;
3.Разделитель полей:
^FS — обозначает конец определения поля. Буквально можно считать его сигналом конца строки;
4.Масштабируемый текст. Состоит из двух частей, выбор шрифта и ввод текста:
4.1. Выбор шрифта:
^A<название шрифта><ориентация текста>,<высота шрифта в точках>,<ширина в точках>:
<название шрифта> – по-умолчанию стоит A. Точнее ее даже не надо вводить, другие шрифты можно взять из официальной документации:
![](https://habrastorage.org/files/8a8/a91/04e/8a8a9104e7924407a99f82558d187457.jpg)
<ориентация текста>:
N – нормальная ориентация; R – повернуто на 90 градусов по часовой стрелке;
I – перевернуто на 180 градусов; B – повернуто на 270 градусов;
4.2. Вывод текста с параметрами указанными в предыдущем пункте:
^FD<текст>
Примеры:
^XA
^FO20,20 - отступ по 20 точек от верхнего и левого края этикетки
^ASN,70,70 - нормальная ориентация, шрифт S, высота и ширина 70 точек
^FDWAR INC.^FS – содержание текста WAR INC.
^XZ
![](https://habrastorage.org/files/350/32a/964/35032a9643fa4666bbd1ddacfc28ced4.jpg)
Повернем, и изменим шрифт:
^XA
^FO20,20 - отступ по 20 точек от верхнего и левого края этикетки
^ABB,30,30 - повернуто на 270 градусов, шрифт B, высота и ширина 30 точек
^FDWAR INC.^FS – содержание текста WAR INC.
^XZ
![](https://habrastorage.org/files/281/8a2/bed/2818a2bedbdb46d89091af174199fc44.jpg)
Изменим шрифт на S:
^XA
^FO20,20 - отступ по 20 точек от верхнего и левого края этикетки
^ASB,30,30 - повернуто на 270 градусов, шрифт S, высота и ширина 30 точек
^FDWAR INC.^FS – содержание текста WAR INC.
^XZ
![](https://habrastorage.org/files/359/c62/d72/359c62d7292743faa69799334fcd9111.jpg)
Обязательно запомните, что разные шрифты могут выглядеть по разному, в отношении размеров, как можно видеть выше. Я чаще всего использую шрифт S.
5.Блок текста:
^FB<ширина>,<количество строк>,<пробелы между строками>,<выравнивание текста>,< отступ для второй или последующей строки>
<положение текста> — может принимать значения: L(по левому краю), R (по правому краю), C (по центру), J (растянуть текст по ширине поля);
Обычно я использовал данную команду для центрирования текста, или если необходимо разместить текст в несколько строчек. Если текст не умещается в строку, он начинает накладываться сам на себя. И получается так:
^XA
^FO 20,20
^FB400,1,0,C,0
^AVN,70,70
^FDWAR INC WILD GOOSE^FS
^XZ
![](https://habrastorage.org/files/396/99a/620/39699a62045649f39b2cf1d2bff55719.jpg)
Изменим код, чтобы было две строки, и расстояние между строчками сделаем в 10 точек:
^XA
^FO 20,20
^FB400,2,10,C,0
^AVN,70,70
^FDWAR INC WILD GOOSE^FS
^XZ
![](https://habrastorage.org/files/7de/815/487/7de815487b8d4376b54e3595c6bb30bf.jpg)
А теперь сделаем отступ для второй строки в 30 точек влево:
^XA
^FO 20,20
^FB400,2,10,L,30
^AVN,70,70
^FDWAR INC WILD GOOSE^FS
^XZ
![](https://habrastorage.org/files/1f5/29e/d26/1f529ed26152414c9ab394f24311c67a.jpg)
6. Рисование прямоугольников:
^GB<ширина>,<высота>,<толщина линии>, (<цвет линии>, <скругление углов>)
В скобках указаны не обязательные параметры.
Цвет линии: B (черный) или W (белый)
Скругление углов указывается цифрой от 0, до 8 (сильное скругление)
Примеры:
С сильным скруглением:
^XA
^FO20,20
^GB300,100,2,B,8^FS
^XZ
![](https://habrastorage.org/files/9af/7b7/265/9af7b726587e456f859a76e77c8f1c55.jpg)
Без скругления:
^XA
^FO20,20
^GB300,100,2^FS
^XZ
![](https://habrastorage.org/files/41f/b4c/cc6/41fb4ccc602e493aa1e0f674575fd50a.jpg)
Если хотим нарисовать просто линию, то рисуем прямоугольник с высотой равной 0:
^XA
^FO20,20
^GB300,0,2^FS
^XZ
![](https://habrastorage.org/files/500/ddf/84f/500ddf84ff7041eabad7246fce01c1b8.jpg)
7.Штрихкод состоит из трех команд – первая задает его размеры, вторая настройки и третья — содержание:
7.1.Размеры штрихкода:
^BY<ширина>, (<cоотношение толщин линий>, <высота штрихкода>)
7.2. Настройки штрихкода:
^BC<ориентация>,<высота штрихкода в точках>, <печатать ли расшифровку кода>, <расшифровка кода над штрихкодом>, <режим>
<ориентация> — N – нормальная ориентация; R – повернуто на 90 градусов по часовой стрелке; I – перевернуто на 180 градусов; B – повернуто на 270 градусов;
<печатать ли расшифровку кода>, <расшифровка кода над штрихкодом> — принимают значения Y (да) или N (нет);
<режим> — с этим полем я не разобрался, по умолчанию N;
^BC – штрихкод в стандарте 128 (подробнее Code_128); Есть также еще несколько форматов, но ввиду того, что мне не приходилось ими пользоваться, в данной статье они рассматриваться не будут, и рекомендую посмотреть информацию по ним в официальной документации поставляемой к принтерам Zebra;
7.3. Вывод штрихкода на печать:
^FD<кодируемая информация>
К сожалению, штрихкод нельзя поместить в «коробку», как текст, чтобы отцентрировать по ширине этикетки, и поэтому приходится шаманить с полями и отступами.
Примеры:
^XA
^FO 20,20
^BY3
^BCN,100,Y,N,N
^FD123456789^FS
^XZ
![](https://habrastorage.org/files/5a7/5cb/6d9/5a75cb6d952043e9bf6d14f7a5c43f95.jpg)
Перевернем, и укажем печатать расшифровку сверху (сейчас получилось снизу):
^XA
^FO 20,20
^BY3
^BCI,100,Y,Y,N
^FD123456789^FS
^XZ
![](https://habrastorage.org/files/be9/665/b29/be9665b29b3d43068dca07f971c08cc8.jpg)
На этом остановимся на рассмотрении основных элементов ZPL, и перейдем к части второй, в которой вкратце рассмотрим механизм отправки информации на принтер.
Часть 2. Печать
Механизм передачи проще некуда. Для этого, мы должны знать IP, где находится принтер, и порт. Далее, формируем поток, который отправляем по указанному адресу, и получаем на выходе этикетку.
Пример на Visual Basic:
Dim i As Double
Dim SSCC As String
Dim ipAddress As String = "127.0.0.1"
Dim port As Integer = 1234
Dim ZPLString As String
Try
'Открываем соединение
Dim client As New System.Net.Sockets.TcpClient
client.Connect(ipAddress, port)
Dim writer As New System.IO.StreamWriter(client.GetStream())
'Формируем ZPL-строку
ZPLString=
"^XA" &
"^BY2" &
"^FO0,200" &
"^FB632,2,0,C,0" &
"^ASN,60,60" &
"^FDHELLO HABRAHABR!!!^FS" &
"^XZ"
writer.Write(ZPLString)
writer.Flush()
'закрываем соединение
writer.Close()
client.Close()
Catch ex As Exception
End Try
Пример на Java:
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
public class PrintToZebra {
public static void main(String[] args) throws IOException {
System.out.println("Готовлю к печати");
try(Socket s = new Socket("127.0.0.1", 1234)){
OutputStream out = s.getOutputStream();
PrintWriter writer = new PrintWriter(out, true);
String ZPLString=
"^XA" +
"^BY2" +
"^FO0,200" +
"^FB632,2,0,C,0" +
"^ASN,60,60" +
"^FDHELLO HABRAHABR!!!^FS" +
"^XZ";
writer.println(ZPLString);
writer.flush();
System.out.println("Отправил на печать");
}
}
}
Как видите, ничего сложного. Надеюсь, что моя статья, облегчит путь отважным укротителям Зебр.
Засим позвольте откланяться. Жду советов, критики и поддержки.