Создание изображений штрих-кодов на PHP: библиотеки и самописные решения

Раздел: Обработка изображений -> Графика

Основные способы генерации штрих-кодов в PHP

Какое решение наиболее эффективно для создания штрих-кодов на PHP?

Самым простым и функциональным способом является использование специализированной библиотеки, например picqer/php-barcode-generator. Она поддерживает популярные форматы (Code128, EAN-13, UPC-A, Codabar и другие), автоматически рассчитывает контрольные суммы и не требует внешних расширений, кроме GD для вывода изображений.

Установка через Composer:

composer require picqer/php-barcode-generator

Php штрих код (штрих-код на php)

Пример генерации кода Code128 и сохранения в PNG:


<?php
require 'vendor/autoload.php';

use Picqer\Barcode\BarcodeGeneratorPNG;

$generator = new BarcodeGeneratorPNG();
$barcode = $generator->getBarcode('ABC-123', $generator::TYPE_CODE_128);

// Сохранение в файл
file_put_contents('barcode.png', $barcode);

// Или вывод в браузер
header('Content-Type: image/png');
echo $barcode;
?>
    

Qr кода php (qr код на php)

Для EAN-13 достаточно передать 12 цифр (13-я контрольная рассчитывается автоматически):


$barcode = $generator->getBarcode('590123456789', $generator::TYPE_EAN_13);
    

Типичная ошибка: при передаче недопустимых символов для выбранного типа Code128 выбросится исключение. Решение - предварительно проверять строку или использовать тип Code128A (только заглавные буквы и цифры), Code128B (все ASCII, кроме управляющих) или Code128C (только четное количество цифр).

Если изображение слишком маленькое или большое, настройте ширину и высоту через параметры метода getBarcode (например, третий параметр - ширина модуля в пикселях, четвертый - высота).

Как создать штрих-код средствами встроенной библиотеки GD без внешних пакетов?

Этот вариант подходит, когда нет возможности устанавливать Composer или нужен полный контроль над изображением. Реализация основана на рисовании вертикальных полос по алгоритму конкретного формата. Приведем пример для Code39 (простейший самосинхронизирующийся код).


<?php
function generateCode39($data) {
    $alphabet = [
        '0' => '101001101101', '1' => '110100101011', '2' => '101100101011',
        // ... полная таблица опущена для краткости
        '*' => '100101101101'
    ];
    $data = strtoupper($data);
    $code = $alphabet['*'];
    for ($i = 0; $i < strlen($data); $i++) {
        $code .= '0' . $alphabet[$data[$i]];
    }
    $code .= '0' . $alphabet['*'];

    $widthPerModule = 2;
    $height = 60;
    $imgWidth = strlen($code) * $widthPerModule;
    $img = imagecreate($imgWidth, $height);
    $white = imagecolorallocate($img, 255, 255, 255);
    $black = imagecolorallocate($img, 0, 0, 0);

    $x = 0;
    for ($i = 0; $i < strlen($code); $i++) {
        if ($code[$i] == '1') {
            imagefilledrectangle($img, $x, 0, $x + $widthPerModule - 1, $height - 1, $black);
        }
        $x += $widthPerModule;
    }
    return $img;
}

header('Content-Type: image/png');
imagepng(generateCode39('TEST'));
imagedestroy($img);
?>
    

Проблема: для сложных форматов (EAN-128, Code128) требуется реализация конечного автомата, что увеличивает объем кода. Рекомендуется использовать только для учебных целей или поддержки очень простых кодов (Code39, Codabar).

Как сгенерировать векторный штрих-код в формате SVG?

SVG даёт возможность масштабировать штрих-код без потери качества. Библиотека picqer/php-barcode-generator содержит генератор SVG. Использование:


<?php
use Picqer\Barcode\BarcodeGeneratorSVG;

$generator = new BarcodeGeneratorSVG();
$barcode = $generator->getBarcode('ABC-123', $generator::TYPE_CODE_128);
echo $barcode;
?>
    

Результат - строка с тегами <svg>, которую можно вставлять прямо в HTML. Дополнительно можно управлять цветом через параметры (например, $color - массив RGB).

Ошибка: при вставке SVG в HTML некоторые браузеры блокируют внешние ресурсы, но если SVG полностью inline, проблем не возникает.

Как распознать штрих-код из готового изображения?

