New file |
0,0 → 1,233 |
<?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; |
} |
} |
?> |