Subversion Repositories eFlore/Applications.eflore-consultation

Rev

Rev 1499 | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1499 Rev 1503
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
 
21
 
22
	const DUREE_DE_VIE_PDF = 86400;// 3600 * 24 * 2 = 172 800
22
	const DUREE_DE_VIE_PDF = 86400;// 3600 * 24 * 2 = 172 800
23
	const DUREE_DE_VIE_HTML = 60;
23
	const DUREE_DE_VIE_HTML = 60;
24
 
24
 
25
	private $Conteneur;
25
	private $Conteneur;
26
	private $parametres = array();
26
	private $parametres = array();
27
	private $chemin_pdf;
27
	private $chemin_pdf;
28
	private $html;
28
	private $html;
29
	private $wkhtml;
29
	private $wkhtml;
30
	private $piedepage;
30
	private $piedepage;
31
	private $fichier_pdf;
31
	private $fichier_pdf;
32
	private $blocs = array();
32
	private $blocs = array();
33
 
33
 
34
	private $Desc;
34
	private $Desc;
35
	private $Ecolo;
35
	private $Ecolo;
36
	private $Ethno;
36
	private $Ethno;
37
	private $Illus;
37
	private $Illus;
38
	private $Nomen;
38
	private $Nomen;
39
	private $Reparti;
39
	private $Reparti;
40
	private $Stat;
40
	private $Stat;
41
	private $Biblio;
41
	private $Biblio;
42
 
42
 
43
	public function initialiser() {
43
	public function initialiser() {
44
		spl_autoload_register(array($this, 'chargerClassesOnglets'));
44
		spl_autoload_register(array($this, 'chargerClassesOnglets'));
45
		$this->capturerParametres();
45
		$this->capturerParametres();
46
		$this->conteneur = new Conteneur($this->parametres);
46
		$this->conteneur = new Conteneur($this->parametres);
47
		$this->chemin_pdf = Config::get('dossier_pdf');
47
		$this->chemin_pdf = Config::get('dossier_pdf');
48
		$this->wkhtml = Config::get('WKHTMLTOPDF');
48
		$this->wkhtml = Config::get('WKHTMLTOPDF');
49
		$this->Desc = new Description($this->conteneur);
49
		$this->Desc = new Description($this->conteneur);
50
		$this->Ecolo = new Ecologie($this->conteneur);
50
		$this->Ecolo = new Ecologie($this->conteneur);
51
		$this->Ethno = new Ethnobotanique($this->conteneur);
51
		$this->Ethno = new Ethnobotanique($this->conteneur);
52
		$this->Illus = new Illustrations($this->conteneur);
52
		$this->Illus = new Illustrations($this->conteneur);
53
		$this->Nomen = new Nomenclature($this->conteneur);
53
		$this->Nomen = new Nomenclature($this->conteneur);
54
		$this->Stat = new Statut($this->conteneur);
54
		$this->Stat = new Statut($this->conteneur);
55
		$this->Biblio = new Bibliographie($this->conteneur);
55
		$this->Biblio = new Bibliographie($this->conteneur);
56
		$this->Reparti = new Repartition($this->conteneur);
56
		$this->Reparti = new Repartition($this->conteneur);
57
		$this->piedepage = Config::get('chemin_modules').'pdf_export/squelettes/footer.html';
57
		$this->piedepage = Config::get('chemin_modules').'pdf_export/squelettes/footer.html';
58
	}
58
	}
59
 
59
 
