Следующий код работает для меня. Проблема была в командах, это очень важно! Обзор команды я использовал ниже, еще можно найти here
PrintImage
^XA Start Format Описание команды^XA используется в начале ZPL кода II. Это открывающая скобка и указывает начало нового формата этикетки. Эта команда заменяется одним управляющим символом ASCII STX (control-B, hexadecimal 02). Формат^XA Комментарии. Действительный формат ZPL II требует, чтобы форматы меток начинались с команды^XA и заканчивались командой^XZ.
^FO Field Origin Описание Команда^FO задает начало поля относительно позиции метки (^ LH).^FO устанавливает верхний левый угол области поля, определяя точки вдоль оси x и оси y, не зависящие от вращения. Формат^лисица, у, г
- х = х-оси местоположение (в точках) Допустимые значения: от 0 до 32000 По умолчанию Значение: 0
- у = у-оси местонахождения (в точках) Допустимые значения: 0 до 32000 Значение по умолчанию: 0
- z = обоснование Параметр z только поддерживается в версиях прошивки V60.14.x, V50.14.x или новее. Принятые значения: 0 = выравнивание по левому краю 1 = правое обоснование 2 = автоматическое обоснование (в зависимости от сценария) Значение по умолчанию: последний принял^FW значение или^FW по умолчанию
^IM Изображение Move Описание^IM-команда выполняет прямое перемещение изображения из области памяти в растровое изображение. Команда идентична команде^XG (Recall Graphic), за исключением параметров калибровки. Формат^IMD: вола
- д = расположение хранимых объектов Допустимые значения: R :, E :, B :, и А: Значение по умолчанию: поиск приоритет
- имя объекта о = Допустимые значения: от 1 до 8 буквенно-цифровые символы Значение по умолчанию: если имя не указано, UNKNOWN используется
- х = расширение Fixed Value: .grf, .PNG
^FS Field Separator Описание команда^FS обозначает конец определения поля. Альтернативно, команда FS также может быть выписана как один управляющий код ASCII SI (Control-O, hexadecimal 0F).Формат^FS
^XZ Конец Формат Описание Команда^XZ - это конечная (закрывающая) скобка. Он указывает конец формата метки. Когда эта команда будет принята, надпись будет напечатана. Эта команда также может быть выписана как один управляющий символ ASCII ETX (Control-C, шестнадцатеричный 03). Формат^XZ Комментарии Форматы меток должны начинаться с команды^XA и заканчиваться командой^XZ для действительного формата ZPL II.
zplToSend
^MN Медиа Tracking Описание Эта команда определяет тип используемого носителя и черной метки смещения в точках. Этот маркированный список показывает типы носителей, связанные с этой командой:
- Continuous Media - это средства массовой информации не имеют физические характеристик (например, веб, вырезы, перфорация, черная метка) для разделения меток. Длина метки определяется командой^LL.
- Непрерывные носители с переменной длиной - такие же, как и непрерывные носители, но если части напечатанной этикетки выходят за пределы определенной длины этикетки, размер этикеток будет автоматически расширяться, чтобы содержать их. Это расширение длины метки применяется только к текущей метке. Обратите внимание, что^MNV по-прежнему требует использования команды^LL для определения начальной требуемой длины метки.
- Непрерывный носитель - этот носитель обладает некоторыми физическими характеристиками (такими как полотно, вырез, перфорация, черная метка) для разделения меток.
Формат^MNa, б
- а = носитель используется Допустимые значения: N = сплошных сред Y = без сплошных сред веб зондирования D, E W = без сплошных сред веб зондирования д, e M = не непрерывное считывание метки носителя A = автоматическое определение типа носителя во время калибровки d, f V = непрерывный носитель, переменная длина g Значение по умолчанию: значение должно быть введено или команда игнорируется
- b = черный смещение метки в точках Это устанавливает ожидаемое местоположение знака носителя относительно точки разделения между документами. Если установлено значение 0, ожидается, что метка носителя будет найдена в точке разделения. (то есть перфорация, точка резания и т. д.). Все значения перечислены в точках. Этот параметр игнорируется, если параметр a не установлен на M. Если этот параметр отсутствует, используется значение по умолчанию. Допустимые значения: от -80 до 283 для прямой термопечати только принтеры -240 до 566 на 600 точек на дюйм принтеров -75 до 283 для KR403 принтеров -120 до 283 для всех остальных принтеров Значение по умолчанию: 0
~ DY Загрузка объектов Описание Команда ~ DY загружает графические объекты или шрифты принтера в любом поддерживаемом формате. Эта команда может использоваться вместо ~ DG для большего количества вариантов сохранения и загрузки. ~ DY - предпочтительная команда для загрузки шрифтов TrueType на принтерах с прошивкой позже X.13. Это быстрее, чем ~ DU. Команда ~ DY также поддерживает загрузку файлов беспроводных сертификатов. Формат ~ DYD: е, б, х, т, ш, данные
Примечание При использовании файлов сертификатов, принтер поддерживает: - Использование Privacy Enhanced Почта (PEM), отформатированные файлы сертификатов. - Использование сертификата клиента и частного ключа в виде двух файлов, каждый из которых загружается отдельно. - Использование экспортируемых файлов PAC для EAP-FAST. - Zebra рекомендует использовать линейный StY
- D = местоположение файла .NRD и .pac файлы находятся на E: в версиях прошивки V60.15.x, V50.15.x, или позже. Принятые значения: R :, E :, B :, и A: Значение по умолчанию: R:
- f = имя файла Принимаемые значения: от 1 до 8 буквенно-цифровых символов Значение по умолчанию: если имя не указано, используется UNKNOWN
- b = формат, загруженный в поле данных .TTE и .TTF поддерживаются только в версиях прошивки V60.14.x, V50.14.x или новее. Принимаемые значения: A = несжатый (ZB64, ASCII) B = несжатый (.TTE, .TTF, двоичный) C = AR-сжатый (используется только для Zebra's BAR-ONE® v5) P = портативная сетевая графика (.PNG) - ZB64 кодируются значение по умолчанию: значение должно быть указано
clearDownLabel
^ID Описание команды^Идентификатор удаляет объекты, графику, шрифты и сохраненные форматы из зоны хранения. Объекты могут быть удалены выборочно или группами. Эта команда может использоваться в формате печати для удаления объектов перед сохранением новых или в отдельном формате для удаления объектов.
Название изображения и расширение поддерживают использование звездочки (*) в качестве дикой карты. Это позволяет легко удалить выбранные группы объектов. Формат^IDD: вола
- д = расположение хранимых объектов Допустимые значения: R :, E :, B :, и А: значение по умолчанию: Р:
Принято
- о = имя объекта Значения: любой 1 8 символов имя Значение по умолчанию: если имя не указано, UNKNOWN используется
х = расширение Допустимые значения: любое расширение в соответствии с соглашениями Zebra Значение по умолчанию: .grf
const string PrintImage = "^XA^FO0,0,0^IME:LOGO.PNG^FS^XZ";
var zplImageData = string.Empty;
using (var response = request.GetResponse())
{
using (var responseStream = response.GetResponseStream())
{
using (var stream = new MemoryStream())
{
if (responseStream == null)
{
return;
}
responseStream.CopyTo(stream);
stream.Position = 0;
using (var zipout = ZipFile.Read(stream))
{
using (var ms = new MemoryStream())
{
foreach (var e in zipout.Where(e => e.FileName.Contains(".png")))
{
e.Extract(ms);
}
if (ms.Length <= 0)
{
return;
}
var binaryData = ms.ToArray();
foreach (var b in binaryData)
{
var hexRep = string.Format("{0:X}", b);
if (hexRep.Length == 1)
{
hexRep = "0" + hexRep;
}
zplImageData += hexRep;
}
var zplToSend = "^XA" + "^FO0,0,0" + "^MNN" + "~DYE:LOGO,P,P," + binaryData.Length + ",," + zplImageData + "^XZ";
var label = GenerateStreamFromString(zplToSend);
var client = new System.Net.Sockets.TcpClient();
client.Connect(IpAddress, Port);
label.CopyTo(client.GetStream());
label.Flush();
client.Close();
var cmd = GenerateStreamFromString(PrintImage);
var client2 = new System.Net.Sockets.TcpClient();
client2.Connect(IpAddress, Port);
cmd.CopyTo(client2.GetStream());
cmd.Flush();
client2.Close();var clearDownLabel = GenerateStreamFromString("^XA^IDR:LOGO.PNG^FS^XZ");
var client3 = new System.Net.Sockets.TcpClient();
client3.Connect(IpAddress, Port);
clearDownLabel.CopyTo(client3.GetStream());
clearDownLabel.Flush();
client3.Close();
}
}
}
}
}
}