Привет, Хабр! ?

Меня зовут Данил, и сегодня я расскажу про свой проект — 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/Barcode
Форма после генерации QR-Codes
Форма после генерации QR-Codes
Форма для работы с штрихкодами
Форма для работы с штрихкодами
Результат генерации штрихкодов
Результат генерации штрихкодов
Результат генерации 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 или хотите поддержку новых форматов — напишите в комментарии. Буду рад фидбэку!

Комментарии (2)


  1. Adgh
    25.06.2025 05:40

    Напрашивается поддержка SVG, и вынос логики в отдельную подключаемую библиотеку)


    1. nigdanil Автор
      25.06.2025 05:40

      Согласен полностью с Вами! Хочу постепенно довести до того что написал terryburton (Barcode Writer in Pure PostScript)