60
	private function chargerClassesOnglets($classe) {
60
	private function chargerClassesOnglets($classe) {
61
		$base = dirname(__FILE__).DS;
61
		$base = dirname(__FILE__).DS;
62
		$cheminFormateurs = $base.'../fiche/formateurs'.DS;
62
		$cheminFormateurs = $base.'../fiche/formateurs'.DS;
63
		$dossiers = array($base, $cheminFormateurs);
63
		$dossiers = array($base, $cheminFormateurs);
64
		foreach ($dossiers as $chemin) {
64
		foreach ($dossiers as $chemin) {
65
			$fichierATester = $chemin.$classe.'.php';
65
			$fichierATester = $chemin.$classe.'.php';
66
			if (file_exists($fichierATester)) {
66
			if (file_exists($fichierATester)) {
67
				include_once $fichierATester;
67
				include_once $fichierATester;
68
				return null;
68
				return null;
69
			}
69
			}
70
		}
70
		}
71
	}
71
	}
72
 
72
 
73
	private function getNomRetenu() {
73
	private function getNomRetenu() {
74
		$nom_retenu = $this->conteneur->getNomCourant()->getNomRetenu()->get('nom_sci');
74
		$nom_retenu = $this->conteneur->getNomCourant()->getNomRetenu()->get('nom_sci');
75
		return $nom_retenu;
75
		return $nom_retenu;
76
	}
76
	}
77
 
77
 
78
	private function getNomRetenuHTML() {
78
	private function getNomRetenuHTML() {
79
		$nom_retenu = '<span class="italique">'
79
		$nom_retenu = '<span class="italique">'
80
			.$this->conteneur->getNomCourant()->getNomRetenu()->get('nom_sci')
80
			.$this->conteneur->getNomCourant()->getNomRetenu()->get('nom_sci')
81
			.'</span> '.$this->conteneur->getNomCourant()->getNomRetenu()->get('auteur');
81
			.'</span> '.$this->conteneur->getNomCourant()->getNomRetenu()->get('auteur');
82
		return $nom_retenu;
82
		return $nom_retenu;
83
	}
83
	}
84
 
84
 
85
	private function getNomFichierValide(){
85
	private function getNomFichierValide(){
86
		$nom_retenu = $this->conteneur->getNomCourant()->getNomRetenu()->get('nom_sci');
86
		$nom_retenu = $this->conteneur->getNomCourant()->getNomRetenu()->get('nom_sci');
87
		$nom_retenu = str_replace(' ','_',$nom_retenu );
87
		$nom_retenu = str_replace(' ','_',$nom_retenu );
88
		$nom_retenu = preg_replace('/[\(\)\.\[\]]/','',$nom_retenu );
88
		$nom_retenu = preg_replace('/[\(\)\.\[\]]/','',$nom_retenu );
89
		return $nom_retenu;
89
		return $nom_retenu;
90
	}
90
	}
91
 
91
 
92
	private function capturerParametres() {
92
	private function capturerParametres() {
93
		if (isset($_GET['num_nom'])) {
93
		if (isset($_GET['num_nom'])) {
94
			$this->parametres['num_nom'] = $_GET['num_nom'];
94
			$this->parametres['num_nom'] = $_GET['num_nom'];
95
		}
95
		}
96
		if (isset($_GET['nom'])) {
96
		if (isset($_GET['nom'])) {
97
			$this->parametres['nom'] = $_GET['nom'];
97
			$this->parametres['nom'] = $_GET['nom'];
98
		}
98
		}
99
		if (isset($_GET['type_nom'])) {
99
		if (isset($_GET['type_nom'])) {
100
			$this->parametres['type_nom'] = $_GET['type_nom'];
100
			$this->parametres['type_nom'] = $_GET['type_nom'];
101
		}
101
		}
102
		if (isset($_GET['referentiel'])) {
102
		if (isset($_GET['referentiel'])) {
103
			$this->parametres['referentiel'] = $_GET['referentiel'];
103
			$this->parametres['referentiel'] = $_GET['referentiel'];
104
		}
104
		}
105
		if (isset($_GET['niveau'])) {
105
		if (isset($_GET['niveau'])) {
106
			Registre::set('parametres.niveau', $_GET['niveau']);
106
			Registre::set('parametres.niveau', $_GET['niveau']);
107
		}
107
		}
108
		if (isset($_GET['onglet'])) {
108
		if (isset($_GET['onglet'])) {
109
			$this->onglet = $_GET['onglet'];
109
			$this->onglet = $_GET['onglet'];
110
		}
110
		}
111
	}
111
	}
