Subversion Repositories eFlore/Applications.eflore-consultation

Rev

Rev 1012 | Rev 1016 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1012 Rev 1015
1
<?php
1
<?php
2
/**
2
/**
3
 * Classe PdfExport, réalise des exportations pdf des fiches de taxons.
3
 * Classe PdfExport, réalise des exportations pdf des fiches de taxons.
4
 * Les fonctionnalités proposées sont l'export de toutes les parties de la fiche pdf
4
 * Les fonctionnalités proposées sont l'export de toutes les parties de la fiche pdf
5
 * ou bien des parties choisies.
5
 * ou bien des parties choisies.
6
 * (voir le squelette fiche_pdf_lien.tpl.html pour le formulaire dans le module fiche.)
6
 * (voir le squelette fiche_pdf_lien.tpl.html pour le formulaire dans le module fiche.)
7
 *
7
 *
8
 * manuel wkhtmltopdf  : http://madalgo.au.dk/~jakobt/wkhtmltoxdoc/wkhtmltopdf_0.10.0_rc2-doc.html
8
 * manuel wkhtmltopdf  : http://madalgo.au.dk/~jakobt/wkhtmltoxdoc/wkhtmltopdf_0.10.0_rc2-doc.html
9
 * pour changer de librairie : changer la fonction transformerHtmlEnPdf()
9
 * pour changer de librairie : changer la fonction transformerHtmlEnPdf()
10
 *
10
 *
11
 * @category	php 5.2
11
 * @category	php 5.2
12
 * @package		eflore-consultation
12
 * @package		eflore-consultation
13
 * @author		Mathilde Salthun-Lassalle <mathilde@tela-botanica.org>
13
 * @author		Mathilde Salthun-Lassalle <mathilde@tela-botanica.org>
14
 * @copyright	2012 Tela-Botanica
14
 * @copyright	2012 Tela-Botanica
15
 * @license		http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
15
 * @license		http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
16
 * @license		http://www.gnu.org/licenses/gpl.html Licence GNU-GPL
16
 * @license		http://www.gnu.org/licenses/gpl.html Licence GNU-GPL
17
 * @version		$Id$
17
 * @version		$Id$
18
 */
18
 */
19
 
19
 
