cruide/qrcode-native-php

Pure PHP QR code generator: no external services, no dependencies. Product/inventory labeling oriented.

Maintainers

Package info

github.com/cruide/qrcode-native-php

pkg:composer/cruide/qrcode-native-php

Transparency log

Statistics

Installs: 0

Dependents: 0

Suggesters: 0

Stars: 0

Open Issues: 0

v1.0.0 2026-08-08 21:38 UTC

This package is auto-updated.

Last update: 2026-08-08 21:44:42 UTC


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

Как это работает

  1. Данные кодируются в байтовом режиме (индикатор 0100, длина, байты UTF-8, терминатор, пад-байты 0xEC/0x11).
  2. Подбирается минимальная версия, поток разбивается на RS-блоки, для каждого считаются коды коррекции (GF(256), полином 0x11D), блоки интерливируются.
  3. Строится матрица: поисковые паттерны, тайминг, выравнивание, служебная информация (формат/версия, BCH), данные размещаются зигзагом.
  4. Примеряются 8 масок, выбирается минимальный штраф по четырём правилам.

Лицензия

MIT