Creare e stampare codici a barre con Symfony2

Symfony2

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:

ilmiocodicequi123456789

Rispondi