Как создать ZPL в Delphi / C++Builder / Lazarus

Как создать ZPL в Delphi / C++Builder / Lazarus

Что такое ZPL?

ZPL

Вообще ZPL расшифровывается как язык программирования зебр (Zebra Programming Language). Есть возможность командами создать нужный дизайн печати будь то какая-либо этикетка или же страница.

Благодаря этому этикетка становится независимой от конкретного устройства печати. Принтер получает команды для произведения фигур, рамок, символов и прочего, и он сам знает, как это сделать. Это является основным отличием ZPL!

Zebra Technologies первоначально создала ZPL для осуществления создания и печати этикеток (с штрих кодами, графическими элементами и любым текстом), которые используют в основном для торговой деятельности.

Немного об этапах формирования ZPL:

Сперва через оборудование (ПК или же терминалы, собирающие информацию) на принтер направляются данные, далее процессор Зебра-принтера производит обработку полученной информации и выводит результат на печать.

ZPL

Немного о составлении ZPL кода:

Мерки для печати производятся в точках, ибо без точного значения будет довольно-таки трудно что-то сделать, не получив ошибок и сбоев. Следует изучить документацию печатного оборудования и узнать какая у него плотность точек (DPI).

Создается сам дизайн следующими командами:

1. Код должен начинаться с тега ^XA, а заканчиваться же ^XZ;

2. А вот тег ^FX предваряет комментарии;

3. ^CF x, y, z – настройки шрифта по умолчанию: сам шрифт, высота и ширина;

4. ^FO x,y - отступы слева и сверху;

5. ^FS – конец строки;

6. Вывести данные с настроенными величинами можно так:

FD<текст>
Блок текста:

FB<ширина>,<количество строк>,<пробелы между строками>,<выравнивание текста>,< отступ для второй или последующей строки>
<положение текста> :
L - по левому краю,
R - по правому краю,
C - по центру,
J - растянуть текст по ширине поля;

Создание прямоугольников:

GB<ширина>,<высота>,<толщина линии>,<цвет линии>,<скругление углов>
Цвет линии: B (черный) или W (белый)
Скругление углов указывается значением от 0, до 8.

7. Штрихкод (а ZPL и Zebra-принтер - созданы прямо для штрих-кодов!) состоящий из трех команд:
размеры штрих кода (BY<ширина>,<соотношение толщин линий>, <высота штрих кода>);
его настройки:

BC<ориентация>,
<высота штрих кода в точках>,
<печатать ли расшифровку кода>,
<расшифровка кода штрих кодом>,
<режим> <ориентация> — N – нормальная ориентация;
R – на 90 градусов по часовой стрелке;
I – на 180 градусов;
B – на 270 градусов;
<печатать ли расшифровку кода>,
<расшифровка кода над штрих кодом> — значения Y (да) или N (нет); <режим> — по умолчанию N.

8. Вывод штрих-кода на печать осуществляется через команду - FD<информация>

На самом деле всё не настолько просто, но в общих чертах дает представление о языке ZPL.

Создание ZPL в Delphi / C++Builder / Lazarus

Сразу вопрос - а можно ли отправить просто обычную картинку или “созданный по размеру этикетки” документ из текстового редактора? Да просто “на Canvas нарисовать и послать на принтер — драйвер сам разберётся”? Отправить можно, напечатается, выглядеть даже зачастую будет как настоящий. Единственная проблема - ZPL и Zebra-printers предназначены, прежде всего для создания машиночитаемых, векторных масштабируемых этикеток, и часто результат из-за прохождения этапов растрирования и масштабирования изображений в программе и в драйвере не будет понят сканером штрих-кодов. Если ваши штрих-коды не распознаются сканером, то, чаще всего, у вас проблема из-за растрированного и масштабированного изображения. Давайте же сделаем ZPL из нашего Delphi-приложения или Lazarus-приложения правильно!