112
 
112
 
113
	private function capturerParametresFormulaire() {
113
	private function capturerParametresFormulaire() {
114
		$this->blocs = array('description', 'ecologie', 'ethnobotanique', 'statuts', 'illustrations',
114
		$this->blocs = array('description', 'ecologie', 'ethnobotanique', 'statuts', 'illustrations',
115
			'bibliographie', 'repartition', 'nomenclature');
115
			'bibliographie', 'repartition', 'nomenclature');
116
		if (!empty($_POST['bloc'])) {
116
		if (!empty($_POST['bloc'])) {
117
			$this->blocs = $_POST['bloc'];
117
			$this->blocs = $_POST['bloc'];
118
		}
118
		}
119
	}
119
	}
120
 
120
 
121
	public function executerActionParDefaut() {
121
	public function executerActionParDefaut() {
122
		$this->executerPdfExport();
122
		$this->executerPdfExport();
123
	}
123
	}
124
 
124
 
125
	public function executerPdfExport(){
125
	public function executerPdfExport(){
126
		$this->capturerParametresFormulaire();
126
		$this->capturerParametresFormulaire();
127
		$hash = crc32($this->parametres['referentiel'].'-'.implode('-', $this->blocs));
127
		$hash = crc32($this->parametres['referentiel'].'-'.implode('-', $this->blocs));
128
		$nom_fichier = $this->getNomFichierValide().'-'.$hash;
128
		$nom_fichier = $this->getNomFichierValide().'-'.$hash;
129
		
129
		
130
		// le dossier cache existe normalement, mais le sous dossier pdf
130
		// le dossier cache existe normalement, mais le sous dossier pdf
131
		// est parfois effacé par erreur lors des suppressions de cache
131
		// est parfois effacé par erreur lors des suppressions de cache
132
		// il vaut mieux donc le recréer s'il n'existe pas
132
		// il vaut mieux donc le recréer s'il n'existe pas
133
		if(!file_exists($this->chemin_pdf)) {
133
		if(!file_exists($this->chemin_pdf)) {
134
			mkdir($this->chemin_pdf, 0755, true);
134
			mkdir($this->chemin_pdf, 0755, true);
135
		}
135
		}
136
 
136
 
137
		$this->fichier_html = $this->chemin_pdf.''.$nom_fichier.'.html';
137
		$this->fichier_html = $this->chemin_pdf.''.$nom_fichier.'.html';
138
		$this->fichier_pdf = $this->chemin_pdf.''.$nom_fichier.'.pdf';
138
		$this->fichier_pdf = $this->chemin_pdf.''.$nom_fichier.'.pdf';
139
 
139
 
140
		if (file_exists($this->fichier_pdf) == false) {
140
		if (file_exists($this->fichier_pdf) == false) {
141
			$donnees = $this->obtenirDonnees();
141
			$donnees = $this->obtenirDonnees();
142
			$this->construireHtml($donnees);
142
			$this->construireHtml($donnees);
143
			if ($this->transformerHtmlEnPdf() == false) {
143
			if ($this->transformerHtmlEnPdf() == false) {
144
				die('Erreur de generation du fichier PDF');
144
				die('Erreur de generation du fichier PDF');
145
			}
145
			}
146
		}
146
		}
147
		$this->envoyerPdfAuNavigateur();
147
		$this->envoyerPdfAuNavigateur();
148
		$this->nettoyerFichiersTmp();
148
		$this->nettoyerFichiersTmp();
149
		// ATTENTION : on doit stopper l'exécution de Papyrus sinon du HTML inutile est ajouté à la fin du fichier PDF
149
		// ATTENTION : on doit stopper l'exécution de Papyrus sinon du HTML inutile est ajouté à la fin du fichier PDF
150
		exit;
150
		exit;
151
	}
151
	}
