Descargar PDF base64 con Symfony

Para hacer la recuperación de un archivo, en este caso un PDF, que está almacenado en nuestra base de datos como un BLOB para luego realizar el return añadiendo las cabeceras necesarias para realizar la acción de «Descargar» cuando llamemos a esta URL.

En este ejemplo sencillo, recuperamos el PDF utilizando una función ficticia en la que supuestamente recuperamos los datos del PDF en bruto (raw) y codificado en base64.

El segundo paso es decodificar ese raw utilizando la función base64_decode().

El último paso es crear la respuesta con los métodos que nos da la clase Response. A esta respuesta le vamos a añadir las cabeceras necesarias para poder decirle al navegador que es lo que tiene que hacer con este archivo.

En este caso lo que queremos es descargarlo. Por lo que añadiremos las cabeceras Content-Description y Content-Disposition:

$response->headers->set(‘Content-Description’, ‘File Transfer’);

$response->headers->set(‘Content-Disposition’, ‘attachment; filename=»Archivo.pdf»‘);
Con esto, al realizar una consulta a la ruta creada directamente nos descargará el PDF.
¡Importante! Si vas a realizar la consulta con un formulario, no te olvides de colocar el atributo enctype en tu etiqueta FORM.
<form id="pruebaPDF" method="post" enctype="multipart/form-data">
<?php
namespace App\Controller;
use Symfony\Component\HttpFoundation\Response;
    /**
    * @Route("/show-pdf", name="show_pdf")
    */
    public function getPDFDocument()
    {
        $result = getPdfFromRaw();
        $pdf = base64_decode($result->PDF);
        $response = new Response($pdf);
        $response->headers->set('Content-Type', 'application/octet-stream');
        $response->headers->set('Content-Description', 'File Transfer');
        $response->headers->set('Content-Disposition', 'attachment; filename="Archivo.pdf"');
        // $response->headers->set('Expires', '0');
        // $response->headers->set('Content-Transfer-Encoding', 'binary');
        $response->headers->set('Content-length', strlen($pdf));
        $response->headers->set('Cache-Control', 'no-cache private');
        // $response->headers->set('Pragma', 'public');
        // Send headers before outputting anything
        $response->sendHeaders();
        return $response;
    }