Retourner un document PDF depuis un contrôleur Symfony

Publié le 04/07/2021 • Actualisé le 04/07/2021


English language detected! 🇬🇧

  We noticed that your browser is using English. Do you want to read this post in this language?

Read the english version 🇬🇧 Close

Dans ce bout de code, nous voyons comment retourner un document PDF depuis un contrôleur Symfony. Nous allons utiliser la librairie spipu/html2pdf. Je n'utilise pas de bundle dédié ici ; on utilise la réponse BinaryFileResponse fournie par Symfony pour créer une réponse. La fonction setContentDisposition() permet d'indiquer si le fichier doit être affiché (DISPOSITION_INLINE) ou téléchargé (DISPOSITION_ATTACHMENT) mais aussi de spécifier le nom du fichier plutôt que d'utiliser celui du fichier temporaire.


<?php

declare(strict_types=1);

namespace App\Controller\Snippet;

use Spipu\Html2Pdf\Html2Pdf;
use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\HttpFoundation\BinaryFileResponse;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\ResponseHeaderBag;

/**
 * J'utilise un trait PHP afin d'isoler chaque snippet dans un fichier.
 * Ce code doit être apellé d'un contrôleur Symfony étendant AbstractController (depuis Symfony 4.2)
 * ou Symfony\Bundle\FrameworkBundle\Controller\Controller (Symfony <= 4.1).
 * Les services sont injectés dans le constructeur du contrôleur principal.
 */
trait Snippet153Trait
{
    public function snippet153(): Response
    {
        $tmpFileName = (new Filesystem())->tempnam(sys_get_temp_dir(), 'sb_', '.pdf');

        $html = '<h1>Strangebuzz.com</h1><br/><table border="1"><tr><td>COil</td><td>Col2</td></tr></table>';

        (new Html2Pdf())->writeHTML($html)->output($tmpFileName, 'F');

        return (new BinaryFileResponse($tmpFileName, Response::HTTP_OK))
            ->setContentDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT, 'example.pdf');

        // That's it! 😁
    }
}

 Exécuter le snippet  Plus sur Stackoverflow   Lire la doc  Snippet aléatoire

  Travaillez avec moi !