Subversion Repositories eFlore/Applications.eflore-consultation

Rev

Rev 1034 | 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 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 = '<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;
                
                // 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 .= '</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 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 =     "{$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;
        }
}
?>