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

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

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

Ранее для печати мы использовали стандартный интерфейс браузера (Файл – Печать), этого было достаточно. Единственное усовершенствование: при загрузке страниц вызывался метод 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.

This entry was posted in Программирование, Технологии and tagged . Bookmark the permalink.

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

  1. Александр Александр says:

    Добрый день!
    Прочитал интересную статью на Вашем сайте. Но к сожалению так и не нашел где скачать такую программу, о которой пишется в статье.
    Могли бы вы прислать ссылку на закачку?

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

      • Александр Александр says:

        А на каком языке написана эта программа? И можете ли Вы дать исходники?

      • Тут написано про язык: С++, framework Qt.
        Про исходники, извините, но нет, конечно.
        Если бы мы предполагали распространение, то выложили бы на гитхабе, как оперсорс.

  2. Денис Денис says:

    Добрый день, нужно написать такую же программу для нас – требования те же, в принципе вообще все то же самое. Какова стоимость разработки или адаптации описанного решения под нас?

    С уважением,

    Денис

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

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*

*


Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>