- Регистрация
- 23 Август 2023
- Сообщения
- 2 825
- Лучшие ответы
- 0
- Реакции
- 0
- Баллы
- 51
Offline
Привет, Хабр! 👋
Меня зовут Данил, и сегодня я расскажу про свой проект — DotPlus.
Это кроссплатформенное настольное приложение на Rust для генерации QR и штрихкодов в офлайн-режиме, без браузеров, API и регистрации. Оно поддерживает как графический, так и консольный интерфейс, и работает с CSV-файлами для пакетной генерации.
🔧 Зачем это нужно?
Проект появился из личной необходимости: нужно было быстро и массово генерировать QR- и штрихкоды для логистики — без сторонних сервисов и вручную через Excel. Существующие решения часто:
Поэтому было решено сделать полностью офлайн-решение, которое:
DotPlus состоит из двух независимых интерфейсов:
Оба интерфейса используют общее ядро, которое отвечает за парсинг, генерацию кодов и экспорт изображений.
# Пример CLI
@echo off
cd /d "%~dp0"
dot-plus.exe ^
--mode barcode ^
--csv "%~dp0examples\magnit\data\barcode\magnit-barcodes-EAN-13.csv" ^
--output "%~dp0examples\magnit\img\barcode" ^
--barcode-type EAN-13 ^
--cols 3 ^
--rows 4 ^
--width 300 ^
--height 100 ^
--font-size 22 ^
--label-height 40 ^
--offset-y 10 ^
--spacing-x 20 ^
--spacing-y 20
📦 Используемые библиотеки
🧱 Компонентная схема
📄 Как всё работает
1. CSV-файл на входе:
content
A123456A
D123456D
id,name,url 1,Продукт A,https://example.com/a 2,Продукт B,https://example.com/b
2. Генерация кодов
В зависимости от настроек, приложение создаёт QR или штрихкоды для каждого ряда. Поддерживаются подписи, логотипы и кастомная вёрстка.
3. Экспорт
На выходе получаем PNG-файлы (или PDF — в будущих версиях). Пример можно сразу отправить на печать на термопринтер или бумажный лист.
⚙️ CLI-интерфейс
CLI реализован вручную — без clap, но с полноценной поддержкой параметров, включая размеры сетки, шрифты и логотипы.
let csv_path = args.iter().position(|a| a == "--csv")
.and_then(|i| args.get(i + 1))
.ok_or("❗ Missing --csv argument")?;
let output_dir = args.iter().position(|a| a == "--output")
.and_then(|i| args.get(i + 1))
.ok_or("❗ Missing --output argument")?;
// далее — логика обработки
Это позволяет использовать .bat или .sh скрипты для пакетной генерации.
🖼️ Скриншоты
Форма выбора QR/Barcode
Форма после генерации QR-Codes
Форма для работы с штрихкодами
Результат генерации штрихкодов
Результат генерации QR-codes
💡 Почему именно Rust?
Несколько причин:
Проект не является open-source — он создавался как практическое приложение под конкретные задачи, и пока код не планируется к публикации.
Тем не менее:
Если вам интересны детали реализации PNG, логики CLI или хотите поддержку новых форматов — напишите в комментарии. Буду рад фидбэку!
Меня зовут Данил, и сегодня я расскажу про свой проект — DotPlus.
Это кроссплатформенное настольное приложение на Rust для генерации QR и штрихкодов в офлайн-режиме, без браузеров, API и регистрации. Оно поддерживает как графический, так и консольный интерфейс, и работает с CSV-файлами для пакетной генерации.
🔧 Зачем это нужно?
Проект появился из личной необходимости: нужно было быстро и массово генерировать QR- и штрихкоды для логистики — без сторонних сервисов и вручную через Excel. Существующие решения часто:
требуют подключения к интернету,
не поддерживают кириллицу или нестандартные поля,
не позволяют работать из командной строки.
Поэтому было решено сделать полностью офлайн-решение, которое:
запускается как .exe без установки,
обрабатывает CSV-файлы,
экспортирует результат в PNG,
поддерживает массовую генерацию.
DotPlus состоит из двух независимых интерфейсов:
GUI — визуальный редактор на egui, с предпросмотром и настройкой параметров,
CLI — запуск через терминал с аргументами и пакетной обработкой.
Оба интерфейса используют общее ядро, которое отвечает за парсинг, генерацию кодов и экспорт изображений.
# Пример CLI
@echo off
cd /d "%~dp0"
dot-plus.exe ^
--mode barcode ^
--csv "%~dp0examples\magnit\data\barcode\magnit-barcodes-EAN-13.csv" ^
--output "%~dp0examples\magnit\img\barcode" ^
--barcode-type EAN-13 ^
--cols 3 ^
--rows 4 ^
--width 300 ^
--height 100 ^
--font-size 22 ^
--label-height 40 ^
--offset-y 10 ^
--spacing-x 20 ^
--spacing-y 20
📦 Используемые библиотеки
Компонент | Библиотека | Назначение |
---|---|---|
GUI | egui, eframe | Кроссплатформенный интерфейс |
Диалоги | rfd | Файловые open/save-диалоги |
Чтение CSV | csv | Парсинг входных данных |
QR-коды | qrcode | Генерация кодов с поддержкой UTF-8 |
Штрихкоды | barcoders | EAN-13, EAN-8, Code 39, 93, Codabar |
Работа с PNG | image, imageproc | Отрисовка кодов, вставка логотипов |
Настройки | rust-ini | Конфигурация шаблонов и пользовательских параметров |
Утилиты | uuid, chrono, sanitize-filename, anyhow и др. | Стабильность, логгинг, имена файлов |
🧱 Компонентная схема