20
class PdfExport extends aControleur {
20
class PdfExport extends aControleur {
21
	private $Conteneur;
21
	private $Conteneur;
22
	private $parametres = array();
22
	private $parametres = array();
23
	private $chemin_pdf;
23
	private $chemin_pdf;
24
	private $html;
24
	private $html;
25
	private $wkhtml;
25
	private $wkhtml;
26
	private $piedepage;
26
	private $piedepage;
27
	private $fichier_pdf;
27
	private $fichier_pdf;
28
	private $blocs = array();
28
	private $blocs = array();
29
 
29
 
30
	private $Desc;
30
	private $Desc;
31
	private $Ecolo;
31
	private $Ecolo;
32
	private $Ethno;
32
	private $Ethno;
33
	private $Illus;
33
	private $Illus;
34
	private $Nomen;
34
	private $Nomen;
35
	private $Reparti;
35
	private $Reparti;
36
	private $Stat;
36
	private $Stat;
37
	private $Biblio;
37
	private $Biblio;
38
 
38
 
39
	public function initialiser() {
39
	public function initialiser() {
40
		spl_autoload_register(array($this, 'chargerClassesOnglets'));
40
		spl_autoload_register(array($this, 'chargerClassesOnglets'));
41
		$this->capturerParametres();
41
		$this->capturerParametres();
42
		$this->conteneur = new Conteneur($this->parametres);
42
		$this->conteneur = new Conteneur($this->parametres);
43
		$this->chemin_pdf = Config::get('dossier_pdf');
43
		$this->chemin_pdf = Config::get('dossier_pdf');
44
		$this->wkhtml = Config::get('WKHTMLTOPDF');
44
		$this->wkhtml = Config::get('WKHTMLTOPDF');
45
		$this->Desc = new Description($this->conteneur);
45
		$this->Desc = new Description($this->conteneur);
46
		$this->Ecolo = new Ecologie($this->conteneur);
46
		$this->Ecolo = new Ecologie($this->conteneur);
47
		$this->Ethno = new Ethnobotanique($this->conteneur);
47
		$this->Ethno = new Ethnobotanique($this->conteneur);
48
		$this->Illus = new Illustrations($this->conteneur);
48
		$this->Illus = new Illustrations($this->conteneur);
49
		$this->Nomen = new Nomenclature($this->conteneur);
49
		$this->Nomen = new Nomenclature($this->conteneur);
50
		$this->Stat = new Statut($this->conteneur);
50
		$this->Stat = new Statut($this->conteneur);
51
		$this->Biblio = new Bibliographie($this->conteneur);
51
		$this->Biblio = new Bibliographie($this->conteneur);
52
		$this->Reparti = new Repartition($this->conteneur);
52
		$this->Reparti = new Repartition($this->conteneur);
53
		$this->piedepage = Config::get('chemin_modules').'pdf_export/squelettes/footer.html';
53
		$this->piedepage = Config::get('chemin_modules').'pdf_export/squelettes/footer.html';
54
	}
54
	}
55
 
55
 
56
	private function chargerClassesOnglets($classe) {
56
	private function chargerClassesOnglets($classe) {
57
		$base = dirname(__FILE__).DS;
57
		$base = dirname(__FILE__).DS;
58
		$cheminFormateurs = $base.'../fiche/formateurs'.DS;
58
		$cheminFormateurs = $base.'../fiche/formateurs'.DS;
59
		$dossiers = array($base, $cheminFormateurs);
59
		$dossiers = array($base, $cheminFormateurs);
60
		foreach ($dossiers as $chemin) {
60
		foreach ($dossiers as $chemin) {
61
			$fichierATester = $chemin.$classe.'.php';
61
			$fichierATester = $chemin.$classe.'.php';
62
			if (file_exists($fichierATester)) {
62
			if (file_exists($fichierATester)) {
63
				include_once $fichierATester;
63
				include_once $fichierATester;
64
				return null;
64
				return null;
65
			}
65
			}
66
		}
66
		}
67
	}
67
	}
68
 
68
 
69
	private function getNomRetenu() {
69
	private function getNomRetenu() {
70
		$nom_retenu = $this->conteneur->getNomCourant()->getNomRetenu()->get('nom_sci');
70
		$nom_retenu = $this->conteneur->getNomCourant()->getNomRetenu()->get('nom_sci');
71
		return $nom_retenu;
71
		return $nom_retenu;
72
	}
72
	}
73
 
73
 
74
	private function getNomRetenuHTML() {
74
	private function getNomRetenuHTML() {
75
		$nom_retenu = '<span class="italique">'
75
		$nom_retenu = '<span class="italique">'
76
			.$this->conteneur->getNomCourant()->getNomRetenu()->get('nom_sci')
76
			.$this->conteneur->getNomCourant()->getNomRetenu()->get('nom_sci')
77
			.'</span> '.$this->conteneur->getNomCourant()->getNomRetenu()->get('auteur');
77
			.'</span> '.$this->conteneur->getNomCourant()->getNomRetenu()->get('auteur');
78
		return $nom_retenu;
78
		return $nom_retenu;
79
	}
79
	}
80
 
80
 
81
	private function getNomFichierValide(){
81
	private function getNomFichierValide(){
82
		$nom_retenu = $this->conteneur->getNomCourant()->getNomRetenu()->get('nom_sci');
82
		$nom_retenu = $this->conteneur->getNomCourant()->getNomRetenu()->get('nom_sci');
83
		$nom_retenu = str_replace(' ','_',$nom_retenu );
83
		$nom_retenu = str_replace(' ','_',$nom_retenu );
84
		$nom_retenu = preg_replace('/[\(\)\.\[\]]/','',$nom_retenu );
84
		$nom_retenu = preg_replace('/[\(\)\.\[\]]/','',$nom_retenu );
85
		return $nom_retenu;
85
		return $nom_retenu;
86
	}
86
	}
87
 
87
 
88
	private function capturerParametres() {
88
	private function capturerParametres() {
89
		if (isset($_GET['num_nom'])) {
89
		if (isset($_GET['num_nom'])) {
90
			$this->parametres['num_nom'] = $_GET['num_nom'];
90
			$this->parametres['num_nom'] = $_GET['num_nom'];
91
		}
91
		}
92
		if (isset($_GET['nom'])) {
92
		if (isset($_GET['nom'])) {
93
			$this->parametres['nom'] = $_GET['nom'];
93
			$this->parametres['nom'] = $_GET['nom'];
94
		}
94
		}
95
		if (isset($_GET['type_nom'])) {
95
		if (isset($_GET['type_nom'])) {
96
			$this->parametres['type_nom'] = $_GET['type_nom'];
96
			$this->parametres['type_nom'] = $_GET['type_nom'];
97
		}
97
		}
98
		if (isset($_GET['referentiel'])) {
98
		if (isset($_GET['referentiel'])) {
99
			$this->parametres['referentiel'] = $_GET['referentiel'];
99
			$this->parametres['referentiel'] = $_GET['referentiel'];
100
		}
100
		}
101
		if (isset($_GET['niveau'])) {
101
		if (isset($_GET['niveau'])) {
102
			Registre::set('parametres.niveau', $_GET['niveau']);
102
			Registre::set('parametres.niveau', $_GET['niveau']);
103
		}
103
		}
104
		if (isset($_GET['onglet'])) {
104
		if (isset($_GET['onglet'])) {
105
			$this->onglet = $_GET['onglet'];
105
			$this->onglet = $_GET['onglet'];
106
		}
106
		}
107
	}
107
	}
108
 
108
 
109
	private function capturerParametresFormulaire() {
109
	private function capturerParametresFormulaire() {
110
		if (!empty($_POST['bloc'])) {
110
		if (!empty($_POST['bloc'])) {
111
			$this->blocs = $_POST['bloc'];
111
			$this->blocs = $_POST['bloc'];
112
		} else {
112
		} else {
113
			$this->blocs = array('description', 'ecologie', 'ethnobotanique',
113
			$this->blocs = array('description', 'ecologie', 'ethnobotanique',
114
								 'statuts', 'illustrations', 'bibliographie',
114
								 'statuts', 'illustrations', 'bibliographie',
115
								 'repartition', 'nomenclature');
115
								 'repartition', 'nomenclature');
116
		}
116
		}
117
	}
117
	}
118
 
118
 
119
	public function executerActionParDefaut() {
119
	public function executerActionParDefaut() {
120
		$this->executerPdfExport();
120
		$this->executerPdfExport();
121
	}
121
	}
122
 
122
 
123
	public function executerPdfExport(){
123
	public function executerPdfExport(){
124
		$this->capturerParametresFormulaire();
124
		$this->capturerParametresFormulaire();
125
		$donnees = $this->obtenirDonnees();
125
		$donnees = $this->obtenirDonnees();
126
		$this->construireHtml($donnees);
126
		$this->construireHtml($donnees);
127
		if ($this->transformerHtmlEnPdf()) {
127
		if ($this->transformerHtmlEnPdf()) {
128
			$this->envoyerPdfAuNavigateur();
128
			$this->envoyerPdfAuNavigateur();
129
		} else {
129
		} else {
130
			die('Erreur de generation du fichier PDF');
130
			die('Erreur de generation du fichier PDF');
131
		}
131
		}
132
		// important, autrement l'exécution de papyrus continue
132
		// important, autrement l'exécution de papyrus continue
133
		// et du HTML inutile est ajouté à la fin du fichier PDF
133
		// et du HTML inutile est ajouté à la fin du fichier PDF
134
		exit;
134
		exit;
135
	}
135
	}
136
 
136
 
137
	private function construireHtml($donnees) {
137
	private function construireHtml($donnees) {
138
		$this->html = $this->getVue('pdf_header', $donnees);
138
		$this->html = $this->getVue('pdf_header', $donnees);
139
		foreach ($this->blocs as $bloc) {
139
		foreach ($this->blocs as $bloc) {
140
			$this->ajouterHtml($bloc, $donnees);
140
			$this->ajouterHtml($bloc, $donnees);
141
		}
141
		}
142
		$this->html .= '</body></html>';
142
		$this->html .= '</body></html>';
143
	}
143
	}
144
 
144
 
145
	private function ajouterHtml($bloc, $donnees) {
145
	private function ajouterHtml($bloc, $donnees) {
146
		if (!empty($donnees[$bloc])) {
146
		if (!empty($donnees[$bloc])) {
147
			$this->html .= $this->getVue('pdf_'.$bloc, $donnees);
147
			$this->html .= $this->getVue('pdf_'.$bloc, $donnees);
148
		}
148
		}
149
	}
149
	}
150
 
150
 
151
//+-------------------------------------récupération des données---------------------------------------------+
151
//+-------------------------------------récupération des données---------------------------------------------+
152
	private function obtenirDonnees() {
152
	private function obtenirDonnees() {
153
		$donnees = array();
153
		$donnees = array();
154
		$version = $this->Nomen->obtenirVersionDonnees();
154
		$version = $this->Nomen->obtenirVersionDonnees();
155
		$donnees['donnees_pdf'] = array(
155
		$donnees['donnees_pdf'] = array(
156
			'nom' => $this->getNomRetenuHTML(),
156
			'nom' => $this->getNomRetenuHTML(),
157
			'chemin_css' => Config::get('url_css_pdf'),
157
			'chemin_css' => Config::get('url_css_pdf'),
158
			'version' => $version['version']);
158
			'version' => $version['version']);
159
		$donnees['description'] = $this->Desc->obtenirDonneesExport();
159
		$donnees['description'] = $this->Desc->obtenirDonneesExport();
160
		$donnees['ecologie'] = $this->Ecolo->obtenirDonneesExport();
160
		$donnees['ecologie'] = $this->Ecolo->obtenirDonneesExport();
161
		$donnees['statuts'] = $this->Stat->obtenirDonnees();
161
		$donnees['statuts'] = $this->Stat->obtenirDonnees();
162
		$donnees['ethnobotanique'] = $this->Ethno->obtenirDonnees();
162
		$donnees['ethnobotanique'] = $this->Ethno->obtenirDonnees();
163
		$donnees['illustrations'] = $this->Illus->obtenirDonneesExport();
163
		$donnees['illustrations'] = $this->Illus->obtenirDonneesExport();
164
		$donnees['nomenclature'] = $this->Nomen->obtenirDonnees();
164
		$donnees['nomenclature'] = $this->Nomen->obtenirDonnees();
165
		$donnees['repartition'] = $this->Reparti->obtenirDonneesExport();
165
		$donnees['repartition'] = $this->Reparti->obtenirDonneesExport();
166
		$donnees['bibliographie'] = $this->Biblio->obtenirDonnees();
166
		$donnees['bibliographie'] = $this->Biblio->obtenirDonnees();
167
		$donnees['premier'] = $this->blocs[0];// pour page-break : éviter 1ere page vide si bloc trop long
167
		$donnees['premier'] = $this->blocs[0];// pour page-break : éviter 1ere page vide si bloc trop long
168
		return $donnees;
168
		return $donnees;
169
	}
169
	}
170
 
170
 
171
//+------------------------------------------------export en pdf---------------------------------------------+
171
//+------------------------------------------------export en pdf---------------------------------------------+
172
	private function envoyerPdfAuNavigateur() {
172
	private function envoyerPdfAuNavigateur() {
173
		$nom_fichier = $this->getNomFichierValide();
173
		$nom_fichier = $this->getNomFichierValide();
-
 
174
		//readfile($this->fichier_html); exit;
174
		header('Content-type: application/pdf');
175
		header('Content-type: application/pdf');
175
		header('Content-Disposition: attachment; filename='.$nom_fichier.'.pdf');
176
		header('Content-Disposition: attachment; filename='.$nom_fichier.'.pdf');
176
		readfile($this->fichier_pdf);
177
		readfile($this->fichier_pdf);
177
		unlink($this->fichier_html);
178
		//unlink($this->fichier_html);
178
		unlink($this->fichier_pdf);
179
		//unlink($this->fichier_pdf);
179
	}
180
	}
180
 
181
 
181
	//version WKHTMLtoPDF en ligne de commande
182
	//version WKHTMLtoPDF en ligne de commande
182
	private function transformerHtmlEnPdf() {
183
	private function transformerHtmlEnPdf() {
183
		$nom_fichier = $this->getNomFichierValide();
184
		$nom_fichier = $this->getNomFichierValide();
184
		$time = $_SERVER['REQUEST_TIME'] ;
185
		$time = $_SERVER['REQUEST_TIME'] ;
185
		$this->fichier_html = $this->chemin_pdf.''.$nom_fichier.'-'.$time.'.html';
186
		$this->fichier_html = $this->chemin_pdf.''.$nom_fichier.'-'.$time.'.html';
186
		$this->fichier_pdf = $this->chemin_pdf.''.$nom_fichier.'-'.$time.'.pdf';
187
		$this->fichier_pdf = $this->chemin_pdf.''.$nom_fichier.'-'.$time.'.pdf';
187
		$nom = $this->getNomRetenu();
188
		$nom = $this->getNomRetenu();
188
		file_put_contents($this->fichier_html, $this->html);
189
		file_put_contents($this->fichier_html, $this->html);
189
		$commande =	"{$this->wkhtml}  --replace 'nom' '$nom' --encoding utf-8  --footer-html {$this->piedepage} {$this->fichier_html} {$this->fichier_pdf}";
190
		$commande =	"{$this->wkhtml}  --replace 'nom' '$nom' --encoding utf-8  --footer-html {$this->piedepage} {$this->fichier_html} {$this->fichier_pdf}";
190
		$ret = -1;
191
		$ret = -1;
191
		$debug = array();
192
		$debug = array();
192
		exec($commande, $debug, $ret);
193
		exec($commande, $debug, $ret);
193
		//print_r( $debug ); echo $ret;
194
		//print_r( $debug ); echo $ret;
194
		return ( $ret == 0 );
195
		return ( $ret == 0 );
195
	}
196
	}
196
}
197
}
197
?>
198
?>