Generar PDF con Symfony: KnpSnappyBundle

Como sabes tengo algo de tiempo trabajando con Symfony ( o.O ¡ya más de un año!) y como te comenté en Symfony : ¿Bundle o no bundle? a veces es necesario usar Bundle de terceros. Uno de los casos particulares que te mencionaba es en la generación de PDFs ya que una de las necesidades más comunes es tener que exportar reportes de la pantalla a este tipo de archivo.

knpSnappyBundle

Cuando comenzaba con Symfony me la pasaba probando bundle tras bundle hasta que encontraba el que solventaba las necesidades del proyecto y hoy te voy a hablar de uno de ellos que me gustó. El nombre de este bundle es KnpSnappyBundle, si sabes inglés puedes obtener más información aquí y sino aquí te contaré lo básico que necesitas saber para comenzar a usarlo.

KnpSnappyBundle trabaja con wkhtmltopdf y wkhtmltoimage, herramientas que permite pasar el HTML a PDF por lo que, para que funcione, tienes que tenerlas primero en tu servidor. Las puedes descargar de http://wkhtmltopdf.org/.

Una vez hecho esto procedes a agregar esta linea a tu Composer.json

 "knplabs/knp-snappy-bundle": "dev-master"

Y en tu AppKernel.php

 new Knp\Bundle\SnappyBundle\KnpSnappyBundle(),

Ahora debes indicar en el l archivo config.yml de tu proyecto, que se encuentra en la carpeta app/config, la ubicación de la carpeta donde están el wkhtmltopdf y wkhtmltoimage.

knp_snappy:
pdf:
enabled: true
binary: /usr/local/bin/wkhtmltopdf
options: []
image:
enabled: true
binary: /usr/local/bin/wkhtmltoimage
options: []

Hecho esto y ejecutado el comando composer update tienes todo lo necesario para utilizarlo. ¿Fácil? Te daré un ejemplo, desde el controlador tendrás que escribir un código parecido a este:

/**
* @Route("/archivopdf", name="archivopdf")
* @Method("GET")
* @Template("MiBundle:Reportes:archivopdf.html.twig")
*/
public function archivopdfAction()
{

$em = $this->getDoctrine()->getManager();
//Consulto a mi base de datos
$query = $em->createQuery(
"SELECT c.nombre,c.apellidoPaterno,c.apellidoMaterno,c.numeroControl
FROM MiBundle:Personal c );
$entities = $query->getResult();

$html =$this->renderView('MiBundle:Reportes:archivopdf.html.twig',
array(
'entities' => $entities,
));

//Aquí defino los datos del documento como el tamaño, orientación, título, etc.
$response = new Response (
$this->get('knp_snappy.pdf')->getOutputFromHtml($html,
array('lowquality' => false,
'print-media-type' => true,
'encoding' => 'utf-8',
'page-size' => 'Letter',
'outline-depth' => 8,
'orientation' => 'Portrait',
'title'=> 'Personal con Certificado',
'user-style-sheet'=> 'css/bootstrap.css',
'header-right'=>'Pag. [page] de [toPage]',
'header-font-size'=>7,
)),
200,
array(
'Content-Type'          =>
'/home/usuario/public_html/Proyecto/web/pdf',
'Content-Disposition'   => 'attachment;
filename="nombredearchivo.pdf"',
)
);
return $response;
}

Finalmente, en el archivo archivopdf.html.twig (porque así lo indicamos en el controlador) solo debes tener el código HTML con el que quieres sea presentada la información, puedes usar CSS también y ¡listo!

Como ves es muy fácil y si conoces HTML + CSS será más sencillo aún, lo que en mi caso me resulto complicado es encontrar el bundle. Si quieres saber las opciones de configuración del documento puedes ir directamente a las opciones de uso del wkhtmltopdf.

Espero te sirva. Prueba el bundle y me cuentas que te parece.

 

¡Nos leemos en la próxima!

 

Deja un comentario

49 ideas sobre “Generar PDF con Symfony: KnpSnappyBundle”

A %d blogueros les gusta esto: