Фоновая печать из web-приложения

Фоновая печать из web-приложения

При работе по автоматизации склада была поставлена задача: организовать печать наклеек со штрих-кодом из веб-приложения на специализированном принтере. Дополнительные условия, первое: команда на печать не должна требовать явных действий пользователя. А значит никаких диалоговых окон. Второе: принтер этикеток не может быть установлен у пользователя в качестве принтера по умолчанию. И третье: высокая скорость отправки задания на принтер.

Для печати этикеток мы выбрали Brother с Wi-Fi на борту. Выбирали по размеру используемых лент и соотношению цены, качества, скорости печати и стоимости расходных материалов.

printer

Ранее для печати мы использовали стандартный интерфейс браузера (Файл – Печать), этого было достаточно. Единственное усовершенствование: при загрузке страниц вызывался метод window.print(), то есть мы автоматически открывали диалоговое окно браузера. Это позволяло экономить несколько секунд.

В целом же процесс печати достаточно длительный:

  • Нужно открыть страницу с “версией для печати”. То есть где-то перейти по ссылке или нажать на кнопку, после чего страница откроется в новом окне.
  • Открыть диалоговое окно “Печать” браузера.
  • Нажать на кнопку “Печать”.
  • Закрыть страницу после отправки на принтер.

Это 10 – 30 секунд до отправки задания на принтер, в зависимости от сноровки оператора и скорости загрузки страниц. Непозволительно много в рамках бизнес-процесса.

Хуже: поскольку принтер этикеток не может быть принтером по умолчанию, к вышеописанным шагам добавлялся еще один — выбор принтера из списка. Это не просто несколько лишних секунд, возрастает вероятность ошибки. Если наклейка распечатана на обычном офисном принтере — нужно встать, достать испорченный лист из принтера и отправить в корзину, а процесс повторить сначала.

Если Вам нужно 10-50 наклеек в день, стандартного механизма печати может быть вполне достаточно.
А что если вам нужно минимум 500 наклеек в день, и печать наклейки прерывает бизнес-процесс, который сотрудник выполняет “на потоке”? Тогда 30 секунд на одну наклейку превращаются в 2-4 часа рабочего времени! Без учета ошибок, которые на потоке обязательно будут возникать.

Напомню наши основные условия:

  1. Команда на печать отправляется из веб-приложения.
  2. Печать не должна требовать активных действий пользователя, никаких диалогов. Максимум один клик.
  3. Высокая скорость передачи задания принтеру.

О стандартном подходе к печати из браузера можно забыть.
Собственно, первое требование предполагало работу с подсистемой печати ОС напрямую. Что, увы, невозможно решить, не прибегая к разработке дополнительного софта для операционной системы.

Что должен уметь наш софт? В общем-то, не так уж много:

  • получение страницы для печати;
  • передача задания принтеру.

Понятно, что сервер не может контактировать программу напрямую для передачи данных, ведь она выполняется на клиентском компьютере, а сервер ничего про это не знает. И средствами javascript невозможно запустить иное приложение, так как код выполняется в адресном пространстве браузера.

Решение пришло в виде использования собственного URL-протокола (custom protocol handler). Для заданного названия протокола в операционной системе регистрируется определенная программа-обработчик. Когда Вы переходите по ссылке, содержащей этот протокол, браузер запускает связанную программу и передает ей параметры запроса.

Например, если у Вас установлен Skype, то после открытия такой ссылки (например, skype:echo123?call) автоматически начнется звонок в службу поддержки Skype.

Итак. Пишем программу, которая при установке регистрирует на себя определенный протокол. В веб-приложении создаем ссылки, используя этот протокол — так мы передаем данные нашей программе для печати.
Основная задача решена. Остаются два момента: передача шаблона наклейки и штрих-кода.

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

Штрих-код в запросе мы не передаем, его создает сама программа с помощью специальной библиотеки, передаются только данные для кодирования.

Таким образом:

  1. Программа для печати при установке регистрирует определенный протокол.
  2. С помощью этого протокола веб-приложение передает данные программе. Я навесил вызов на кнопку, завершающую процесс приемки нового товара. Завершение процесса все равно нужно фиксировать, то есть печать вообще не требует дополнительных действий пользователя.
  3. В массиве передаваемых данных указан шаблон и его версия, приложение может загрузить актуальную версию с сервера.
  4. Программа создает штрих-код на основе переданных ей данных.
  5. Программа рендерит html-шаблон, подставляет туда данные из запроса и сгенерированный штрих-код, после чего отправляет задание на печать. Принтер указывается при первом запуске программы. Изменить потом, разумеется, можно.

Печать после нажатия кнопки начинается практически мгновенно. И, разумеется, программа для печати работает без открытия каких-либо окон.

Все предъявленные требования соблюдены. Печать не прерывает бизнес-процесс, выполняется достаточно быстро, и полностью прозрачно для пользователя.

Задача выполнена.

Наша программа для печати написана на C++ с использованием фреймворка Qt.
Для генерации штрих-кода используется zint.

решение backend WMS