152
 
152
 
153
	private function construireHtml($donnees) {
153
	private function construireHtml($donnees) {
154
		$this->html = $this->getVue('pdf_header', $donnees);
154
		$this->html = $this->getVue('pdf_header', $donnees);
155
		foreach ($this->blocs as $bloc) {
155
		foreach ($this->blocs as $bloc) {
156
			$this->ajouterHtml($bloc, $donnees);
156
			$this->ajouterHtml($bloc, $donnees);
157
		}
157
		}
158
		$this->html .= '</body></html>';
158
		$this->html .= '</body></html>';
159
	}
159
	}
160
 
160
 
161
	private function ajouterHtml($bloc, $donnees) {
161
	private function ajouterHtml($bloc, $donnees) {
162
		if (!empty($donnees[$bloc])) {
162
		if (!empty($donnees[$bloc])) {
163
			$this->html .= $this->getVue('pdf_'.$bloc, $donnees);
163
			$this->html .= $this->getVue('pdf_'.$bloc, $donnees);
164
		}
164
		}
165
	}
165
	}
166
 
166
 
167
//+-------------------------------------récupération des données---------------------------------------------+
167
//+-------------------------------------récupération des données---------------------------------------------+
168
	private function obtenirDonnees() {
168
	private function obtenirDonnees() {
169
		$donnees = array();
169
		$donnees = array();
170
		$version = $this->Nomen->obtenirVersionDonnees();
170
		$version = $this->Nomen->obtenirVersionDonnees();
171
		$donnees['donnees_pdf'] = array(
171
		$donnees['donnees_pdf'] = array(
172
			'nom' => $this->getNomRetenuHTML(),
172
			'nom' => $this->getNomRetenuHTML(),
173
			'chemin_css' => Config::get('url_css_pdf'),
173
			'chemin_css' => Config::get('url_css_pdf'),
174
			'version' => $version['version']);
174
			'version' => $version['version']);
175
		$donnees['description'] = $this->Desc->obtenirDonneesExport();
175
		$donnees['description'] = $this->Desc->obtenirDonneesExport();
176
		$donnees['ecologie'] = $this->Ecolo->obtenirDonneesExport();
176
		$donnees['ecologie'] = $this->Ecolo->obtenirDonneesExport();
177
		$donnees['statuts'] = $this->Stat->obtenirDonnees();
177
		$donnees['statuts'] = $this->Stat->obtenirDonneesExport();
178
		$donnees['ethnobotanique'] = $this->Ethno->obtenirDonnees();
178
		$donnees['ethnobotanique'] = $this->Ethno->obtenirDonnees();
179
		$donnees['illustrations'] = $this->Illus->obtenirDonneesExport();
179
		$donnees['illustrations'] = $this->Illus->obtenirDonneesExport();
180
		$donnees['nomenclature'] = $this->Nomen->obtenirDonnees();
180
		$donnees['nomenclature'] = $this->Nomen->obtenirDonnees();
181
		$donnees['repartition'] = $this->Reparti->obtenirDonneesExport();
181
		$donnees['repartition'] = $this->Reparti->obtenirDonneesExport();
182
		$donnees['bibliographie'] = $this->Biblio->obtenirDonnees();
182
		$donnees['bibliographie'] = $this->Biblio->obtenirDonnees();
183
		$donnees['premier'] = $this->blocs[0];// pour page-break : éviter 1ere page vide si bloc trop long
183
		$donnees['premier'] = $this->blocs[0];// pour page-break : éviter 1ere page vide si bloc trop long
184
		return $donnees;
184
		return $donnees;
185
	}
185
	}
186
 
186
 
