Rev 1033 | Rev 1195 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed
<?php/*** Classe PdfExport, réalise des exportations pdf des fiches de taxons.* Les fonctionnalités proposées sont l'export de toutes les parties de la fiche pdf* ou bien des parties choisies.* (voir le squelette fiche_pdf_lien.tpl.html pour le formulaire dans le module fiche.)** manuel wkhtmltopdf : http://madalgo.au.dk/~jakobt/wkhtmltoxdoc/wkhtmltopdf_0.10.0_rc2-doc.html* pour changer de librairie : changer la fonction transformerHtmlEnPdf()** @category php 5.2* @package eflore-consultation* @author Mathilde Salthun-Lassalle <mathilde@tela-botanica.org>* @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 800const 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 = '<span class="italique">'.$this->conteneur->getNomCourant()->getNomRetenu()->get('nom_sci').'</span> '.$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;$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 PDFexit;}private function construireHtml($donnees) {$this->html = $this->getVue('pdf_header', $donnees);foreach ($this->blocs as $bloc) {$this->ajouterHtml($bloc, $donnees);}$this->html .= '</body></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->obtenirDonnees();$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 longreturn $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 commandeprivate function transformerHtmlEnPdf() {$nom = $this->getNomRetenu();file_put_contents($this->fichier_html, $this->html);$commande = "{$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;}}?>