Blog


GENERAR DOCUMENTO PDF CON SYMFONY2

18 / 02 / 2014 Symfony

Generar documentos en PDF desde nuestras aplicaciones desarrolladas con Symfony2 es una tarea bastante común y muy sencilla de llevar a cabo gracias al bundle KnpSnappyBundle, que proporciona integración con Snappy, una librería PHP5 que utiliza wkhtmltopdf para la generación de PDF o imágenes de documentos HTML, usando el motor webkit.

Lo primero que tendremos que hacer será instalar el bundle, mediante composer:


{
    "require": {
        "knplabs/knp-snappy-bundle": "dev-master"
    }
}

y habilitarlo en el kernel de nuestra aplicación Symfony:


// app/AppKernel.php
public function registerBundles()
{
    $bundles = array(
        //...
        new KnpBundleSnappyBundleKnpSnappyBundle(),
        //...

Lo siguiente será descargarnos el binario de wkhtmltopdf de http://wkhtmltopdf.org y configurarlo en nuestro proyecto Symfony:


# app/config/config.yml
knp_snappy:
    pdf:
        enabled:    true
        binary:     /usr/local/bin/wkhtmltopdf
        options:    []

Con esto ya tenemos todo lo necesario para generar documentos PDF en nuestro proyecto Symfony.

Por ejemplo, podemos generar un documento PDF desde una plantilla twig de la siguiente manera:


$this->get('knp_snappy.pdf')->generateFromHtml(
    $this->renderView(
        'VabadusBundle:Admin:pdf.html.twig',
        array(
            'variables' => $variables
        )
    ),
    '/ruta/al/fichero.pdf'
);

o generar un documento PDF como respuesta de un controlador:


$html = $this->renderView('VabadusBundle:Admin:pdf.html.twig', array(
    'variables' => $variables
));

return new Response(
    $this->get('knp_snappy.pdf')->getOutputFromHtml($html),
    200,
    array(
        'Content-Type'        => 'application/pdf',
        'Content-Disposition' => 'attachment; filename="fichero.pdf"'
    )
);

o generar un documento PDF y adjuntarlo a un correo electrónico que enviemos desde un controlador usando Swift Mailer:


$this->get('knp_snappy.pdf')->generateFromHtml(
    $this->renderView(
        'VabadusBundle:Admin:pdf.html.twig',
        array(
            'variables' => $variables
        )
    ),
    '/ruta/al/fichero.pdf'
);

$message_user = Swift_Message::newInstance()
    ->setSubject('Correo electrónico con PDF adjunto')
    ->setFrom(...)
    ->setTo(...)
    // ...
    ->attach(Swift_Attachment::fromPath( '/ruta/al/fichero.pdf'))
;


ARTÍCULOS RELACIONADOS