187
//+------------------------------------------------export en pdf---------------------------------------------+
187
//+------------------------------------------------export en pdf---------------------------------------------+
188
	private function envoyerPdfAuNavigateur() {
188
	private function envoyerPdfAuNavigateur() {
189
		$nom_fichier = $this->getNomFichierValide();
189
		$nom_fichier = $this->getNomFichierValide();
190
		header('Content-type: application/pdf');
190
		header('Content-type: application/pdf');
191
		header('Content-Disposition: attachment; filename='.$nom_fichier.'.pdf');
191
		header('Content-Disposition: attachment; filename='.$nom_fichier.'.pdf');
192
		readfile($this->fichier_pdf);
192
		readfile($this->fichier_pdf);
193
	}
193
	}
194
 
194
 
195
	private function nettoyerFichiersTmp() {
195
	private function nettoyerFichiersTmp() {
196
		$dossierStockage = $this->chemin_pdf;
196
		$dossierStockage = $this->chemin_pdf;
197
		if (is_dir($dossierStockage)) {
197
		if (is_dir($dossierStockage)) {
198
			$objets = scandir($dossierStockage);
198
			$objets = scandir($dossierStockage);
199
			if ($objets !== false) {
199
			if ($objets !== false) {
200
				foreach ($objets as $objet) {
200
				foreach ($objets as $objet) {
201
					$chemin = $dossierStockage.$objet;
201
					$chemin = $dossierStockage.$objet;
202
					if (is_file($chemin)) {
202
					if (is_file($chemin)) {
203
						$filemtime = @filemtime($chemin);
203
						$filemtime = @filemtime($chemin);
204
						if ($filemtime !== false) {
204
						if ($filemtime !== false) {
205
							if (substr($chemin, -5) == '.html') {
205
							if (substr($chemin, -5) == '.html') {
206
								$suppression = (time() - $filemtime >= self::DUREE_DE_VIE_HTML) ? true : false;
206
								$suppression = (time() - $filemtime >= self::DUREE_DE_VIE_HTML) ? true : false;
207
							} else {
207
							} else {
208
								$suppression = (time() - $filemtime >= self::DUREE_DE_VIE_PDF) ? true : false;
208
								$suppression = (time() - $filemtime >= self::DUREE_DE_VIE_PDF) ? true : false;
209
							}
209
							}
210
							if ($suppression === true) {
210
							if ($suppression === true) {
211
								unlink($chemin);
211
								unlink($chemin);
212
							}
212
							}
213
						}
213
						}
214
					}
214
					}
215
				}
215
				}
216
			}
216
			}
217
		}
217
		}
218
	}
218
	}
219
 
219
 
220
	//version WKHTMLtoPDF en ligne de commande
220
	//version WKHTMLtoPDF en ligne de commande
221
	private function transformerHtmlEnPdf() {
221
	private function transformerHtmlEnPdf() {
222
		$nom = $this->getNomRetenu();
222
		$nom = $this->getNomRetenu();
223
		file_put_contents($this->fichier_html, $this->html);
223
		file_put_contents($this->fichier_html, $this->html);
224
		$commande =	"xvfb-run {$this->wkhtml}  --replace 'nom' '$nom' --encoding utf-8  --footer-html {$this->piedepage} {$this->fichier_html} {$this->fichier_pdf}";
224
		$commande =	"xvfb-run {$this->wkhtml}  --replace 'nom' '$nom' --encoding utf-8  --footer-html {$this->piedepage} {$this->fichier_html} {$this->fichier_pdf}";
225
		$ret = -1;
225
		$ret = -1;
226
		$debug = array();
226
		$debug = array();
227
		exec($commande, $debug, $ret);
227
		exec($commande, $debug, $ret);
228
		//print_r( $debug ); echo $ret;
228
		//print_r( $debug ); echo $ret;
229
		$ok = ($ret == 0 || $ret == 2) ? true : false;
229
		$ok = ($ret == 0 || $ret == 2) ? true : false;
230
		return $ok;
230
		return $ok;
231
	}
231
	}
232
}
232
}
233
?>
233
?>