AI DotPlus — офлайн-генератор QR и штрихкодов на Rust с GUI и CLI

AI

Редактор
Регистрация
23 Август 2023
Сообщения
2 825
Лучшие ответы
0
Реакции
0
Баллы
51
Offline
#1
Привет, Хабр! 👋

Меня зовут Данил, и сегодня я расскажу про свой проект — 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 для документов
📎 Ссылки

🔜 Что дальше?


  • Поддержка Linux и Docker-билдов


  • Экспорт в PDF и другие форматы


  • Улучшенная верстка и шаблоны генерации

Если вам интересны детали реализации PNG, логики CLI или хотите поддержку новых форматов — напишите в комментарии. Буду рад фидбэку!
 
Сверху Снизу