Размещение полноценного штрихкода формата EAN-13 на ограниченном пространстве этикетки размером 35х13 мм — это классическая задача «впихнуть невпихуемое». Основная сложность заключается не столько в масштабировании картинки, сколько в обеспечении считываемости кода сканерами после печати. Рассмотрим подробно, как решить эту задачу, избежав проблем с размытием линий и неверными пропорциями.
Прежде чем приступать к программному коду, проанализируем физику процесса. Большинство принтеров этикеток начального уровня (например, Godex DT4 или популярные модели TSC) имеют разрешение 203 dpi (точек на дюйм). Это означает, что на 1 мм ширины приходится примерно 8 точек (дюз) принтера. Размер одной точки составляет 0,125 мм.
Стандартный штрихкод EAN-13 состоит из 95 модулей (узких полос или пробелов). Чтобы штрихкод гарантированно считался, ширина каждого модуля должна быть кратна целой точке принтера. Проанализируем два варианта:
Важный вывод: Если при формировании изображения штрихкод получается «дробным» (например, модуль равен 2,34 точки), драйвер принтера начнет округлять ширину линий. В итоге одна линия будет шириной в 2 точки, а другая в 3. Для сканера это будет выглядеть как ошибка, и штрихкод не зачтется.
Выясним причину, по которой стандартный метод 1С ПолучитьШтрихкод() или работа через ActiveX часто выдают плохой результат. Когда мы генерируем картинку и растягиваем ее в табличном документе, происходит интерполяция. Драйвер пытается сгладить края, добавляя серые пиксели, которые на термопринтере превращаются в «рваные» края штрихов.
Чтобы этого избежать, проанализируем настройки драйвера принтера. В настройках печати (Printing Preferences) в ОС Windows необходимо найти раздел Graphics (Графика) и установить параметр Dithering (Размытие/Полутона) в значение None или Solid. Это заставит принтер использовать только чистый черный и белый цвета без попыток имитации оттенков.
Согласно стандарту, высота штрихкода EAN-13 должна быть довольно большой. Однако на этикетке высотой 13 мм нам нужно разместить еще и текстовую информацию. Разберем, как сэкономить место:
Большинство современных сканеров (особенно имидж-сканеры) прекрасно справляются с усеченными штрихкодами. Вы можете смело уменьшать высоту полосок до 5–7 мм. Остальное пространство (6–8 мм) можно использовать под наименование товара или цену. Для этого в свойствах объекта «Штрихкод» в 1С следует отключить отображение цифр под кодом, а сами цифры вывести мелким шрифтом в углу или под кодом отдельно.
Если стандартные средства 1С не позволяют добиться идеальной четкости при пробросе через терминальную сессию (RDP), рассмотрим самый надежный метод — использование «родного» языка принтера. Для Godex это язык EZPL, для TSC — TSPL.
Этот метод исключает искажения драйвера Windows, так как мы отправляем принтеру текстовую команду: «Напечатай EAN-13 в координатах X,Y с шириной модуля 2 точки». Рассмотрим пример формирования такой команды из 1С для отправки в COM-порт или через локальную очередь печати:
// Пример формирования строки на языке EZPL для принтера Godex
Команда = "^Q13,3" + Символы.ВК; // Высота этикетки 13мм, зазор 3мм
Команда = Команда + "^W35" + Символы.ВК; // Ширина этикетки 35мм
Команда = Команда + "^H10" + Символы.ВК; // Интенсивность печати
Команда = Команда + "E,10,2,2,2,40,0,1," + "4601234567890" + Символы.ВК;
// Где: 10,2 - координаты; 2,2 - множитель ширины; 40 - высота штрихов
Отправить такую строку на принтер можно с помощью объекта WScript.Shell или копированием файла в порт принтера:
ПутьКФайлу = "C:\temp\label.txt";
ТекстовыйФайл = Новый ТекстовыйДокумент;
ТекстовыйФайл.УстановитьТекст(Команда);
ТекстовыйФайл.Записать(ПутьКФайлу, КодировкаТекста.ANSI);
// Отправка на принтер через командную строку
ЗапуститьПриложение("cmd /c copy /b " + ПутьКФайлу + " \\ИмяКомпьютера\ИмяПринтера", , Истина);
Проанализируем ситуацию с направлением печати. Штрихкод может выходить из принтера «забором» (линии параллельны движению ленты) или «лестницей» (линии перпендикулярны движению).
Для термопринтеров наилучшим вариантом является печать «забором» (вдоль направления движения). В этом случае четкость краев штрихов зависит только от работы нагревательных элементов термоголовки. Если печатать «лестницей», малейшее проскальзывание ленты или нестабильность мотора мгновенно исказит ширину линий, и код перестанет читаться.
Если использование прямых команд принтера кажется слишком сложным, попробуем оптимизировать работу стандартной компоненты печати штрихкодов:
SVG, используйте его. Векторные изображения масштабируются драйвером гораздо корректнее растровых BMP.ОриентацияТекста = 90.Подводя итог, скажем: для печати EAN-13 на этикетке 35х13 мм ключевым фактором является соблюдение кратности модуля в 2 точки принтера и отключение дизеринга в настройках драйвера. Это обеспечит стабильное считывание даже самыми простыми сканерами.