Bonjour les Grafikart

j'aimerai pouvoir lors de la creation d'un pdf avec knp-snappy-bundle just l'afficher sur le navigateur.

Avec le code suivant je paviens a créer un pdf mais est directement télécharger et n'est pas afficher sur mon navigateur

    /**
     * Permet de créer une facture
     *
     * @Route("/participant/facture/{id}/{slug}", name="pp_facture_pdf")
     */
    public function facture($id, $slug, CourseRepository $courseRepo)
    {

        $participant = $courseRepo->findOne($id);

        $html = $this->renderView('pp/facture.html.twig', [
           'participants' => $participant,
        ]);

        //$this->pdf->setTimeout(10);
        $this->pdf->setOption('page-size','A5');
        $this->pdf->setOption('orientation', 'Landscape');

        return new Response(
            $this->pdf->getOutputFromHtml($html),
            200,
            array(
                'Content-Type'          => 'application/pdf',
                'Content-Disposition'   => 'inline; filename="' . $slug . '.pdf"'
            )
        );
    }

Ce que je veux

juste afficher le pdf sur le navigateur lorsqu'on clique sur un bouton facture et l'utilisateur pourra le téléchager par la suis si necessaire.

Merci d'avance

version:
symfony 5.3
php 7.4.25

5 réponses


Bonjour,

je pense que ton problème vient de ton html. peux tu mettre la partie html stp.

Bonjour,
J'ai eu le même problème (je voulais récupérer une liste d'adhérents d'asso affichée à l'écran et la transformer en PDF) et je ne voyais pas la solution.
Pour info, j'utilise le navigateur BRAVE. J'ai eu l'idée de cliquer droit sur la liste affichée à l'écran. Et là ... miracle.
Brave propose de l'enregistrer au format PDF, en choisissant de plus pas mal de paramètres de mise en page.
Moi j'ai arrêté de vouloir pisser du code pour rien puisque cette fonction répondait à mon attente.
Peut-être que ce sera pareil pour toi ?
En résumé, fais afficher ta facture à l'écran avec ton code. Ensuite tu cliques droit sur la facture affichée et tu demandes à ton navigateur de l'enregistrer en PDF
Cela t'evitera de te prendre la tête sur ce point. C'est déjà assez complexe, alors faisons au plus simple ... non ?

Ceci devrait aider.

$response = new Response($this->pdf->getOutputFromHtml($html), 200, [
    'Content-Type' => 'application/pdf',
]);
$dispositionHeader = $response->headers->makeDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT, $slug . '.pdf');
$response->headers->set('Content-Disposition', $dispositionHeader);

return response;

Merci pour vos réponse et désolé d'avoir pris autant de temps pour reagir
@aka-aka

