Generátor čárových kódů

JavaScript, CSS, PHP

Ukážeme si jednoduchý postup jak kreslit čárové kódy v PHP. Od stejného autora jsou kódy i pro Javu, a JavaScript. Konkrétně plugin do jQuery a Prototype, které vykreslují kódy na Canvas nebo přes CSS.

Generátor čárových kódů

Čárový kód zná každý, z výrobků v supermarketech. Vždycky mě zajímalo, jak v těch černobílých čárách může být ukryto, co si kupuji za zboží. Proto když jsem měl udělat systém pro nákup poukazů na SkiBílá, začal jsem si o čárových kódech zjišťovat více.

V novějším článku popisuji jak generovat QR kódy a jejich výhody oproti kódům čárovým.

Základní čárové kódy 

Ač se na první pohled může zdát, že je jeden jako druhý, není to pravda. Pokud budeme brát v potaz pouze 1D kódy (2D jsou např .QR kódy), existuje velké množství různých druhů. Některé umí jen čísla, jiné i písmena nebo speciální znaky. 

Jeden z nejstarších Code 2/5 umí jen znaky 0-9. EAN známý ze zboží v obchodech umí znaky 0-9, ale obsahuje také kontrolní číslici. Code128 dokáže rozpoznat 128 znaků, spodní polovinu ASCII. Je na každém, který si pro svou aplikaci vybere.

Problém s EAN kódy

Dříve zmíněný kód EAN, který se používá k označení zboží, nebo knížek, přiděluje organizace GS1 Czech Republic. Starají se, aby 2 výrobky neměly stejný kód, proto jeho použití by mohlo být problémové, kdyby si někdo chtěl na vás posvítit.

Zvětšování, zmenšování a rotace

Výhoda čárových kódů je v možností kód natáčet, zvětšovat či zmenšovat. Čtečka rozlišuje poměr černé a bílé čáry. U kódu Code11 dokonce jen poměr černých čar. Jiné kódy lze číst i vzhůru nohama. Díky této vlastnosti nemusíte kód čtečkou číst přesně kolmo k čarám, protože i při natočení poměr zůstane stejný.

Čtení čárového kódu

Generujeme

Pokud jsme si svůj kód vybrali, již stačí pouze vzít do ruky nějaký ten nástroj a vygenerovat si obrázek se svým čárovým kódem. Já vybral pro PHP třídu z webu Barcode coder. Zde naleznete zdrojové kódy pro PHP, Javu a pro JavaScript plugin do jQuery a Prototype.

Ukázka pro PHP s průhledným pozadím

Pro své účely jsem zvolil typ kódu Code93, umí číslice a velké znaky abecedy a pár speciálních znaků

$font     = './fonts/OpenSans-Regular-webfont.ttf';
$iWidth   = 300;   // šířka obrázku
$iHeight  = 150;   //výška obrázku
$fontSize = 12;    // velikost písma v px
$marge    = 15;    // mezera mezi koncem čar a HRI (human readable interpretation)
$x        = 150;   // střed na ose X
$y        = 60;    // střed na ose Y
$height   = 100;   // výška čar
$width    = 2;     // šířka čar
$type     = 'code93'; //vybraný typ
$angle    = 0;     //natočení kódu

$code     = "---TEST---"; //text k uložení do čárového kódu
$im       = imagecreatetruecolor($iWidth, $iHeight); //vytvoříme obrázek pro kreslení

imagesavealpha($im, true); //chceme ukládat alfa kanál pro průhlednost
imagealphablending($im, false); //vypneme blend mode
$black  = ImageColorAllocate($im,0x00,0x00,0x00); //alokace barvy
$white  = ImageColorAllocateAlpha($im,0xff,0xff,0xff,127); //alokace průhledného pozadí
imagefilledrectangle($im, 0, 0, $iWidth, $iHeight, $white); //vyplníme pozadí
imagealphablending($im, true); //zapneme blendmode po vykreslení pozadí

//nakreslíme čárový kód za pomoci Barcode třídy
$dataBarcode = Barcode::gd($im, $black, $x, $y, $angle, $type, $code, $width, $height); 
//vypočteme potřebné místo pro vypsání čitelného kódu
$box = imagettfbbox($fontSize, 0, $font, $dataBarcode['hri']);
$len = $box[2] - $box[0];
//vycentrujeme HRI doprostřed obrázku
Barcode::rotate(-$len / 2, ($dataBarcode['height'] / 2) + $fontSize + $marge, $angle, $xt, $yt);
//vykreslíme text
imagettftext($im, $fontSize, $angle, $x + $xt, $y + $yt, $black, $font, $dataBarcode['hri']);

imagepng($im,"barcode.png");// uložíme jako PNG obrázek

Otestujte si svou čtečku

Ne každá čtečka umí všechny kódy, některé dokonce povolují přidání kontrolních součtů. Je potřeba si vygenerovat různé kódy, vzít si čtečku do ruky a otestovat.

Já si předem vygeneroval kódy Code11, Code 39, Code93 (s i bez kontroly) a Code128. Z těchto čtečka používaná na Bílé nepodporuje Code11, Code93 bez kontroly. Nakonec jsem se rozhodl pro Code93, protože umožnil přidat kontrolní součet.

Přidat komentář

Právě odpovídáte na existující komentář. Zrušit

Komentáře

Karel

http://kooperace.czechian.net 23.8.2015 18:53

Funkce imagettfbbox() a imagettftext() neexistují.

Odpovědět

Pavel

http://www.kutac.cz/blog/ 23.8.2015 22:27

Opravdu? Je to funkční kód který používám a také dokumentace k těmto funkcím existuje: http://php.net/manual/en/function.imagettfbbox.php a http://php.net/manual/en/function.imagettftext.php

Novinky z blogu

Algoritmizace geometrických úloh

Výjimečně napíšu o předmětu z mého studia na VŠB. A to proto, že výstupem je pár videí, vysvětlujících některé probírané algoritmy, které následně skončily na YouTube...

Další články