忍者ブログ

VB.NET-TIPS などプログラミングについて

VB.NETのTIPS(小技集)を中心に、Javascript、PHP その他のプログラミングについて少し役に立つ情報を発信します。いわゆる個人的な忘備録ですが、みなさんのお役に立てれば幸いです。

PHP TCPDFの二次元バーコード(QR-CODE)の表示方法について(write2DBarcodeメソッド)

今回は write2DBarcode メソッドを使って 二次元バーコード(QR-CODE) を表示する方法について説明します。

二次元バーコード といえばあの車部品メーカーで有名な DENSO が開発したバーコードです。 実際はバーコードでは無く2次元的な四角い領域に白黒のマスを描画して比較的長いテキストを表現できるものです。

開発した DENSOQR-CODE の特許をオープンしたため最初は工場などの管理のためのものでしたが、 最近はいろんなところで利用されています。 コードの中に URL を埋め込んでおいて、スマホからそれを読み取ってアクセスする等の利用が増えています。

ここで write2DBarcode メソッドの引数について説明を記します。

// write2DBarcodeメソッド
public function write2DBarcode($code, $type, $x=null, $y=null, $w=null, $h=null, 
                               $style=array(), $align='', $distort=false)
// $code    : 印刷するコード
// $type    : バーコードのタイプ("C39", "C93", "C138", "EAN13", "EAN8"など)
// $x       : X位置(指定されたユーザの単位)(NULL:カレントのX位置)
// $y       : Y位置(指定されたユーザの単位)(NULL:カレントのY位置)
// $w       : 横幅(指定されたユーザの単位)(NULL:カレントのX位置から用紙出力の横幅MAXまで)
// $h       : 縦幅(指定されたユーザの単位)(NULL:カレントのX位置から用紙出力の縦幅MAXまで)
// $style   : 出力オプションを配列で指定
//            $style['border']:boolean:trueでボーダー出力
//            $style['padding']:int:バーコード周囲の余白('auto':自動設定)
//            $style['hpadding']:int:水平方向の余白('auto':自動設定)
//            $style['vpadding']:int:垂直方向の余白('auto':自動設定)
//            $style['fgcolor']:color array:バーと文字色
//            $style['bgcolor']:color mixed:背景色(falseであれば、透明)
//            $style['module_width']: width of a single module in points
//            $style['module_height']: height of a single module in points
//            $style['position']:string:ページにおけるバーコードの位置:
//                ['L']: 左マージン
//                ['C']: 中央揃え
//                ['R']: 右マージン
//                ['S']: ストレッチ
// $align    :string:ページにおけるバーコードの位置:
//                ['T']: top-right
//                ['M']: middle-right
//                ['B']: bottom-right
//                ['N']: next line
// $distort   :boolean:trueで幅と高さをフィットとさせる
//                (それ以外はアスペクト比を維持する)




それでは write2DBarcode メソッドを使用したバーコードの表示の簡単な例を以下に記します。

write2DBarcode メソッドを使用したバーコードの表示

以下の例では QRCODEレベル L, レベル M, レベル Q, レベル H のバーコードを表示しています。

<?php
require_once('../tcpdf/tcpdf.php');

// クラス生成
$pdf = new TCPDF();

// デフォルトで用意されている日本語フォント[小塚ゴシックPro M]
$strFont = "kozgopromedium";
// ヘッダ・フッタ出力設定(特にいらないが)
$pdf->setPrintHeader(false);
$pdf->setPrintFooter(false);
// 本文の日本語フォント[小塚ゴシックPro M]
$pdf->SetFont($strFont, "", 10);

// 新しいpdfページを追加
$pdf->AddPage();

$pdf->Write(0, '二元バーコード表示テスト', '', false, '', true);
$pdf->Ln();

// set style for barcode
$style = array(
	'border'        => true,        //ボーダー有
	'vpadding'      => 'auto',      //縦パディングAUTO
	'hpadding'      => 'auto',      //水平パディングAUTO
	'fgcolor'       => array(0,0,0),//テキスト・バー色(黒)
	'bgcolor'       => false,       //背景色指定無し
	'module_width'  => 1,           // width of a single module in points
	'module_height' => 1            // height of a single module in points
);

// 出力URL
$strURL = "https://www.yahoo.co.jp/";

// QRCODE,L : QR-CODE Low error correction 
$pdf->write2DBarcode($strURL, 'QRCODE,L', 20, 30, 50, 50, $style, 'N');
$pdf->Text(20, 25, 'QRCODE L');

// QRCODE,M : QR-CODE Medium error correction
$pdf->write2DBarcode($strURL, 'QRCODE,M', 80, 30, 50, 50, $style, 'N');
$pdf->Text(80, 25, 'QRCODE M');

// QRCODE,Q : QR-CODE Better error correction
$pdf->write2DBarcode($strURL, 'QRCODE,Q', 20, 90, 50, 50, $style, 'N');
$pdf->Text(20, 85, 'QRCODE Q');

// QRCODE,H : QR-CODE Best error correction
$pdf->write2DBarcode($strURL, 'QRCODE,H', 80, 90, 50, 50, $style, 'N');
$pdf->Text(80, 85, 'QRCODE H');

// pdf表示設定
$pdf->Output('pdf-barcode-qr-1.pdf', 'I');
?>

これの実行結果は以下の通りです。


レベル L, レベル M, レベル Q, レベル H は読み取り時の誤り訂正レベルを表しています。
「誤り訂正」とはQR-CODEに汚れや破損があっも正しく読み取れるように間違いを補正することをいいます。
なお、以下に訂正率を記します。

  • レベル L:コード語の約7%が訂正可能
  • レベル M:コード語の約15%が訂正可能
  • レベル Q:コード語の約25%が訂正可能
  • レベル H:コード語の約30%が訂正可能
  • レベル S:コード語の約50%が訂正可能

QR-CODEの仕様には レベル S までありますが、TCPDF では レベル H までが実装されています。
また、バージョンが1~40までありますが、TCPDF の内部では出力データの容量に応じてバージョンを計算している様です。 (私がソースを読んでみてのことなので正しいかどうかは分かりませんが…)

各種データの種類ごとの最大容量は以下の通りです。

データ種別最大容量備考
数字のみ 7,089文字
英数字(ASCII) 4,296文字
バイナリ(8ビット) 2,953バイト
漢字・かな (Shift_JIS) 4,296文字 全角英数字 (2バイト文字)を含み、半角カタカナ (1バイト文字)を含まない
※最大容量はバージョンを最大(40)、誤り訂正レベルを最低(L) にした場合











PR

コメント

コメントを書く