Как загрузить и распечатать BMP изображение на принтере этикеток с поддержкой TSPL (Gprinter)?

Программист IT и автоматизация бизнеса
← На главную

При разработке решений для складского учета и розничной торговли часто возникает задача прямой печати этикеток из 1С или других учетных систем на специализированные принтеры (Gprinter, TSC, Xprinter и другие, поддерживающие язык TSPL). Одной из частых проблем становится печать логотипов или статических изображений. Стандартные драйверы Windows не всегда обеспечивают достаточную скорость или стабильность при потоковой печати, поэтому программисты прибегают к использованию нативных команд принтера.

В этой статье мы подробно разберем процесс загрузки BMP-изображения в память принтера, рассмотрим синтаксис команд языка TSPL, затронем нюансы печати на мобильных принтерах, выясним требования к графическим файлам и проанализируем, почему на некоторых моделях (например, Gprinter GP-2120TU) изображения могут не сохраняться после перезагрузки.

Понимание задачи и языка TSPL

Язык TSPL (TSC Printer Language) — это набор команд, позволяющий управлять принтером напрямую, отправляя ему текстовые и бинарные данные в порт. Это позволяет полностью контролировать процесс печати, минуя графическую подсистему Windows.

Для работы с изображениями в TSPL предусмотрены две основные стратегии:

  1. Загрузка в память (DOWNLOAD): Мы один раз загружаем картинку в память принтера (Flash или DRAM), а затем в шаблоне этикетки просто ссылаемся на неё по имени. Это экономит трафик при печати больших тиражей.
  2. Прямая печать (BITMAP): Мы отправляем бинарные данные картинки каждый раз вместе с заданием на печать. Это увеличивает объем передаваемых данных, но не требует управления памятью принтера.

В данной статье мы сосредоточимся на первом методе — загрузке изображения через команду DOWNLOAD, так как именно она вызвала трудности у автора темы, и разберем нюансы прямой печати как альтернативы.

Этап 1: Подготовка изображения

Одной из главных причин, почему принтер печатает пустую этикетку или игнорирует команду загрузки, является неверный формат файла. Разберем требования к BMP файлу для принтеров TSPL.

Принтеры этикеток (термо и термотрансферные) являются монохромными устройствами. Они могут либо "прожечь" точку (черный), либо не прожечь (белый). Полутона имитируются дизерингом (растром), но на физическом уровне это 1 бит на пиксель.

Важное правило: Изображение должно быть сохранено в формате BMP с глубиной цвета 1 бит (Monochrome). Это может потребовать предварительной работы с графическими файлами, так как если вы попытаетесь загрузить стандартный цветной (24 бита) BMP, принтер, скорее всего, не сможет его обработать корректно.

Для подготовки файла:

  1. Откройте изображение в любом графическом редакторе (например, Paint или Photoshop).
  2. Переведите режим изображения в черно-белый (Black & White).
  3. При сохранении выберите формат "Monochrome Bitmap (*.bmp;*.dib)".
  4. Убедитесь, что имя файла короткое и на латинице (например, LOGO.BMP), так как старые версии прошивок могут иметь ограничения на длину имени.

Этап 2: Формирование команды загрузки

Команда загрузки файла в TSPL имеет следующий синтаксис:

DOWNLOAD [n,]"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 достаточно указать точный размер данных.

Этап 3: Отправка данных на принтер

Если принтер подключен через USB, но мы хотим работать с ним как с LPT или COM портом через командную строку, необходимо "расшарить" (открыть общий доступ) принтер в Windows и подключить его через NET USE.

1. В настройках принтера ставим галочку "Общий доступ" и задаем сетевое имя, например MyPrinter.

2. В командной строке выполняем маппинг порта:

net use LPT1: \\%COMPUTERNAME%\MyPrinter

3. Отправляем подготовленный файл на принтер:

COPY /B upload_command.prn LPT1

Если все прошло успешно, индикатор принтера может моргнуть (зависит от модели), сигнализируя о приеме данных.

Этап 4: Вывод изображения на печать

После того как файл загружен в память, мы можем вывести его на печать с помощью команды PUTBMP. Создадим текстовый файл с заданием на печать (например, print.txt):


SIZE 56 mm, 30 mm
GAP 2 mm, 0 mm
CLS
PUTBMP 10,10,"GP.BMP"
PRINT 1,1

Здесь:

Отправляем команду на печать:

COPY print.txt LPT1

Проблемы и их решения

Разберем детально ситуацию, с которой столкнулся автор темы, и которая может возникнуть у вас.

Проблема 1: Пустая этикетка при печати

Если принтер прогоняет пустую этикетку, это означает, что он не смог найти файл в памяти или не смог его декодировать.

Решение:

  1. Проверьте, что BMP файл монохромный (1-bit). Это критично. Цветные изображения игнорируются.
  2. Проверьте, что в команде DOWNLOAD указан точный размер файла в байтах. Если размер указан меньше реального — файл будет обрезан, если больше — принтер будет ждать недостающие байты и зависнет.
  3. Убедитесь, что вы используете параметр F (Flash) или D (DRAM) в команде DOWNLOAD явно, если прошивка этого требует.

Проблема 2: Изображение исчезает после выключения (Ошибка "Files is not support")

Автор темы выяснил, что на модели 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

Здесь:

В отличие от DOWNLOAD, команда BITMAP требует передачи "сырых" данных (RAW), то есть из BMP-файла обычно нужно вырезать заголовок (первые 62 байта для монохромного BMP), и зачастую инвертировать биты (так как в BMP 1=белый, а в термопечати 1=черный, хотя многие принтеры умеют инвертировать это параметром mode или настройками).

Рекомендации для разработчиков 1С

При реализации печати этикеток с картинками из 1С, рекомендуется придерживаться следующей стратегии:

  1. Используйте объект ДвоичныеДанные. Считывайте файл картинки в двоичные данные.
  2. Формируйте пакет динамически. Собирайте текстовую часть команды TSPL и объединяйте её с двоичными данными картинки в один поток (например, через ЗаписьТекста и ЗаписьДанных во временный файл).
  3. Проверяйте статус принтера. Если есть возможность, анализируйте ответ принтера (хотя через COPY LPT это затруднительно).
  4. Предпочитайте прямую печать (BITMAP). Если вы не уверены в модели принтера у клиента, метод прямой печати данных (BITMAP) более универсален, чем попытка сохранить файл во Flash-память, которой может не быть.

Итог

Для успешной печати логотипа на принтере Gprinter (TSPL) необходимо:

  1. Конвертировать картинку в монохромный BMP.
  2. Использовать команду DOWNLOAD для загрузки файла, склеив её с бинарным содержимым картинки.
  3. Учитывать, что бюджетные модели (как GP-2120TU) могут не сохранять файлы после выключения питания. В этом случае нужно либо загружать картинку при каждой печати, либо использовать команду BITMAP.
← На главную