cruide / qrcode-native-php
Pure PHP QR code generator: no external services, no dependencies. Product/inventory labeling oriented.
v1.0.0
2026-08-08 21:38 UTC
Requires
- php: >=8.0
Suggests
- ext-gd: Required for PNG rendering (SVG and text renderers work without it)
README
Alexander Tischenko — http://alex-tisch.ru
Генерация QR-кодов на чистом PHP — без сторонних сервисов и без зависимостей.
Основной сценарий — маркировка товаров и складских единиц: название, артикул, UUID, дата прихода, комментарий. Подходит для печати этикеток (SVG — векторный, даёт чёткий отпечаток при любом размере).
Возможности
- Полная реализация ISO/IEC 18004: версии 1–40, уровни коррекции L/M/Q/H
- Байтовый режим кодирования — UTF-8 (кириллица) работает «из коробки»
- Reed–Solomon, интерливинг блоков, автовыбор версии и лучшей маски
- Рендер: SVG (всегда), PNG (нужен ext-gd), текст/терминал, data-URI
- Ноль зависимостей, PHP >= 8.0
- Только кодирование (декодирования нет)
Установка
composer require cruide/qrcode-native-php
Быстрый старт
use Cruide\QrCode\QrCode; $qr = QrCode::make('https://kengois.ru'); echo $qr->toText(); // просмотр в терминале $qr->saveSvg('code.svg'); // вектор для печати $qr->savePng('code.png', 480); // растр (нужен GD) $html = '<img src="' . $qr->toDataUri() . '">';
Этикетка товара
use Cruide\QrCode\ErrorCorrection; use Cruide\QrCode\ProductLabel; use Cruide\QrCode\QrCode; $label = ProductLabel::make() ->name('Краска фасадная белая, 10 л') ->article('KR-1024') ->uuid('9f1c8a2e-4b7d-4e6a-9c3f-2d5a8b1c0e42') ->arrivedAt(new DateTimeImmutable('2026-08-08')) // или строку '2026-08-08' ->comment('Партия №5, склад Б') ->extra(['BATCH' => '2026-31', 'BIN' => 'B-14-03']); // доп. поля $qr = QrCode::make($label)->setEcLevel(ErrorCorrection::M); $qr->saveSvg('label.svg', moduleSize: 6);
Содержимое QR (формат по умолчанию — строки KEY:значение):
NAME:Краска фасадная белая, 10 л
## ART:KR-1024
UUID:9f1c8a2e-4b7d-4e6a-9c3f-2d5a8b1c0e42
## IN:2026-08-08
NOTE:Партия №5, склад Б
## BATCH:2026-31
## BIN:B-14-03
Форматы полезной нагрузки
$label->format(ProductLabel::FORMAT_LINES); // KEY:значение, по строке на поле $label->format(ProductLabel::FORMAT_JSON); // {"NAME":"...","ART":"..."} $label->format(ProductLabel::FORMAT_CSV); // значение|значение|значение... $label->csvDelimiter(';'); // свой разделитель для CSV $label->keys(['name' => 'ТОВАР']); // переопределить имена ключей
Настройки генерации
$qr = QrCode::make($payload) ->setEcLevel(ErrorCorrection::H) // L/M/Q/H, по умолчанию M ->setMinVersion(3) // минимальная версия (единый размер этикеток) ->setMask(4); // фиксированная маска вместо автоподбора
| Уровень | Восстановление | Когда использовать |
|---|---|---|
| L | ~7% | максимум данных, чистые условия |
| M | ~15% | по умолчанию |
| Q | ~25% | транспортировка |
| H | ~30% | царапающиеся/грязные этикетки |
Ёмкость (байты, версия 40): L — 2953, M — 2331, Q — 1663, H — 1273.
API
| Метод | Описание |
|---|---|
QrCode::make($payload) |
создать генератор (строка или ProductLabel) |
setEcLevel(string) |
уровень коррекции L/M/Q/H |
setMinVersion(?int) |
минимальная версия 1–40 |
setMask(?int) |
маска 0–7 |
toSvg($moduleSize=8, $quietZone=4, $fg, $bg) |
SVG-строка |
toPng($width=512, $quietZone=4) |
бинарный PNG (GD) |
toText($quietZone=2, $invert=false) |
Unicode-превью |
toDataUri() |
SVG в виде data-URI |
saveSvg($path, ...), savePng($path, ...) |
запись в файл |
getMatrix(), getSize(), getVersion(), getMask() |
интроспекция |
Проверка
composer dump-autoload
php tests/structural.php # структурные тесты без PHPUnit
php examples/product_label.php
Как это работает
- Данные кодируются в байтовом режиме (индикатор
0100, длина, байты UTF-8, терминатор, пад-байты0xEC/0x11). - Подбирается минимальная версия, поток разбивается на RS-блоки, для каждого считаются коды коррекции (GF(256), полином 0x11D), блоки интерливируются.
- Строится матрица: поисковые паттерны, тайминг, выравнивание, служебная информация (формат/версия, BCH), данные размещаются зигзагом.
- Примеряются 8 масок, выбирается минимальный штраф по четырём правилам.
Лицензия
MIT