Обозначение ниже: \esc<cmd>;, где <cmd> - байты команды (в десятичном представлении), разделенные запятой, в конце точка с запятой для разделения команд. Например, \esc29,86,0; - команда отрезки без протяжки ленты.
В обычном режиме принтер выполняет команды построчно, протягивая ленту на условное межстрочное расстояние в конце каждой строки. Страничный режим позволяет сформировать в буфере одну или несколько областей заданного размера, разместив их в произвольном месте, а затем вывести буфер на печать.
В общем виде печать в страничном режиме выглядит так:
1. Устанавливаем страничный режим (ESC L) \esc27,76;
2. Устанавливаем размерные единицы по горизонтали (перпендикулярно направлению протяжки ленты, mu_x) и по вертикали (параллельно направлению протяжки ленты, mu_y) (GS P) \esc29,80,x,y;
размерная единица характеризует разрешение печати в точках на дюйм, подбирается опытным путем, по умолчанию x=180, y=360
3. Устанавливаем координаты и размер области (ESC W) \esc27,87,xL,xH,yL,yH,dxL,dxH,dyL,dyH;
Координаты верхнего левого угла относительно направления печати
x0 = (xL + xH * 256) * mu_x
y0 = (yL + yH * 256) * mu_y
Размеры области
dx = (dxL + dxH * 256) * mu_x
dy = (dyL + dyH * 256) * mu_y
По достижении правой границы области текст будет переноситься на следующую строку. При достижении нижней границы текст будет обрезан или напечатается поверх предыдущей строки (!)
4. Устанавливаем направление печати (ESC T) \esc27,84,n;
n = 0 - слева направо (по-умолчанию)
n = 1 - снизу вверх (вдоль левой границы области)
n = 2 - справа налево (вдоль нижней границы области)
n = 3 - сверху вниз (вдоль правой границы области)
5. Выводим в область текст, графику, ШК и т.д. Завершаем вывод командой LF \esc10;
6. Повторяем пункты 3-5 для каждой области
7. Отправляем буфер на печать (ESC FF) или (FF). В последнем случае будет возвращен обычный режим и установлены значения по-умолчанию \esc12;
В структуру PrintingItem добавляем параметры блоков страничного режима (координаты X и Y, ширина и высота, направление печати, коллекция элементов для печати в блоке)
{
"printing": [
{
"type": "pageMode",
"pageModeItems": [
{
"x": 0,
"y": 0,
"width": 400,
"height": 400,
"direction": 0,
"printing": [
{
"type": "text",
"alignment": "left",
"place": "Before",
"text": "слева направо",
"font": 0,
"wrap": "None"
}
]
},
{
"x": 0,
"y": 0,
"width": 400,
"height": 400,
"direction": 1,
"printing": [
{
"type": "text",
"alignment": "left",
"place": "Before",
"text": "снизу вверх",
"font": 0,
"wrap": "None"
}
]
},
{
"x": 0,
"y": 0,
"width": 400,
"height": 400,
"direction": 2,
"printing": [
{
"type": "text",
"alignment": "left",
"place": "Before",
"text": "справа налево",
"font": 0,
"wrap": "None"
}
]
},
{
"x": 0,
"y": 0,
"width": 400,
"height": 400,
"direction": 3,
"printing": [
{
"type": "text",
"alignment": "left",
"place": "Before",
"text": "сверху вниз",
"font": 0,
"wrap": "None"
}
]
}
]
},
{
"type": "text",
"alignment": "left",
"place": "Before",
"text": " \n \n \n \n",
"font": 0,
"wrap": "None"
}
]
}
Передаётся массив байт для отправки на устройство. Это закрывает все возможности протокола и его диалектов от различных производителей
{
"printing": [
{
"type": "userCommand",
"userCommand": [
27,42,0,100,0,8,36,82,66,66,36,24,0,50,27,11,102,255,102,11,27,50,0,24,36,66,66,74,36,16,8,36,82,66,66,36,24,0,50,27,11,102,255,102,11,27,50,0,24,36,66,66,74,36,16,8,36,82,66,66,36,24,0,50,27,11,102,255,102,11,27,50,0,24,36,66,66,74,36,16,8,36,82,66,66,36,24,0,50,27,11,102,255,102,11,27,50,0,24,36,66,66,74,36,16
]
},
{
"type": "userCommand",
"userCommand": [
27,42,0,100,0,8,36,82,66,66,36,24,0,50,27,11,102,255,102,11,27,50,0,24,36,66,66,74,36,16,8,36,82,66,66,36,24,0,50,27,11,102,255,102,11,27,50,0,24,36,66,66,74,36,16,8,36,82,66,66,36,24,0,50,27,11,102,255,102,11,27,50,0,24,36,66,66,74,36,16,8,36,82,66,66,36,24,0,50,27,11,102,255,102,11,27,50,0,24,36,66,66,74,36,16
]
},
{
"type": "userCommand",
"userCommand": [
27,42,0,100,0,8,36,82,66,66,36,24,0,50,27,11,102,255,102,11,27,50,0,24,36,66,66,74,36,16,8,36,82,66,66,36,24,0,50,27,11,102,255,102,11,27,50,0,24,36,66,66,74,36,16,8,36,82,66,66,36,24,0,50,27,11,102,255,102,11,27,50,0,24,36,66,66,74,36,16,8,36,82,66,66,36,24,0,50,27,11,102,255,102,11,27,50,0,24,36,66,66,74,36,16,10
]
},
{
"type": "text",
"alignment": "left",
"place": "Before",
"text": " \n \n \n \n",
"font": 0,
"wrap": "None"
}
]
}