Маркировка: Отправка RAW-команд на принтер (EZPL, PCL)

Число просмотров: 1,581 
3 оценки, среднее: 5.00 из 53 оценки, среднее: 5.00 из 53 оценки, среднее: 5.00 из 53 оценки, среднее: 5.00 из 53 оценки, среднее: 5.00 из 5 (3 голосов, средний: 5.00 из 5)
Вы должны быть зарегистрированным пользователем чтобы голосовать за эту запись.

Итак, я написал уже два поста про EZPL и то, как я его применяю у себя в 1Ске для печати на принтере Godex G500. Но я не раскрыл (а точнее, раскрыл не до конца) самый главный секрет, над которым, как оказалось, народ на форумах бьётся много лет. Проблема в том, что раньше, когда маркировочные принтеры подключались по COM- или LPT-портам, очень просто можно было заслать на такой порт текстовый файл команд. Достаточно было написать что-то типа “Copy Commands.txt COM2″, и система открывала COM-порт как файл и копировала туда всё, что нам надо. Но сейчас большинство маркировочных принтеров (да и принтеров вообще) подключается по USB-портам, а некоторые вообще по LAN. И что делать? В консоли “Copy Commands.txt \\Printer” не напишешь – система не поймёт тебя. И вот народ мучается, например получая такие вот ответы на форуме поддержки Godex (http://www.scancode.ru/forum/topic/6/6/):

Скриншот сообщения из форума, где предлагается написать программку

На их форум я вышел по поисковым запросам “Отправка RAW-команд на принтер” или “Печать на EZPL по USB/LAN“. Эти запросы я специально оставил в тексте поста, потому что хочу чтобы моя утилитка людям, которые перекопали весь инет в поисках простого решения, пригодилась.

…но мы, однако, возвращаемся к исходному вопросу. Вот есть у меня принтер Godex G500, который имеет LAN-порт. И изучил я язык EZPL так, что хочу рисовать на этом принтере этикетки напрямую, без обработчика WinPrint и мутных настроек драйверов. ЧТО ДЕЛАТЬ?!

Как оказалось, есть два рабочих варианта: использовать специально написанные для 1С компоненты или работать с COM-портами как и раньше (например купить конвертер LAN <> RS-232). Но с компонентами для 1С тоже есть проблемы: во-первых, они только для 1С (а мы может хотим из какого-нибудь скрипта печатать), во-вторых, часть из них платные, а в-третьих, ещё часть из них жутко ограничены в настройках. Например на Scancode.ru лежит компонента для 1С 7.7/8 (в разделе “Файлы”), но она не умеет рисовать QR-коды, а только EAN-13. А это мне не подходило.

Ну так и если ничего не подходит – может быть стоит написать? И тут я вспомнил свои программерские будни на VC++, поднял доки по Windows API и сделал такую программку, как и хотел. Оказалось, что всё-всё просто до ужаса. В Windows API есть штатная функция OpenPrinter(), которая получает… обычное текстовое имя принтера точно так, как он в папке “Принтеры” называется. И ей пофигу, находится ли этот принтер удалённо или нет и по какому порту он подключен. А после того, как мы принтер открыли – достаточно пробежаться по функциям типа StartDocPrinter(), StartPagePrinter(), WritePrinter(). Сам кусок кода с вырезанными проверками ошибок выглядит примерно так:

Исходный код утилиты RAWCmd

После этого мне понадобилось поразбираться с кодировками в консоли, чтобы все данные верно брались из параметров и передавались без искажений, и после этого у меня получился простенький готовый продукт. Вот как это всё выглядит:

Утилита RAWCommans для отправки RAW-команд на принтеры напрямую

Это обычная консольная утилитка. Все нужные библиотеки, кроме системных, интегрированы внутрь неё, так что она переносима и ничего лишнего не требует. У меня она работает на WinXP, и должна работать и на более старших виндах. Утилитка делает олько одну вещь: открывает принтер по имени, создаёт задание печати с указанным именем и отправляет на принтер указанный файл. Поэтому утилита годится для ЛЮБОГО принтера маркировки с любым языком: никакие специальные команды принтеру она не шлёт, тупо отсылая содержимое файла. А что вы там в файле напишете – то на принтер и пойдёт.

Запускается она так: RAWCmd.exe “Название принтера” “Название задания” “Файл команд”. Если параметры содержат пробелы – то их надо указать в кавычках. Например если принтер зовётся MyG500 – то указываем его напрямую. А если он зовётся Godex G500 – то надо указать в кавычках “Godex G500″. У программки на каждый чих есть куча кодов возврата, так что все ошибки можно будет отследить в bat-файлах и других скриптах, если потребуется.

Я создал файлик из одной буквы “E” (конец команд для Godex) и запустил утилиту, чтобы показать как это отрабатывает:

Отправка тестового задания печати RAW на принтер

В итоге в очереди печати принтера создалось задание с нашим названием, которое содержит данные размером в три байта (один байт – буква “E” и два байта на конец и перевод строки).

Задание печати, созданное утилитой RAWCommands

Утилита лежит вот по этому адресу: CS-RAWCmd.rar (~60 кб). Пользуйтесь на здоровье, только сохраняйте мои копирайты.

8 Отзывов на “Маркировка: Отправка RAW-команд на принтер (EZPL, PCL)”


  • 1 fiber  [СПб]

    А давайте ему памятник поставим? Ну маленький хотябы.. :)

  • 2 CS  [Москва / Одинцово]

    Кому – ему? Мне не надо =)

  • 3 garp

    В похожей ситуации с usb-принтером, правда обычным, офисным, я поступил следующим образом – расшарил принтер, написал в командной строке net use \имя_компа\имя_расшаренного_принтера LPT1.
    Прокатило.

  • 4 CS  [Москва / Одинцово]

    Ну вот так все и предлагают по форумам делать. Но это колхоз, потому что лишняя шара появляется и так ещё по сетке не попечатаешь с разных компов.
    Поэтому я вот и написал эту хреновину =)

  • 5 garp

    Такой себе колхоз. Шара – тож не беда, чай не сетка ФСБ -). А на соседний комп с неменьшим успехом можно поставить дрова, расшарить принтер и т.д.

    Ой, да даже и драйверы ставить не надо. Подключиться просто к принтеру с соседнеог компа, сказать net use, да и все.

  • 6 CS  [Москва / Одинцово]

    Так мы разве спорим? Мне тот способ не нравится – это лишние настройки. Я хочу добиваться того, чтобы поставил принтер, дрова – и всё. Больше никаких херовин. А net use кажется при перезагрузке уже слетает.

  • 7 garp

    Нет, не спорим, конечно. Что до net use, то он сохраняется по пользователю после перезагрузки. Если пользователей ходит несколько, то можно применить очевидный колхозный метод – прописать net use в автозагрузку.

  • 8 CS  [Москва / Одинцово]

    Ага, прения устранены. Я его никогда не юзал и не знал, сохраняется ли подключени… а, хотя где-то ж была галка типа “Восстанавливать сетевые диски при входе в систему”.

Оставить отзыв

Вы должны войти на блог, чтобы оставить комментарий.