Типография меряет заказ не в «файлах», а в страницах: какого формата лист, цветная страница или чёрно-белая, сколько на ней краски, печатать с двух сторон или с одной. Пока это считает человек — на каждый заказ уходит время, а на объёмном заказе ещё и накапливаются ошибки. PrintCalc появился как ответ именно на эту рутину.
Главное решение: файл разбирается в браузере
Самый очевидный путь — принять файл на сервер и разобрать его там. Я пошёл другим:
документ анализируется прямо в браузере у клиента, до всякой загрузки. За PDF отвечает
pdf.js, за растровые изображения — обычный Canvas.
Что это даёт на практике:
- Мгновенный результат. Смету видно ещё до того, как файл уедет на сервер — не нужно ждать очереди обработки.
- Нагрузка на сервере почти нулевая. Тяжёлый рендеринг страниц выполняет машина клиента, а их много, и каждая занята ровно одним документом.
- Меньше поводов для беспокойства о приватности. Если клиент просто прикидывает цену через публичный калькулятор, макет физически не обязан покидать его компьютер.
Что именно измеряется
По каждой странице собирается небольшой набор чисел, и именно он потом превращается в цену:
| Параметр | Как получается |
|---|---|
| Размер в миллиметрах | Из viewport страницы PDF, дальше — сопоставление с рядом A0…A6 и удлинёнными форматами вроде A3×4 |
| Цветность | Страница рендерится в canvas, пиксели проверяются на расхождение каналов RGB |
| Процент заливки | Доля небелых пикселей — «сколько краски» уйдёт на лист |
| Площадь | Нужна для нестандартных форматов, которые считаются по цене за м² |
На сервер уходит не сам разбор, а его результат — компактный JSON с метаданными страниц, плюс, если заказ оформляется всерьёз, сам файл для печати.
Цена собирается из прайса конкретной типографии
Прайс у каждой типографии свой, поэтому в системе он не зашит, а редактируется владельцем: четыре цены на формат (ч/б и цвет × обычная и плотная бумага), отдельные настройки для неизвестных форматов, фальцовки и переплёта.
Дальше поверх базовой цены накручиваются поправки. Страница с плотной заливкой стоит дороже — краска расходуется не поровну. Двусторонняя печать считается парами: лист один, и цена берётся по «дорогой» стороне. Удлинённые форматы умножаются на свой коэффициент. Всё это выглядит мелочью ровно до того момента, пока не начнёшь сверять итог с реальным счётом.
Правило, которое я держу в голове с самого начала: калькулятор должен давать ту же цифру, которую менеджер посчитал бы руками. Иначе им не будут пользоваться.
Стек — намеренно скучный
Node.js и Express на сервере, PostgreSQL, ванильный JavaScript на фронте. Ни сборки, ни фреймворка. Причина простая: проект я веду один, и через полгода перерыва в такой код возвращаешься за пять минут, а не за вечер. Плюс страницы отдаются мгновенно — для публичного калькулятора, который типография даёт своим клиентам, это важнее модности стека.
Что вокруг калькулятора
Со временем расчёт оброс всем, что нужно вокруг него: заказы и статусы, документы внутри заказа, склад материалов, статистика по выручке и форматам, командный доступ владелец/сотрудник. Отдельно живёт PrintAgent — десктопный агент, который забирает задание из веба и отправляет его на физический принтер, и мобильное приложение для Android.
Посмотреть можно на pcalc.pro — публичный калькулятор доступен без регистрации.
Все записи