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'))
;