Мне нужно было напечатать 300 QR-кодов с подписями. Оказалось, что бесплатно это не делает почти никто
Началось с бытовой задачи: понадобился лист QR-кодов с подписями, по коду на каждую позицию. Открываю первый попавшийся генератор: коды делаются по одному, скачивание PNG, на бесплатном тарифе водяной знак. Второй: пакетная генерация есть, но тысяча кодов в день и дальше платно. Третий: вроде бесплатно, а при сканировании ссылка сначала бежит через их домен, и после окончания триала все напечатанные коды умрут.
Так я узнал, что «бесплатный генератор QR-кодов» это обычно рекламный заголовок, а не описание продукта. И сделал свой. Он называется Ку-Ку Код (qqkod.ru), и в этом посте я расскажу, что внутри и какие грабли встретились по дороге.
Что делает сервис
Одну вещь: превращает список данных в готовые к печати листы с QR-кодами.
Вставляете список ссылок, по одной на строку, или перетаскиваете файл: TXT, CSV, Excel. Сервис проверяет каждую строку, показывает отчет об ошибках с номерами, раскладывает коды сеткой по листам и отдает файл. До 1500 кодов за запуск.
Под каждым кодом печатается подпись из второй колонки файла: «Стол 5», «Стеллаж 12», артикул. Звучит мелочью, но именно подписи отличают рабочий тираж от лотереи «какой код от какого стеллажа».
Кроме ссылок кодируются телефоны, SMS, произвольный текст, Wi-Fi (телефон сам предлагает подключиться к сети) и визитки vCard. На выходе PDF для печати, векторный SVG для типографии или ZIP с отдельным PNG на каждый код.
Технические решения, которыми доволен
Только статические коды. В код зашивается ровно то, что вы ввели, без редиректов через мой домен. Это осознанный отказ от «динамических QR» с их статистикой: динамический код живет, пока жив сервис-посредник и оплачена подписка. Напечатанная на упаковке ссылка не должна зависеть от моего аптайма.
Вектор насквозь. Генерация SVG-первая: внутри файла геометрия модулей, пиксели в процессе вообще не участвуют. Поэтому один и тот же файл печатается и наклейкой 2 см, и плакатом, без мыла на границах.
Логотип без риска. Логотип в центре кода автоматически включает максимальный уровень коррекции ошибок, а его размер ограничен четвертью стороны. Сломать код загрузкой логотипа не получится. SVG-логотипы не принимаются сознательно: инлайн-вектор в превью это готовая XSS-дыра, растрируйте в PNG.
Проверка контраста. Цвета кода и фона настраиваются, но сервис считает контраст по WCAG и не даст сделать светло-желтый код на белом: камера такое не читает, а пользователь узнал бы об этом после печати тиража.
Грабли
Кириллические домены. Хотелось, чтобы «пример.рф/меню» работал без ручного ввода схемы и чтобы камера показывала человеку кириллицу вместо punycode. Валидация через punycode, в код уходит юникодная форма: звучит просто, отладка заняла вечер.
Числовые ячейки Excel. Телефон 79991234567 в числовой ячейке Excel при наивном чтении превращается в 7,99912E+10. Пришлось добираться до исходных значений ячеек в обход отображаемых.
Кириллица в PDF. Библиотека, которая рендерит SVG в PDF, молча превращала кириллические подписи в вопросики. Решение: подписи в PDF рисуются отдельным проходом юникодным шрифтом поверх векторного листа, с теми же координатами из расчета сетки.
Что дальше
Сервис бесплатный и останется таким: без регистрации, водяных знаков и дневных лимитов. Экономика простая: генерация дешевая, а нишевому инструменту важнее пользователи, чем ранняя монетизация.
Из ближайшего: пресеты параметров, ссылки на преднастроенную форму и публичный API без ключей. Если у вас есть сценарий, под который сервиса не хватает, расскажите в комментариях: роадмап живой, самые частые запросы уезжают в работу первыми.
Попробовать: qqkod.ru