Для обратной задачи - чтения штрих-кода - можно использовать утилиту zbarimg (из пакета ZBar) через exec или библиотеку php-barcode-2d. Второй вариант работает на чистом PHP и поддерживает Code128, EAN-13, QR-Code и другие.

Установка: composer require kaspi/php-barcode-2d


<?php
require 'vendor/autoload.php';

use BarcodeBakery\Barcode\BCGcode128;
use BarcodeBakery\Barcode\BCGReading;

$reader = new BCGReading();
$result = $reader->read('barcode.png');
echo 'Распознанный текст: ' . $result;
?>
    

Проблемы: качество распознавания сильно зависит от чёткости изображения и отсутствия помех. Для надёжности рекомендуется предварительная обработка изображения (бинаризация, фильтр шумов).

Расширенные примеры работы со штрих-кодами

Ниже приведены нестандартные сценарии, которые могут потребоваться при интеграции штрих-кодов в реальные проекты.

Пример 1. Генерация нескольких штрих-кодов на одном изображении (этикетка с двумя кодами)

Используем библиотеку picqer/php-barcode-generator для создания отдельных PNG и объединения их с помощью GD:

Пример

<?php
require 'vendor/autoload.php';
use Picqer\Barcode\BarcodeGeneratorPNG;

$generator = new BarcodeGeneratorPNG();
$barcode1 = $generator->getBarcode('123456', $generator::TYPE_CODE_128, 2, 50);
$barcode2 = $generator->getBarcode('ABCDEF', $generator::TYPE_CODE_128, 2, 50);

$im1 = imagecreatefromstring($barcode1);
$im2 = imagecreatefromstring($barcode2);

$width = max(imagesx($im1), imagesx($im2));
$height = imagesy($im1) + imagesy($im2) + 20;
$canvas = imagecreatetruecolor($width, $height);
imagefill($canvas, 0, 0, imagecolorallocate($canvas, 255, 255, 255));

imagecopy($canvas, $im1, 0, 0, 0, 0, imagesx($im1), imagesy($im1));
imagecopy($canvas, $im2, 0, imagesy($im1) + 20, 0, 0, imagesx($im2), imagesy($im2));

header('Content-Type: image/png');
imagepng($canvas);
imagedestroy($im1); imagedestroy($im2); imagedestroy($canvas);
?>

Результат: одно изображение с двумя отдельными штрих-кодами.

Пример 2. Штрих-код с пользовательским цветом и подписью

Можно модифицировать BarcodeGeneratorPNG, передавая массив RGB в качестве четвёртого параметра (цвет черных полос). Кроме того, средствами GD добавляется текст.

Пример

<?php
require 'vendor/autoload.php';
use Picqer\Barcode\BarcodeGeneratorPNG;

$generator = new BarcodeGeneratorPNG();
$barcode = $generator->getBarcode('590123456789', $generator::TYPE_EAN_13, 2, 50, [0, 102, 204]); // синий цвет

$im = imagecreatefromstring($barcode);
$black = imagecolorallocate($im, 0, 0, 0);
$font = 'arial.ttf'; // Убедитесь, что шрифт доступен
imagettftext($im, 10, 0, 10, 60, $black, $font, 'Товар №1');

header('Content-Type: image/png');
imagepng($im);
?>

Пример 3. Генерация Code128 с выбором подтипа (A, B, C)

Библиотека picqer позволяет явно указать подтип. Это полезно для кодирования только цифр (подтип C уменьшает плотность).

Пример

<?php
require 'vendor/autoload.php';
use Picqer\Barcode\BarcodeGeneratorPNG;

$generator = new BarcodeGeneratorPNG();
// Code128C (только четное количество цифр)
$barcode = $generator->getBarcode('12345678', $generator::TYPE_CODE_128_C);
header('Content-Type: image/png');
echo $barcode;
?>

Результат: более компактный штрих-код для последовательности цифр (каждая пара цифр кодируется одним символом).

Пример 4. Распознавание штрих-кода через внешнюю утилиту (zbarimg)

На сервере можно использовать вызов командной строки, если установлен пакет zbar-tools.

Пример

<?php
$imagePath = '/tmp/test.png';
$output = shell_exec("zbarimg --quiet --raw $imagePath 2>&1");
echo htmlspecialchars($output);
?>

Пример вывода: 1234567890128 (код EAN-13).

Ошибка: если zbarimg не установлен или нет прав, команда вернёт пустую строку. Проверяйте через which zbarimg и обрабатывайте ошибки.

Штрих-код на PHP - comments

En
Php штрих код (php)