Voici le html de ma facture

  <body>
    {% for course in participants %}
      <header class="clearfix">
        <div id="head">
          <div id="project2">
            <div><span>OBJET (PAY FOR)</span>Cours {% if course.pp.learningLanguages != 'Anglais' %}
              de {{course.pp.learningLanguages}} pour {{ course.pp.type }}
              {% else %}
              d'{{course.pp.learningLanguages}} pour {{ course.pp.type }}
              {% endif %}</div>
            <div><span>NOMS (NAMES)</span>{{ course.pp.names }}</div>
            <div><span>CONTACT DU CLIENT</span>{{ course.pp.contact }}</div>
            <div><span>MATRICULE</span>BIL{{course.regDate|date('Y')[2:]}}{{course.pp.learningLanguages|upper [:2]}}{{course.pp.id}}</div>
            <div><span>RECU N° (RECEIPT N°)</span>{{ course.id }}</div>
            <div><span>DATE FACTURE</span>{{ course.regDate|date("d/m/Y")}}</div>
          </div>
          <div id="box3">
            <p class="a" style="margin-bottom:0;font-size: 0.8em;" >FOR EFFECTIVE BILINGUALISM</P>
            <img src="{{ absolute_url(asset('build/img/BIL_LOGO.png')) }}" alt="BIL_Logo">
            <P class="a" style="margin:3px;font-size: 0.8em;" >POUR UN BILINGUISME EFFICACE</P>
          </div>
        </div>
      </header>

      <main id="main">
        <h1>Reçu </h1>
        <div id="company" class="clearfix">
          <div>BAFOUSSAM centre</div>
          <div>679742319 - 698637315</div>
        </div>
        <div id="project3">
          <div><span>Date Début des cours (Course start date )</span>{% if course.period == 'Tem 1' %}Janvier - {{ course.regDate|date("Y") }}{% elseif course.period == 'Term 2' %}Avril - {{ course.regDate|date("Y") }}{% elseif course.period == 'Term 3' %}Juillet - {{ course.regDate|date("Y") }}{% elseif course.period == 'Term 4' %}Octobre - {{ course.regDate|date("Y") }}{% else %}Juin - {{ course.regDate|date("Y") }}{% endif %}</div>
          <div><span>Date de Fin des cours (Course end date)</span>{% if course.period == 'Tem 1' %}Mars - {{ course.regDate|date("Y") }}{% elseif course.period == 'Term 2' %}Juin - {{ course.regDate|date("Y") }}{% elseif course.period == 'Term 3' %}Septembre - {{ course.regDate|date("Y") }}{% elseif course.period == 'Term 4' %}Décembre - {{ course.regDate|date("Y") }}{% else %}Août - {{ course.regDate|date("Y") }}{% endif %}</div>
        </div>
        <div id="table">
          <table id="tab1">
            <thead>
              <tr>
                <th>Niveau (Level)</th>
                <th>Heure (Time)</th>
                <th>Jours (Date)</th>
                <th>Salle (Room)</th>
                <th>Bibiothèque (Library)</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td>{{course.level}} {{course.module}}{{course.moduleNum}}</td>
                <td>{{course.classTimes}}</td>
                <td>{{course.classDays}}</td>
                <td>{{course.classRoom}}</td>
                <td>{{course.libraryDay}}</td>
              </tr>
              </tr>
            </tbody>
          </table>
          <table id="tab2">
            <tbody>
              <tr>
                <th>Traité par (treated by)</th>
                <td>{{ course.author.names }}</td>
              </tr>
              <tr>
                <th>Payés en (Paid in) </th>
                <td>Espèces (Cash)</td>
              </tr>
            </tbody>
          </table>
          <table id="tab3">
            <tbody>
              <tr>
                <th>Type de paiement (Type of payment)</th>
                <td>{{ course.payType }}</td>
              </tr>
              <tr>
                <th>Description (Description)</th>
                <td>{{ course.payDescription }}</td>
              </tr>
              <tr>
                <th>Montant réglé (Montant rule)</th>
                <td>{{ course.payReceived }} FCFA</td>
              </tr>
            </tbody>
          </table>
        </div>
        <div id="visa">
          <div id="visa1">
            <p>Merci de nous faire confiance !</p>
          </div>
          <div id="visa2">
            <p>Tank you for trusting us !</p>
          </div>
        </div>
      </main>
    {% endfor %}
  </body>

Ici le html de la page avec le bouton qui permet de créer une facture

<div class="card my-4 p-0 ">
    <div class="card-header">
        <i class="fas fa-table me-1"></i>
        Dernières enregistrement
    </div>
    <div class="card-body p-0 table-responsive">
        <table class="table table-sm table-striped ">
            <thead>
                <tr>
                    <th>Nom et Prénom</th>
                    <th>Contact</th>
                    <th>Période</th>
                    <th>Niveau</th>
                    <th>Jours</th>
                    <th>Heures</th>
                    <th>Type</th>
                    <th>Actions</th>
                </tr>
            </thead>
            <tbody>
                {% for course in courses %}
                    <tr>
                        <td>{{ course.pp.names }}</td>
                        <td>{{ course.pp.contact }}</td>
                        <td>{{ course.period }} - {{ course.regDate|date("Y") }} </td>
                        <td>{{ course.level }} {{ course.module }}{{ course.moduleNum }}</td>
                        <td>{{ course.classDays }}</td>
                        <td>{{ course.classTimes }}</td>
                        <td>{{ course.pp.type }}</td>
                        <td>
                            <div class="row">
                                <div class="col-md-3 mb-1">
                                    <a class="btn btn-primary btn-sm" href="{{path('pp_edit', {'slug': course.pp.slug})}}"><i class="fas fa-user-edit"></i></a>
                                </div>
                                <div class="col-md-3 mb-1">
                                    <a class="btn btn-primary btn-sm" href="{{path('course_edit', {'slug': course.pp.slug, 'id': course.id})}}"><i class="fas fa-edit"></i></a>
                                </div>
                                <div class="col-md mb-1 ">
                                    <a class="btn btn-primary btn-sm" href="{{path('pp_facture_pdf', {'id': course.pp.id, 'slug': course.pp.slug})}}"><i class="fas fa-file-pdf me-1"></i>Facture</a>
                                </div>
                            </div>
                        </td>
                    </tr>
                {% endfor %}
            </tbody>
        </table>
    </div>
</div>

@Gulivert

j'ai essayer avec ton code mais j'ai le même resultat