Tạo mã QR code với PHP và qrencode

Bài viết dưới đây hướng dẫn tạo mã QR (QR code) rất đơn giản bằng PHP trên Debian Linux server.

Dùng library tc-lib-barcode

Ta sẽ sử dụng thư viện PHP tc-lib-barcode để tạo mã QR nói riêng hoặc nhiều loại mã vạch khác nói chung.

Chuẩn bị môi trường

Tải về tc-lib-barcode với composer.

cd ~/public_html
mkdir qr
cd qr/
composer require tecnickcom/tc-lib-barcode ^1.15 

Mã nguồn chương trình

qr/index.php

<?php
require_once __DIR__ . '/vendor/autoload.php';

// instantiate the barcode class
$barcode = new \Com\Tecnick\Barcode\Barcode();

$content = $_GET['content'] or die('No content');
$type = isset( $_GET['type'] ) ? strtoupper( $_GET['type'] ) : "PNG";

// generate a barcode
$bobj = $barcode->getBarcodeObj(
        'QRCODE,H',                 // barcode type and additional comma-separated parameters
        $content,                   // data string to encode
        -4,                         // bar width (use absolute or negative value as multiplication factor)
        -4,                         // bar height (use absolute or negative value as multiplication factor)
        'black',                    // foreground color
        array(-2, -2, -2, -2)       // padding (use absolute or negative values as multiplication factors)
    )->setBackgroundColor('white'); // background color

switch ( $type ) {
    case "PNG":
        $bobj->getPng();
        break;

    case "SVG":
        $bobj->getSvg();
        break;

    default:
        echo "Unsupported type";
}
?>

Dùng phần mềm Zint

Zint Barcode Generator là một công cụ tạo mã vạch rất mạnh và portable. Phần mềm dành cho Windows với GUI trên nền tảng Qt hoặc dòng lệnh. Mã nguồn bằng ngôn ngữ C++ biên dịch được cho Linux.

Cài đặt môi trường

Tải mã nguồn Zint về rồi biên dịch bằng GCC.

git clone https://git.code.sf.net/p/zint/code zint
cd zint/
mkdir build
cd build
cmake ..
make
sudo make install

Mã nguồn PHP gọi tới zint

qr/index.php

<?php
$content = $_GET["content"] or die("No content");
$type = isset( $_GET["filetype"] ) ? strtoupper( $_GET["filetype"] ) : "PNG";
$args = array( "--direct", "--barcode=58" /* QR code */ );

$arg_names = array( "filetype" );

foreach ( $arg_names as $name ) {
    if ( isset( $_GET[$name] ) )
        $args[] = empty( $_GET[$name] )
                ? "--{$name}"
                : "--{$name}={$_GET[$name]}";
}

switch ($type) {
    case "PNG":
        header("Content-type: image/png");
        break;

    case "SVG":
        header("Content-type: image/svg+xml");
        break;

    default:
        echo "Unsupported type";
        exit;
}

// Execute qrcode command to generate the QR image data
passthru( "zint " . implode( " ", $args ) . " -d '" . addslashes( $content ) . "'", $error );
if ( $error !== 0 ) {
    $name = "images/invalid.png";
    $fp = fopen($name, "rb");
    header("Content-type: image/png");
    fpassthru($fp);
}
?>

Dùng phần mềm qrencode

QREncode phát triển bởi Kentaro Fukuchi được phát triển rất lâu đời (2006), chuyên biệt cho QR code. Vì vậy đây là lựa chọn số 1 cho việc tạo mã QR. QREncode được viết bằng C++ và có thư viện libqrencode để tích hợp với các app.

Chuẩn bị môi trường

Cài đặt gói qrencode trên server Debian Linux.

$ sudo apt-get install qrencode

Mã nguồn PHP gọi qrencode

Mã nguồn sau là wrapper bằng PHP cho lệnh qrencode. Chương trình nhận các cấu hình mã QR từ GET parameter và render ra mã QR dưới nhiều định dạng.

qr/index.php

<?php
$content = $_GET['content'] or die('No content');
$type = isset( $_GET['type'] ) ? strtoupper( $_GET['type'] ) : "PNG";
$args = array();

$arg_names = array( 'type', 'size', 'level', 'margin', 'dpi', 'symversion', 'structured', 'kanji', 'micro' );

foreach ( $arg_names as $name ) {
    if ( isset( $_GET[$name] ) )
        $args[] = empty( $_GET[$name] )
                ? "--{$name}"
                : "--{$name}={$_GET[$name]}";
}

switch ($type) {
    case "PNG":
        header("Content-type: image/png");
        break;

    case "SVG":
        header("Content-type: image/svg+xml");
        break;

    default:
        echo "Unsupported type";
        exit;
}

// Execute qrcode command to generate the QR image data
passthru( "qrencode " . implode( " ", $args ) . " -o - '" . addslashes( $content ) . "'", $error );
if ( $error !== 0 ) {
    $name = 'images/invalid.png';
    $fp = fopen($name, 'rb');
    header("Content-type: image/png");
    fpassthru($fp);
}
?>

Cách dùng

Các tham số có thể truyền qua GET parameters:

ParameterMô tảMặc định
contentNội dung được nhúng trong mã QR (bắt buộc)
typeĐịnh dạng đầu ra (PNG, EPS, SVG, ANSI, ANSI256, ASCII, ASCIIi, UTF8, ANSIUTF8)PNG
sizeKích thước module bằng pixel3px
levelMức sửa lỗi (L, M, Q, H)L
marginKích thước đường biên bao ngoài bằng pixel.4px
dpiKích thước DPI của ảnh PNG.72
symversionPhiên bản QR (1 – 40 với QR, hoặc 1 – 4 với Micro QR)
Tham khảo thêm tại ĐÂY
auto
structuredTạo structured-append symbol (chia content vào nhiều mã QR), yêu cầu phải chỉ định symversion. Định dạng này không hỗ trợ Micro QR.false
kanjiNội dung có chứa Hán tự.false
microMã QR kích thước nhỏ (Micro QR).false

Hướng dẫn sử dụng

Ví dụ sử dụng qr/index.php để tạo QR code cho URL bài viết này.

<img src="qr/index.php?content=https://icreativ.pro/tao-qr-code-bang-php-qrencode" />