Воспользуемся платформой FastReport VCL, поскольку он сохраняет из Delphi сразу в нужный формат (Zebra Programming Language). Но мы можем использовать больше возможностей — добавить в этикетки картинки, таблицы, штрих коды (и это будут правильные, машиночитаемые штрихкоды!). Понятно, что фотографии пейзажей отправлять на “зебра-принтер” смысла нет, но вот картинку вроде той, что в начале статьи — почему бы нет, если она уместна на наших этикетках!)

Есть два варианта сохранения созданного отчета. Первым, является сохранение через окно предварительного просмотра, а второй — сразу через код на Pascal.

Рассмотрим оба варианта.
За работу! На форму кладем не только нужные нам компоненты для создания отчёта, подключения источников данных, но и компонент для ZPL-экспорта!

Сохраняем ZPL из Delphi/RAD Studio Lazarus с предварительным просмотром

Преимущество метода - мы видим, что сохраняем, имеем возможность сравнить в превью с результатом в ZPL. И отлаживаем это у себя на компьютере, а не у несчастной жертвы клиента на его оборудовании, когда проект уже вроде бы готов.

ZPL

Создаем требуемый документ.

Перед сохранением смотрим в предпросмотре, корректируем все то, что не понравилось.

Нажимаем пункт “сохранить”.

Выбираем “ZPL file”. Я делаю эту статью с подключенными практически всеми фильтрами экспорта. В вашем случае (если у вас подключен ТОЛЬКО фильтр экспорта ZPL) других пунктов (кроме Prepared Report) в этом меню не будет.

 

ZPL

У нас высветилось окошко с настройками экспорта нашего файла.

Настраиваем все так, как нам требуется и нажимаем “ОК”.

 

Далее о настройках:

Page range - диапазон сохранения страниц;
Export Settings:
- Print As Bitmap - печатать как матричное изображение (для штрих-кодов НЕ НАДО этого делать);
- Break lines - ломаные линии;
- Resolution (dpi) - разрешение от 152 до 600 dpi (на самом деле там набор предустановленных значений, ограниченных форматов - мы можем их выбрать - ниже в коде они перечислены);
Save to - сохранение файлом на пк, отправка по почте или же в облачное хранилище;
Open after export - открытие после сохранения.

Сохранение ZPL из кода Delphi / C++Builder / Lazarus.

Экспорт в ZPL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
procedure TForm1.Button18Click(Sender: TObject);
begin
 {Формируем отчет. Перед экспортом отчёт необходимо обязательно сформировать}
 frxReport1.PrepareReport();
 {Устанавливаем диапазон экспортируемых страниц. По умолчанию экспортируются все страницы сформированного отчета}
 frxZPLExport1.PageNumbers := '2-3';
 {Устанавливаем, нужно ли экспортировать отчет в виде изображения}
 frxZPLExport1.PrintAsBitmap := True;
 {Устанавливаем, нужно ли последовательность символов конца строки в конец каждой строки}
 frxZPLExport1.BreakLines := True;
 {Устанавливаем разрешение. Возможные значения: d6_dpmm_152_dpi, d8_dpmm_203_dpi, d12_dpmm_300_dpi, d24_dpmm_600_dpi, test1to1}
 frxZPLExport1.ZplDensity := d6_dpmm_152_dpi;
 {Устанавливаем, нужно ли открывать результирующий файл после экспорта}
 frxZPLExport1.OpenAfterExport := False;
 {Устанавливаем, нужно ли отображать прогресс экспорта(показывать, какая страница в данный момент экспортируется)}
 frxZPLExport1.ShowProgress := False;
 {Устанавливаем, нужно ли отображать окно диалога с настройками фильтра экспорта}
 frxZPLExport1.ShowDialog := False;
 {Устанавливаем имя результирующего файла. Обратите внимание на то,}
 {что если не установить имя файла и отключить показ диалогового окна фильтра экспорта,}
 {то всё равно будет отображён диалог выбора имени файла}
 frxZPLExport1.FileName := 'C:\Output\test.zpl';
 {Экспортируем отчёт}
 frxReport1.Export(frxZPLExport1);
end;

Как видим, создавать и печатать Zebra-этикетки из Delphi (в Windows-приложениях) и из Lazarus (Linux-приложения) достаточно просто. Именно этот способ используется в миллионах торговых точек по всему миру.