Добрый день, Хабрахабр.
Благодаря тепло принятой прошлой публикации, я могу опубликовать здесь эту статью. Спасибо всем, кто ставил плюсы.
По долгу службы мне частенько приходится формировать отчеты для этикеточных принтеров семейства Zebra. Механизм формирования этикеток выглядит следующим образом: сначала с машины пользователя (компьютер, терминал сбора данных) на принтер отправляется специальным образом оформленная строка, затем внутренний процессор принтера обрабатывает эту строку, и выводит ее на печать.Но язык, на котором формируется строка для принтера (называется 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
А на печать выводится такой аккуратный бейджик:
Давайте разберемся, что же написано в этом коде, и рассмотрим основные элементы.
Первую часть своего выступления я посвящу разбору синтаксиса этого языка, в объеме достаточном для создания этикеток удовлетворительного качества. Во-второй части, приведу примеры кода на Java и VisualBasic, для того, чтобы отправить этикетку на печать самостоятельно. На основе этих примеров, вы сможете самостоятельно построить свою програму, для печати.
Часть 1. Синтаксис ZPL
Во первых, все измерения в ZPL указываются в точках (points). Поэтому, для более ясного представления вы должны посмотреть в документации на принтер, какая у вас плотность точек на экран.
Сначала кратко пробежимся по основным командам, затем рассмотрим их более подробно в связке.
1. Начало и конец ZPL-кода:
^XA – начало кода, ^XZ – конец кода;
2.Отступы для последующего содержимого:
^FO x,y где: x – отступ от левого края, y – отступ сверху;
3.Разделитель полей:
^FS — обозначает конец определения поля. Буквально можно считать его сигналом конца строки;
4.Масштабируемый текст. Состоит из двух частей, выбор шрифта и ввод текста:
4.1. Выбор шрифта:
^A<название шрифта><ориентация текста>,<высота шрифта в точках>,<ширина в точках>:
<название шрифта> – по-умолчанию стоит A. Точнее ее даже не надо вводить, другие шрифты можно взять из официальной документации:
<ориентация текста>:
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
Повернем, и изменим шрифт:
^XA ^FO20,20 - отступ по 20 точек от верхнего и левого края этикетки ^ABB,30,30 - повернуто на 270 градусов, шрифт B, высота и ширина 30 точек ^FDWAR INC.^FS – содержание текста WAR INC. ^XZ
Изменим шрифт на S:
^XA ^FO20,20 - отступ по 20 точек от верхнего и левого края этикетки ^ASB,30,30 - повернуто на 270 градусов, шрифт S, высота и ширина 30 точек ^FDWAR INC.^FS – содержание текста WAR INC. ^XZ
Обязательно запомните, что разные шрифты могут выглядеть по разному, в отношении размеров, как можно видеть выше. Я чаще всего использую шрифт 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
Изменим код, чтобы было две строки, и расстояние между строчками сделаем в 10 точек:
^XA ^FO 20,20 ^FB400,2,10,C,0 ^AVN,70,70 ^FDWAR INC WILD GOOSE^FS ^XZ
А теперь сделаем отступ для второй строки в 30 точек влево:
^XA ^FO 20,20 ^FB400,2,10,L,30 ^AVN,70,70 ^FDWAR INC WILD GOOSE^FS ^XZ
6. Рисование прямоугольников:
^GB<ширина>,<высота>,<толщина линии>, (<цвет линии>, <скругление углов>)
В скобках указаны не обязательные параметры.
Цвет линии: B (черный) или W (белый)
Скругление углов указывается цифрой от 0, до 8 (сильное скругление)
Примеры:
С сильным скруглением:
^XA ^FO20,20 ^GB300,100,2,B,8^FS ^XZ
Без скругления:
^XA ^FO20,20 ^GB300,100,2^FS ^XZ
Если хотим нарисовать просто линию, то рисуем прямоугольник с высотой равной 0:
^XA ^FO20,20 ^GB300,0,2^FS ^XZ
7.Штрихкод состоит из трех команд – первая задает его размеры, вторая настройки и третья — содержание:
7.1.Размеры штрихкода:
^BY<ширина>, (<cоотношение толщин линий>, <высота штрихкода>)
7.2. Настройки штрихкода:
^BC<ориентация>,<высота штрихкода в точках>, <печатать ли расшифровку кода>, <расшифровка кода над штрихкодом>, <режим>
<ориентация> — N – нормальная ориентация; R – повернуто на 90 градусов по часовой стрелке; I – перевернуто на 180 градусов; B – повернуто на 270 градусов;
<печатать ли расшифровку кода>, <расшифровка кода над штрихкодом> — принимают значения Y (да) или N (нет);
<режим> — с этим полем я не разобрался, по умолчанию N;
^BC – штрихкод в стандарте 128 (подробнее ru.wikipedia.org/wiki/Code_128); Есть также еще несколько форматов, но ввиду того, что мне не приходилось ими пользоваться, в данной статье они рассматриваться не будут, и рекомендую посмотреть информацию по ним в официальной документации поставляемой к принтерам Zebra;
7.3. Вывод штрихкода на печать:
^FD<кодируемая информация>
К сожалению, штрихкод нельзя поместить в «коробку», как текст, чтобы отцентрировать по ширине этикетки, и поэтому приходится шаманить с полями и отступами.
Примеры:
^XA ^FO 20,20 ^BY3 ^BCN,100,Y,N,N ^FD123456789^FS ^XZ
Перевернем, и укажем печатать расшифровку сверху (сейчас получилось снизу):
^XA ^FO 20,20 ^BY3 ^BCI,100,Y,Y,N ^FD123456789^FS ^XZ
На этом остановимся на рассмотрении основных элементов 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("Отправил на печать"); } } }
Как видите, ничего сложного. Надеюсь, что моя статья, облегчит путь отважным укротителям Зебр.
Засим позвольте откланяться. Жду советов, критики и поддержки.
ссылка на оригинал статьи http://habrahabr.ru/post/266677/
Добавить комментарий