📄 Как всё работает
1. CSV-файл на входе:
content
A123456A
D123456D
id,name,url 1,Продукт A,https://example.com/a 2,Продукт B,https://example.com/b
2. Генерация кодов
В зависимости от настроек, приложение создаёт QR или штрихкоды для каждого ряда. Поддерживаются подписи, логотипы и кастомная вёрстка.
3. Экспорт
На выходе получаем PNG-файлы (или PDF — в будущих версиях). Пример можно сразу отправить на печать на термопринтер или бумажный лист.
⚙️ CLI-интерфейс
CLI реализован вручную — без clap, но с полноценной поддержкой параметров, включая размеры сетки, шрифты и логотипы.
let csv_path = args.iter().position(|a| a == "--csv")
.and_then(|i| args.get(i + 1))
.ok_or("❗ Missing --csv argument")?;
let output_dir = args.iter().position(|a| a == "--output")
.and_then(|i| args.get(i + 1))
.ok_or("❗ Missing --output argument")?;
// далее — логика обработки
Это позволяет использовать .bat или .sh скрипты для пакетной генерации.
🖼️ Скриншоты

Форма выбора QR/Barcode

Форма после генерации QR-Codes

Форма для работы с штрихкодами

Результат генерации штрихкодов

Результат генерации QR-codes
💡 Почему именно Rust?
Несколько причин:
Производительность и быстрый запуск (особенно при пакетной генерации)
Безопасность без garbage collector’а
Возможность объединения GUI и CLI на общей логике
Хорошая экосистема: image, qrcode, barcoders работают стабильно
Вёрстка в egui — ограниченные layout-возможности, особенно при попытке выстроить сетки и выравнивание по ячейкам. Пришлось писать свои обёртки и выравнивать вручную по координатам.
Кириллица и шрифты — egui и image не включают шрифты по умолчанию. Без явной загрузки TTF-шрифтов кириллица отображается некорректно или вовсе не рендерится.
PNG и логотипы — вставка логотипа в QR-код оказалась нетривиальной: важно правильно вырезать центральную часть, чтобы сохранить читаемость и не повредить структуру кода. Также пришлось реализовать масштабирование логотипа по маске.
Ручной CLI-парсинг — захотелось обойтись без внешних зависимостей вроде clap, но при большом количестве параметров это усложняет код и требует ручной валидации, особенно для опциональных и числовых значений.
Размеры выходных PNG — при генерации сетки из QR/штрихкодов на лист формата A4 возникли трудности с расчётом DPI, отступов, шрифтов и интервалов, особенно при экспорте для печати на термопринтерах.
Проект не является open-source — он создавался как практическое приложение под конкретные задачи, и пока код не планируется к публикации.
Тем не менее:
Бинарники доступны бесплатно — для личного, образовательного и некоммерческого использования.
Если вы хотите использовать DotPlus в коммерческом продукте, встраивать в процессы или распространять — напишите мне лично, я открыт к обсуждению.
Логистика: создание этикеток для посылок
Торговля: штрихкоды на товары, упаковку
Складской учёт и инвентаризация
Учебные проекты и распечатка QR для документов
GitHub: github.com/nigdanil/dotplus
Сайт: dot-plus.ru
Релизы: release-win
Поддержка Linux и Docker-билдов
Экспорт в PDF и другие форматы
Улучшенная верстка и шаблоны генерации
Если вам интересны детали реализации PNG, логики CLI или хотите поддержку новых форматов — напишите в комментарии. Буду рад фидбэку!