* @copyright 2012 Tela-Botanica * @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL * @license http://www.gnu.org/licenses/gpl.html Licence GNU-GPL * @version $Id$ */ class PdfExport extends aControleur { const DUREE_DE_VIE_PDF = 86400;// 3600 * 24 * 2 = 172 800 const DUREE_DE_VIE_HTML = 60; private $Conteneur; private $parametres = array(); private $chemin_pdf; private $html; private $wkhtml; private $piedepage; private $fichier_pdf; private $blocs = array(); private $Desc; private $Ecolo; private $Ethno; private $Illus; private $Nomen; private $Reparti; private $Stat; private $Biblio; public function initialiser() { spl_autoload_register(array($this, 'chargerClassesOnglets')); $this->capturerParametres(); $this->conteneur = new Conteneur($this->parametres); $this->chemin_pdf = Config::get('dossier_pdf'); $this->wkhtml = Config::get('WKHTMLTOPDF'); $this->Desc = new Description($this->conteneur); $this->Ecolo = new Ecologie($this->conteneur); $this->Ethno = new Ethnobotanique($this->conteneur); $this->Illus = new Illustrations($this->conteneur); $this->Nomen = new Nomenclature($this->conteneur); $this->Stat = new Statut($this->conteneur); $this->Biblio = new Bibliographie($this->conteneur); $this->Reparti = new Repartition($this->conteneur); $this->piedepage = Config::get('chemin_modules').'pdf_export/squelettes/footer.html'; } private function chargerClassesOnglets($classe) { $base = dirname(__FILE__).DS; $cheminFormateurs = $base.'../fiche/formateurs'.DS; $dossiers = array($base, $cheminFormateurs); foreach ($dossiers as $chemin) { $fichierATester = $chemin.$classe.'.php'; if (file_exists($fichierATester)) { include_once $fichierATester; return null; } } } private function getNomRetenu() { $nom_retenu = $this->conteneur->getNomCourant()->getNomRetenu()->get('nom_sci'); return $nom_retenu; } private function getNomRetenuHTML() { $nom_retenu = '' .$this->conteneur->getNomCourant()->getNomRetenu()->get('nom_sci') .' '.$this->conteneur->getNomCourant()->getNomRetenu()->get('auteur'); return $nom_retenu; } private function getNomFichierValide(){ $nom_retenu = $this->conteneur->getNomCourant()->getNomRetenu()->get('nom_sci'); $nom_retenu = str_replace(' ','_',$nom_retenu ); $nom_retenu = preg_replace('/[\(\)\.\[\]]/','',$nom_retenu ); return $nom_retenu; } private function capturerParametres() { if (isset($_GET['num_nom'])) { $this->parametres['num_nom'] = $_GET['num_nom']; } if (isset($_GET['nom'])) { $this->parametres['nom'] = $_GET['nom']; } if (isset($_GET['type_nom'])) { $this->parametres['type_nom'] = $_GET['type_nom']; } if (isset($_GET['referentiel'])) { $this->parametres['referentiel'] = $_GET['referentiel']; } if (isset($_GET['niveau'])) { Registre::set('parametres.niveau', $_GET['niveau']); } if (isset($_GET['onglet'])) { $this->onglet = $_GET['onglet']; } } private function capturerParametresFormulaire() { $this->blocs = array('description', 'ecologie', 'ethnobotanique', 'statuts', 'illustrations', 'bibliographie', 'repartition', 'nomenclature'); if (!empty($_POST['bloc'])) { $this->blocs = $_POST['bloc']; } } public function executerActionParDefaut() { $this->executerPdfExport(); } public function executerPdfExport(){ $this->capturerParametresFormulaire(); $hash = crc32($this->parametres['referentiel'].'-'.implode('-', $this->blocs)); $nom_fichier = $this->getNomFichierValide().'-'.$hash; // le dossier cache existe normalement, mais le sous dossier pdf // est parfois effacé par erreur lors des suppressions de cache // il vaut mieux donc le recréer s'il n'existe pas if(!file_exists($this->chemin_pdf)) { mkdir($this->chemin_pdf, 0755, true); } $this->fichier_html = $this->chemin_pdf.''.$nom_fichier.'.html'; $this->fichier_pdf = $this->chemin_pdf.''.$nom_fichier.'.pdf'; if (file_exists($this->fichier_pdf) == false) { $donnees = $this->obtenirDonnees(); $this->construireHtml($donnees); if ($this->transformerHtmlEnPdf() == false) { die('Erreur de generation du fichier PDF'); } } $this->envoyerPdfAuNavigateur(); $this->nettoyerFichiersTmp(); // ATTENTION : on doit stopper l'exécution de Papyrus sinon du HTML inutile est ajouté à la fin du fichier PDF exit; } private function construireHtml($donnees) { $this->html = $this->getVue('pdf_header', $donnees); foreach ($this->blocs as $bloc) { $this->ajouterHtml($bloc, $donnees); } $this->html .= ''; } private function ajouterHtml($bloc, $donnees) { if (!empty($donnees[$bloc])) { $this->html .= $this->getVue('pdf_'.$bloc, $donnees); } } //+-------------------------------------récupération des données---------------------------------------------+ private function obtenirDonnees() { $donnees = array(); $version = $this->Nomen->obtenirVersionDonnees(); $donnees['donnees_pdf'] = array( 'nom' => $this->getNomRetenuHTML(), 'chemin_css' => Config::get('url_css_pdf'), 'version' => $version['version']); $donnees['description'] = $this->Desc->obtenirDonneesExport(); $donnees['ecologie'] = $this->Ecolo->obtenirDonneesExport(); $donnees['statuts'] = $this->Stat->obtenirDonneesExport(); $donnees['ethnobotanique'] = $this->Ethno->obtenirDonnees(); $donnees['illustrations'] = $this->Illus->obtenirDonneesExport(); $donnees['nomenclature'] = $this->Nomen->obtenirDonnees(); $donnees['repartition'] = $this->Reparti->obtenirDonneesExport(); $donnees['bibliographie'] = $this->Biblio->obtenirDonnees(); $donnees['premier'] = $this->blocs[0];// pour page-break : éviter 1ere page vide si bloc trop long return $donnees; } //+------------------------------------------------export en pdf---------------------------------------------+ private function envoyerPdfAuNavigateur() { $nom_fichier = $this->getNomFichierValide(); header('Content-type: application/pdf'); header('Content-Disposition: attachment; filename='.$nom_fichier.'.pdf'); readfile($this->fichier_pdf); } private function nettoyerFichiersTmp() { $dossierStockage = $this->chemin_pdf; if (is_dir($dossierStockage)) { $objets = scandir($dossierStockage); if ($objets !== false) { foreach ($objets as $objet) { $chemin = $dossierStockage.$objet; if (is_file($chemin)) { $filemtime = @filemtime($chemin); if ($filemtime !== false) { if (substr($chemin, -5) == '.html') { $suppression = (time() - $filemtime >= self::DUREE_DE_VIE_HTML) ? true : false; } else { $suppression = (time() - $filemtime >= self::DUREE_DE_VIE_PDF) ? true : false; } if ($suppression === true) { unlink($chemin); } } } } } } } //version WKHTMLtoPDF en ligne de commande private function transformerHtmlEnPdf() { $nom = $this->getNomRetenu(); file_put_contents($this->fichier_html, $this->html); $commande = "xvfb-run {$this->wkhtml} --replace 'nom' '$nom' --encoding utf-8 --footer-html {$this->piedepage} {$this->fichier_html} {$this->fichier_pdf}"; $ret = -1; $debug = array(); exec($commande, $debug, $ret); //print_r( $debug ); echo $ret; $ok = ($ret == 0 || $ret == 2) ? true : false; return $ok; } } ?>