Techno-magis

Code barre & QR code en PHP

Saturday 5th April 2014

Encore des problématiques de code-barre ou plutôt identificateur. Comme en ce moment c'était une de mes problématiques, et que j'ai trouvé des solutions facilement intégrables. Autant en faire profiter tout le monde avec quelques explications.

Image_Barcode2

Petit module pear que j'ai trouvé en tombant sur un blog japonais, ça m'a évité de me prendre la tête avec les autres formats (autre qu'EAN 13). La version 2 est toujours en bêta, mais semble bien fonctionner. Il existe une version 1 qui date un peu, mais qui est considérée comme stable (pour PHP 4 et plus).

Installation

Installer pear; s'il ne l'es pas :

CODE:

apt-get install php-pear

Ensuite, il vous faut le module installé de cette façon :

CODE:

pear install Image_Barcode2

Si cela ne fonctionne pas (car non stable), forcer le numéro de version :

CODE:

pear install Image_Barcode2-0.2.3

Les formats reconnus

Utilisation

Petit exemple, pour générer une image PNG à afficher directement dans le navigateur. J'ai pris le code 39 :

CODE:

// pour utiliser Barcode2
require_once 'Image/Barcode2.php';
 
// En admettant que code est toujours donné
if (isset($_GET['code'])) {
	$code = $_GET['code'];
 
	try {
		// génération de l'image
		$gd = Image_Barcode2::draw(
			$code,                          // code
			Image_Barcode2::BARCODE_EAN13,  // format du code-barre (EAN13, Code39, ...)
			Image_Barcode2::IMAGE_PNG,      // format d'image
			false,                          // envoyer au navigateur (entête image)
			90,                             // hauteur (en pixel)
			2,                              // largeur (des lignes en pixel)
			true,                           // afficher le texte
			Image_Barcode2::ROTATE_NONE     // rotation de l'image (0 / 90 / 180 / 270) 
		);
		// rendu du flux sous forme d'image
		header('Content-Type: image/'.Image_Barcode2::IMAGE_PNG);
		imagepng($gd);
		imagedestroy($gd);
	} catch (Exception $e) {	
		echo "Code invalide : '{$code}'";	
	}
} else {
	echo "Pas de code";	
}

La documentation est pas terrible en l'état, il est plus simple d'aller voir directement le code.

Exemples de rendu


Code 39 & EAN13 [/imgs]

PHP QR code

Comme j'avais aussi besoin de QR code, avec une petite recherche j'ai trouvé PHP QR code sur Source Forge. Le module n'est plus mise à jour depuis 2010, mais c'est du PHP 5, et il ne semble pas y avoir de problème de compatibilité.

Installation

Télécharger la bibliothèque sur SourceForce et placer la dans un dossier de votre projet (si ça sera libs/phpqrcode).

Utilisation

Il est très simple de générer une image avec sa taille

CODE:

include "libs/phpqrcode/qrlib.php";
 
$level  = QR_ECLEVEL_L;  // le taux de correction. 
$size   = 4;             // taille des points (en pixel)
$margin = 2;             // nombre de points de marge
 
QRcode::png($_GET['code'], false, $level, $size, $margin, false);
 

Pour le taux de correction, plus il est haut, plus la dégradation du code sera tolérée (4 niveaux : L, M, Q, H).

La bibliothèque est sympa, mais pas vraiment conçue pour générer du code que l'on peut manipuler. Heureusement, il y a toujours un moyen :

CODE:

include "libs/phpqrcode/qrlib.php";
 
$texte  = "Mon Texte";
$level  = QR_ECLEVEL_L;
$size   = 4; 
$margin = 2;
 
function binaryQRCodeImage($texte, $level = QR_ECLEVEL_L, $size = 3, $margin = 4) {
	// génération du code
	$enc = QRencode::factory($level, $size, $margin);
	$tab = $enc->encode($texte);
	$maxSize = (int)(QR_PNG_MAXIMUM_SIZE / (count($tab)+2*$enc->margin));
 
	// écriture dans un flux
	ob_start();
	QRimage::png($tab, '', min(max(1, $enc->size), $maxSize), $enc->margin, false);
	$imagedata = ob_get_contents();
	ob_end_clean();
 
	// retourner le flux (binaire de l'image)
	return $imagedata;
}
 
$imagedata = binaryQRCodeImage($texte, $level, $size, $margin);
 
print '<p><img src="data:image/png;base64,'.base64_encode($imagedata).'" alt="image 1" /></p>';

Exemples de rendu

Categories:
By Zéfling, the 05/04/2014 at 01:07:14
The ticket was read 561 times, with 0 comment posted.

No comment

Write your below.

Write a commentary