При разработке решений для складского учета и розничной торговли часто возникает задача прямой печати этикеток из 1С или других учетных систем на специализированные принтеры (Gprinter, TSC, Xprinter и другие, поддерживающие язык TSPL). Одной из частых проблем становится печать логотипов или статических изображений. Стандартные драйверы Windows не всегда обеспечивают достаточную скорость или стабильность при потоковой печати, поэтому программисты прибегают к использованию нативных команд принтера.
В этой статье мы подробно разберем процесс загрузки BMP-изображения в память принтера, рассмотрим синтаксис команд языка TSPL, затронем нюансы печати на мобильных принтерах, выясним требования к графическим файлам и проанализируем, почему на некоторых моделях (например, Gprinter GP-2120TU) изображения могут не сохраняться после перезагрузки.
Язык TSPL (TSC Printer Language) — это набор команд, позволяющий управлять принтером напрямую, отправляя ему текстовые и бинарные данные в порт. Это позволяет полностью контролировать процесс печати, минуя графическую подсистему Windows.
Для работы с изображениями в TSPL предусмотрены две основные стратегии:
В данной статье мы сосредоточимся на первом методе — загрузке изображения через команду DOWNLOAD, так как именно она вызвала трудности у автора темы, и разберем нюансы прямой печати как альтернативы.
Одной из главных причин, почему принтер печатает пустую этикетку или игнорирует команду загрузки, является неверный формат файла. Разберем требования к BMP файлу для принтеров TSPL.
Принтеры этикеток (термо и термотрансферные) являются монохромными устройствами. Они могут либо "прожечь" точку (черный), либо не прожечь (белый). Полутона имитируются дизерингом (растром), но на физическом уровне это 1 бит на пиксель.
Важное правило: Изображение должно быть сохранено в формате BMP с глубиной цвета 1 бит (Monochrome). Это может потребовать предварительной работы с графическими файлами, так как если вы попытаетесь загрузить стандартный цветной (24 бита) BMP, принтер, скорее всего, не сможет его обработать корректно.
Для подготовки файла:
LOGO.BMP), так как старые версии прошивок могут иметь ограничения на длину имени.Команда загрузки файла в TSPL имеет следующий синтаксис:
DOWNLOAD [n,]"FILENAME",size,content
Где:
n — опциональный параметр места хранения (F для Flash-памяти, которая сохраняется после выключения, D для DRAM — оперативной памяти, которая очищается)."FILENAME" — имя, под которым файл будет сохранен в принтере.size — размер файла в байтах.content — само содержимое файла.Главная сложность заключается в том, как передать бинарное содержимое картинки вместе с текстовой командой через командную строку или порт. Просто скопировать текстовый файл с командой, а потом картинку — нельзя, так как команда ожидает данные немедленно.
Правильный алгоритм действий:
Нам необходимо создать составной файл, который будет содержать заголовок команды и сразу за ним — бинарные данные картинки. Для этих целей можно использовать штатные средства или специализированный распаковщик и запаковщик файлов.
1. Создадим текстовый файл (например, header.txt) с командой начала загрузки. Размер файла картинки (в байтах) нужно узнать заранее (например, через свойства файла в Windows).
DOWNLOAD F,"GP.BMP",3678
Обратите внимание: после числа 3678 не должно быть лишних переносов строк, если вы не учитываете их в размере.
2. Теперь объединим заголовок и саму картинку в один файл, который отправим на принтер. В командной строке Windows (CMD) используем команду COPY с ключом /B (бинарный режим):
COPY /B header.txt + GP.BMP upload_command.prn
В результате мы получим файл upload_command.prn, который содержит правильную команду TSPL и следом за ней байт-в-байт содержимое картинки. Иногда в процессе подготовки может потребоваться копирование файлов между Клиентом и Сервером.
Примечание: Некоторые источники указывают на необходимость использования символа конца файла (EOF, код 1A, в редакторах отображается как ^Z) после размера, но в большинстве современных реализаций TSPL достаточно указать точный размер данных.
Если принтер подключен через USB, но мы хотим работать с ним как с LPT или COM портом через командную строку, необходимо "расшарить" (открыть общий доступ) принтер в Windows и подключить его через NET USE.
1. В настройках принтера ставим галочку "Общий доступ" и задаем сетевое имя, например MyPrinter.
2. В командной строке выполняем маппинг порта:
net use LPT1: \\%COMPUTERNAME%\MyPrinter
3. Отправляем подготовленный файл на принтер:
COPY /B upload_command.prn LPT1
Если все прошло успешно, индикатор принтера может моргнуть (зависит от модели), сигнализируя о приеме данных.
После того как файл загружен в память, мы можем вывести его на печать с помощью команды PUTBMP. Создадим текстовый файл с заданием на печать (например, print.txt):
SIZE 56 mm, 30 mm
GAP 2 mm, 0 mm
CLS
PUTBMP 10,10,"GP.BMP"
PRINT 1,1
Здесь:
SIZE и GAP — настраивают размер этикетки (подставьте свои значения).CLS — очищает буфер печати.PUTBMP X,Y,"NAME" — помещает картинку с именем "GP.BMP" по координатам X=10, Y=10.PRINT 1,1 — печатает одну этикетку.Отправляем команду на печать:
COPY print.txt LPT1
Разберем детально ситуацию, с которой столкнулся автор темы, и которая может возникнуть у вас.
Если принтер прогоняет пустую этикетку, это означает, что он не смог найти файл в памяти или не смог его декодировать.
Решение:
DOWNLOAD указан точный размер файла в байтах. Если размер указан меньше реального — файл будет обрезан, если больше — принтер будет ждать недостающие байты и зависнет.F (Flash) или D (DRAM) в команде DOWNLOAD явно, если прошивка этого требует.Автор темы выяснил, что на модели Gprinter GP-2120TU изображение загружается, печатается, но после перезагрузки исчезает, даже если использовалась команда DOWNLOAD F (Flash). При распечатке страницы самодиагностики (Self-test) видна надпись Files is not support (или File system not support).
Анализ причины:
Это аппаратное или программное ограничение конкретных бюджетных моделей принтеров. Несмотря на наличие физической флеш-памяти, прошивка принтера может не поддерживать файловую систему для пользователя. Вся память отведена под системные нужды (шрифты, буфер). В таких принтерах команда DOWNLOAD F работает аналогично загрузке в оперативную память (DRAM) — файлы живут только до выключения питания.
Решение для таких принтеров:
Если ваш принтер не поддерживает сохранение файлов, у вас есть два пути:
1. Загрузка при каждом включении (сессии).
В начале рабочей смены или при открытии обработки в 1С программно отправлять файл с картинкой в DRAM принтера. Это быстро и позволяет использовать команду PUTBMP в дальнейшем.
2. Использование команды BITMAP (Прямая печать).
Вместо того чтобы сначала загружать файл, а потом печатать его, можно передавать данные растра непосредственно в потоке печати. Это более надежный способ для "капризных" принтеров.
Синтаксис:
BITMAP X,Y,width,height,mode,bitmap_data
Здесь:
width — ширина в байтах (ширина в пикселях деленная на 8).height — высота в точках (пикселях).mode — режим наложения (обычно 0).bitmap_data — сырые данные изображения.В отличие от DOWNLOAD, команда BITMAP требует передачи "сырых" данных (RAW), то есть из BMP-файла обычно нужно вырезать заголовок (первые 62 байта для монохромного BMP), и зачастую инвертировать биты (так как в BMP 1=белый, а в термопечати 1=черный, хотя многие принтеры умеют инвертировать это параметром mode или настройками).
При реализации печати этикеток с картинками из 1С, рекомендуется придерживаться следующей стратегии:
ДвоичныеДанные. Считывайте файл картинки в двоичные данные.ЗаписьТекста и ЗаписьДанных во временный файл).COPY LPT это затруднительно).Для успешной печати логотипа на принтере Gprinter (TSPL) необходимо:
DOWNLOAD для загрузки файла, склеив её с бинарным содержимым картинки.BITMAP.