При печати этикеток и документов небольшого размера разработчики часто сталкиваются с проблемой нечитаемости штрихкодов сканерами. При уменьшении стандартного штрихкода из Библиотеки подключаемого оборудования (БПО) или при изменении масштаба документа линии смазываются, сливаются и теряют четкие границы. Разберем причины такого поведения платформы и рассмотрим практические способы получения качественного векторного или точно рассчитанного растрового штрихкода.
Проанализируем механизм работы стандартной компоненты генерации штрихкодов:
ПрозрачныйФон = Истина. При выводе на термопринтер или монохромный лазерный принтер полупрозрачные пиксели передаются через дизеринг (растровую сетку из точек), что окончательно разрушает геометрию штрихов.Прежде чем подключать сторонние библиотеки, попробуем настроить штатный механизм генерации растра так, чтобы избежать размытия граней:
ПрозрачныйФон = Ложь. Фон должен быть строго белым, а штрихи — абсолютно черными.РазмерКартинки = РеальныйРазмер вместо пропорционального масштабирования.УголПоворота, передавая значения 0, 90, 180 или 270 градусов, чтобы исключить искажения при программной трансформации картинки.Если требуется абсолютная независимость от масштабирования документа пользователем, перейдем на векторный формат SVG, который платформа 1С:Предприятие 8.3 поддерживает нативно. Для генерации векторных изображений отлично подходит консольная утилита Zint Barcode Generator.
Рассмотрим запуск утилиты из командной строки для получения векторного файла SVG:
КомандаЗапуска = "zint.exe -b 60 -d ""4601234567890"" -o ""C:\Temp\barcode.svg""";
ЗапуститьПриложение(КомандаЗапуска, , Истина);
В параметре -b указывается тип штрихкода (например, 60 для Code 128 или 34 для EAN-13), а в -o задается выходной файл с расширением .svg.
Разберем особенности ориентации SVG при работе с утилитой:
--rotate= поддерживает значения 0, 90, 180, 270, однако для векторного вывода в некоторых версиях поворот требуется задавать на уровне разметки SVG.width и height), добавив атрибут transform="rotate(90)":
ТекстSVG = Новый ТекстовыйДокумент;
ТекстSVG.Прочитать("C:\Temp\barcode.svg", КодировкаТекста.UTF8);
Содержимое = ТекстSVG.ПолучитьТекст();
Содержимое = СтрЗаменить(Содержимое, "<svg ", "<svg transform=""rotate(90)"" ");
ТекстSVG.УстановитьТекст(Содержимое);
ТекстSVG.Записать("C:\Temp\barcode_rotated.svg", КодировкаТекста.UTF8);
Линейный штрихкод представляет собой чередование черных и белых полос фиксированной относительной ширины. Мы можем сформировать SVG-файл напрямую кодом 1С без вызова внешних исполняемых файлов:
<rect> с соответствующими координатами x, y, шириной width и высотой height.Картинка и поместим в табличный документ:
ДвоичныеДанныеSVG = ПолучитьДвоичныеДанныеИзСтроки(ТекстSVGXML, КодировкаТекста.UTF8);
ВекторныйШтрихкод = Новый Картинка(ДвоичныеДанныеSVG);
Такой штрихкод сохраняет математическую точность линий при любом коэффициенте масштабирования и изменении размера ячейки.
Еще один надежный способ добиться идеальной векторной четкости — вывод штрихкода через шрифт (например, Code 128, EAN-13 или Code 39):
Ориентация, выбрав значение 90, 180 или 270 градусов.Если печать выполняется на специализированных принтерах этикеток (Zebra, TSC, Godex), наиболее стабильным решением является отказ от графической печати в пользу отправки команд на нативном языке принтера (ZPL или TSPL). В этом случае микроконтроллер принтера самостоятельно строит штрихкод с физической привязкой к нагревательным элементам термоголовки, что полностью исключает размытие и проблемы с масштабированием.