
Hai bisogno di mostrare a video o in un allegato pdf un codice a barre? Se hai sviluppato la tua webapp utilizzando il framework Symfony ti posso dare una dritta.
Io ho risolto utilizzando il bundle BarcodeBundle, che non è altro che il fork per Symfony della libreria open source PHP-Barcode.
Innanzi tutto dobbiamo installare nel server l’unix-commandline tool denominato genbarcode che si interfaccia con GNU-Barcode. Ah, per inciso io porto come esempio l’installazione sul mio Debian, ma se la tua installazione è diversa devi apportare le opportune modifiche.
wget http://www.ashberg.de/php-barcode/download/files/genbarcode-0.4.tar.gz tar -xzvf genbarcode-0.4.tar.gz cd genbarcode-0.4 make install
A questo punto aggiungiamo HackzillaBarcodeBundle nel nostro composer.json:
{
"require": {
"hackzilla/barcode-bundle": "~1.0"
}
}
E poi lo registriamo in AppKernel.php
<?php
// app/AppKernel.php
public function registerBundles()
{
$bundles = array(
// ...
new Hackzilla\BarcodeBundle\HackzillaBarcodeBundle(),
);
}
A questo punto io per comodità ho modificato il DefaultController.php aggiungendo l’azione barcodeImageAction($code) però volendo si può creare un controller ad hoc:
namespace Acme\DemoBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Response;
use Hackzilla\BarcodeBundle\Utility\Barcode;
class DefaultController extends Controller
{
/**
* Display code as a png image
*/
public function barcodeImageAction($code)
{
$barcode = new Barcode();
$barcode->setMode(Barcode::MODE_PNG);
$barcode->setGenbarcodeLocation('/usr/local/bin/genbarcode');
$headers = array(
'Content-Type' => 'image/png',
'Content-Disposition' => 'inline; filename="'.$code.'.png"'
);
return new Response($barcode->outputImage($code), 200, $headers);
}
}
Se genbarcode non è installato in /usr/local/bin è necessario richiamare setGenbarcodeLocation() dichiarando il path corretto. Se invece l’installazione è standard nella cartella di default la dichiarazione $barcode->setGenbarcodeLocation('/usr/local/bin/genbarcode'); si può omettere tranquillamente.
Poi in src/Acme/DemoBundle/Resources/config/routing.yml aggiungo:
barcode_image:
path: /barcode-image/{code}
defaults: { _controller: AcmeHelloBundle:Default:barcodeImage }
Ultimo step, nel template Twig richiamo il tag html:
<img src="{{ path('barcode_image', {'code':'ilmiocodicequi123456789'}) }}">
Se tutto va per il verso giusto dovremmo ottenere questo: