/** * @Route("/pdf/{id}", name="facture_pdf") * @ParamConverter("etablissement", class="AppBundle:Facture") */ public function pdfAction(Request $request, Facture $facture) { $fm = $this->get('facture.manager'); $pages = array(); $nbLigneMaxPourPageVierge = 50; $nbLigneMaxPourDernierePage = 30; $nbPage = 1; $nbMaxCharByLigne = 60; $nbCurrentLigne = 0; $nbCurrentPage = 1; $nbLigneParLigneFacture = array(); $nbLigneParPage = array(1 => $nbLigneMaxPourDernierePage); foreach ($facture->getLignes() as $key => $ligne) { $nbCurrentLigne += 2; if ($ligne->getReferenceClient()) { $nbCurrentLigne += 1; } if ($ligne->isOrigineContrat()) { $nbCurrentLigne += 4; $nbCurrentLigne += count($ligne->getOrigineDocument()->getPrestations()); $nbCurrentLigne += count($ligne->getOrigineDocument()->getContratPassages()); } $nbLigneParLigneFacture[$key] = $nbCurrentLigne; if ($nbCurrentPage == $nbPage && $nbCurrentLigne > $nbLigneMaxPourDernierePage) { $nbLigneParPage[$nbCurrentPage] = $nbLigneMaxPourDernierePage; $nbPage += 1; $nbLigneParPage[$nbPage] = $nbLigneMaxPourDernierePage; } if ($nbCurrentPage < $nbPage && $nbCurrentLigne > $nbLigneMaxPourPageVierge) { $nbLigneParPage[$nbCurrentPage] = $nbLigneMaxPourPageVierge; $nbCurrentPage += 1; $nbCurrentLigne = 0; } } $nbCurrentPage = 1; $nbCurrentLigne = 0; foreach ($facture->getLignes() as $key => $ligneFacture) { $ligne = $this->buildLignePDFFacture($ligneFacture); // La ligne ne tient pas sur une page complète if ($nbLigneParLigneFacture[$key] > $nbLigneParPage[$nbCurrentPage]) { $nbLignes2Keep = (int) (0.8 * $nbLigneParPage[$nbCurrentPage]); $lignesSplitted = $this->splitLigne($ligne, $nbLignes2Keep); $pages[$nbCurrentPage][] = $lignesSplitted[0]; $pages[$nbCurrentPage + 1][] = $lignesSplitted[1]; $nbCurrentLigne = 0; $nbCurrentPage += 1; continue; } // La ligne tient sur la page if ($nbCurrentLigne + $nbLigneParLigneFacture[$key] < $nbLigneParPage[$nbCurrentPage]) { $pages[$nbCurrentPage][] = $ligne; continue; } // La ligne ne tient plus sur la page if ($nbCurrentLigne + $nbLigneParLigneFacture[$key] > $nbLigneParPage[$nbCurrentPage]) { $nbCurrentLigne = 0; $nbCurrentPage += 1; $pages[$nbCurrentPage][] = $ligne; continue; } } $html = $this->renderView('facture/pdf.html.twig', array('facture' => $facture, 'pages' => $pages, 'parameters' => $fm->getParameters())); if ($request->get('output') == 'html') { return new Response($html, 200); } if ($facture->isDevis() && $facture->getNumeroDevis()) { $filename = "devis_" . $facture->getSociete()->getIdentifiant() . "_" . $facture->getDateDevis()->format('Ymd') . "_N" . $facture->getNumeroDevis() . ".pdf"; } elseif ($facture->isFacture() && $facture->getNumeroFacture()) { $prefix = $facture->isAvoir() ? 'avoir' : 'facture'; $filename = $prefix . "_" . $facture->getSociete()->getIdentifiant() . "_" . $facture->getDateFacturation()->format('Ymd') . "_N" . $facture->getNumeroFacture() . ".pdf"; } elseif ($facture->isDevis()) { $filename = "devis_" . $facture->getSociete()->getIdentifiant() . "_" . $facture->getDateDevis()->format('Ymd') . "_brouillon.pdf"; } else { $prefix = $facture->isAvoir() ? 'avoir' : 'facture'; $filename = $prefix . "_" . $facture->getSociete()->getIdentifiant() . "_" . $facture->getDateFacturation()->format('Ymd') . "_brouillon.pdf"; } return new Response($this->get('knp_snappy.pdf')->getOutputFromHtml($html, $this->getPdfGenerationOptions()), 200, array('Content-Type' => 'application/pdf', 'Content-Disposition' => 'attachment; filename="' . $filename . '"')); }