PHP-Introduction à la génération de graphiques, fichiers Excel et PDF

Transcription

PHP-Introduction à la génération de graphiques, fichiers Excel et PDF
Cours de Programmation Internet
PHP-Introduction à la génération de graphiques, fichiers Excel et PDF
Magali Contensin - CNRS
PHP est principalement utilisé pour générer des pages Web au format HTML ou XHTML mais il permet
également d’envoyer vers le navigateur du client des données dans d’autres formats (textes ou binaires).
Génération de graphiques
La bibliothèque graphique orientée objet JpGraph permet de générer très facilement des graphiques (courbes,
histogrammes, camemberts 2D et 3D, ...). Les images générées peuvent être stockées dans un fichier sur le
serveur ou être envoyées au navigateur. Les formats d’images possibles sont : png, gif, jpeg et wbmp.
Génération de fichiers pour le tableur Excel
Le module PEAR Spreadsheet_Excel_Writer permet de créer des fichiers Excel en PHP. PEAR (PHP
Extension and Application Repository) gère la distribution de composants PHP appelés packages (ce sont des
briques logicielles écrites en PHP objet).
Génération de PDF
FPDF est une classe PHP permettant de générer des fichiers au format PDF (gestion des en-têtes et pieds de
pages, couleur, inclusion d’images au format png et jpeg, format de page, liens, marges, ...).
Sources sur : http://crfb.univ-mrs.fr/~magali/coursPHP
©Magali Contensin – avril 2005 – CNRS
1/10
1 Génération de graphiques
Pour générer des graphiques, nous utiliserons la bibliothèque graphique orientée objet JpGraph. Celle-ci
propose des classes pour chaque type de graphique.
1.1 Installation de JpGraph
Vérifier la configuration requise
JpGraph s’appuie sur la bibliothèque GD de Thomas Boutell version 1.8.x ou > 2.15 (la version conseillée pour
JpGraph v1.20.3 est GD 2.28). Si PHP n’a pas été compilé avec cette bibliothèque il ne sera pas possible
d’utiliser JpGraph. Pour savoir si PHP est compilé avec GD et si la version de la bibliothèque est suffisante
exécuter le script ci-dessous :
<?php
phpinfo() ;
?>
Dans la page Web affichée il doit y avoir un tableau concernant gd. Celui-ci fournit les informations quant aux
formats d’images possibles (dans l’exemple ci-dessous il est indiqué que 4 formats sont supportés).
JpGraph fonctionne avec PHP >= 4.3.5 (la version conseillée pour JpGraph v1.20.3 est PHP 4.4.0). La
fonction phpinfo() permet également de connaître la version de PHP :
Télécharger
Télécharger la version 1.x sur le site pour PHP4 (version stable en avril 2006 : 1.20.3) ou la version 2.x pour
PHP5 sur le site : http://www.aditus.nu/jpgraph/index.php
Installer
Décompresser le fichier téléchargé et copier le répertoire dans le répertoire de travail ou dans un des répertoires
spécifié par la directive include_path (cette directive est affichée par phpinfo).
Magali Contensin – avril 2006 – CNRS
2/10
1.2 Créer un graphique
La création d’un graphique suit toujours le même schéma :
- Inclusion de :
o la bibliothèque principale jpgraph.php (constantes, classes)
o une ou plusieurs classes selon le graphique à générer
- Création du graphique (largeur et hauteur, titre, ombrage, couleur, …)
- Création de l’objet (ou des objets) à placer dans le graphique
- Ajout de l’objet (ou des objets) au graphique
- Envoi du graphique
300
<?php
// inclusions
require("jpgraph/jpgraph.php");
require("jpgraph/jpgraph_line.php");
// creation du graphique
$graph = new Graph(300, 200);
$graph->SetScale("intint");
200
// creation de l'objet courbe 1
$ydata = array(2, 6, 12, 6, 8, 1,
9, 13, 5, 7, 14);
$courbe1 = new LinePlot($ydata);
$courbe1->SetColor("red");
// creation de l'objet courbe 2
$ydata2 = array(8, 5, 4, 3, 1, 4, 8, 10, 11, 12, 12.5);
$courbe2 = new LinePlot($ydata2);
$courbe2->SetColor("blue"); // SetColor("#FF0000")
// Ajouter les objets au graphique
$graph->Add($courbe1);
$graph->Add($courbe2);
// Dessiner le graphique
$graph->Stroke(); // argument vide = envoi navigateur, chemin absolu = sauver
?>
La bibliothèque principale jpgraph.php est incluse ainsi que la bibliothèque pour les courbes
jpgraph_line.php. Un graphique de largeur 300 et de hauteur 200 est créé avec une échelle entière sur les
axes x et y. Les échelles disponibles sont lin (linéaires standard), text (pour mettre du texte sur les
graduations en x), log (logarithmique), int (restreint aux entiers). Deux objets courbes de couleurs
différentes sont créés (la liste des valeurs sur l’axe des y est fournie, il est également possible de préciser les
valeurs pour les abscisses) et sont ajoutés au graphique. L’envoi vers le navigateur est réalisé par la dernière
instruction.
Les fichiers à inclure dépendent de l’objet graphique à générer :
jpgraph_line.php
jpgraph_bar.php
©Magali Contensin – avril 2005 – CNRS
jpgraph_pie.php
jpgraph_pie3d.php
jpgraph_scatter.php
jpgraph_radar.php
3/10
1.3 Autres exemples de graphiques
Création d’un histogramme
SetShadow
SetColor
SetMarginColor
SetScale(textint)
SetMargin(g, d, h, b)
<?php
// inclusion des classes
require('jpgraph/jpgraph.php');
require('jpgraph/jpgraph_bar.php');
// donnees des axes Y et X
$ydata = array(15, 6, 30, 6, 12, 2);
$xdata = array('Jan', 'Fev', 'Mar', 'Avr', 'Mai', 'Jui');
// creation du graphique
$graph = new Graph(count($ydata)*50, 200);
$graph->SetScale("textint");
// style
$graph->SetShadow();
$graph->SetColor('white');
$graph->SetMarginColor('gray6');
$graph->SetMargin(40, 30, 20, 40);// marge gauche, droite, haut, bas
// donner des titres et etiquettes
$graph->title->Set("Exemple d'histogramme");
$graph->yaxis->title->Set("nombre");
$graph->xaxis->title->Set("mois");
$graph->xaxis->SetTickLabels($xdata);
$graph->xaxis->SetTextLabelInterval(2);
// creation histogramme
$hist = new BarPlot($ydata);
$hist->SetWidth(1.0) ;
$hist->SetFillGradient("coral1","white", GRAD_MIDVER);
// ajout du composant histogramme au graphique
$graph->Add($hist);
// envoi image au format PNG
$graph->img->SetImgFormat("png"); // formats autorises : png, gif, jpg
$graph->Stroke();
?>
Magali Contensin – avril 2006 – CNRS
4/10
Création d’un camembert 3D
400
SetShadow
SetLegends
SetSize(0.5) =
50% de 400
SetCenter(0.4) = 40% de la largeur
<?php
// inclusion des classes
require('jpgraph/jpgraph.php');
require('jpgraph/jpgraph_pie.php');
// camembert
require('jpgraph/jpgraph_pie3d.php'); // camembert 3D
// creation du graphique
$graph = new PieGraph(400, 200);
$graph->SetShadow();
$graph->title->Set("Netcraft Web Server Survey - fin 2005");
// creation objet camembert
$data = array(20.24, 0.78, 70.98, 2.52);
$legend = array('Microsoft', 'Zeus', 'Apache', 'Sun');
$camembert = new PiePlot3D($data);
$camembert->SetAngle(45); // angle de projection (10 a 85 degres)
$camembert->SetSize(0.5); // entre 0 et 0.5
$camembert->SetCenter(0.4); // on peut definir x et y
$camembert->SetLegends($legend);
$camembert->SetTheme('water'); // earth, water, pastel, sand
// ajout du camembert au graphe
$graph->Add($camembert);
// envoi
$graph->img->SetImgFormat("png");
$graph->Stroke();
?>
10 degrés
©Magali Contensin – avril 2005 – CNRS
45 degrés
85 degrés
5/10
1.4 Afficher l’image dans une page Web
Lorsqu’une image est produite elle peut être stockée sur le serveur (il suffit de passer en paramètre à la méthode
Stroke le nom du fichier d’image) ou envoyée au serveur Web. Le script php qui génère une image ne peut pas
produire une page HTML. L'image (script php) doit être incluse dans une page HTML avec l'élément img.
L’adresse associée à l’image est le nom du script générant le graphique.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>inclusion d'image</title>
</head>
<body>
<p>un graphique comportant deux courbes
<img src="testcourbe.php" alt="courbes">
</p>
</body>
</html>
Documentation
Les classes et méthodes sont documentées dans le sous-répertoire ref du répertoire docs.
Un manuel est disponible dans le sous-répertoire html du répertoire docs
Magali Contensin – avril 2006 – CNRS
6/10
2 Génération de fichiers pour tableurs
2. 1 Solution 1 : CSV (comma-separated values) ou TSV (tabulation…)
Format de fichier :
- une ligne par ligne de tableau
- les champs sont séparés par des virgules (CSV) ou par des tabulations (TSV)
- Type MIME : text/csv pour CSV, text/tab-separated-values pour TSV
<?php
// en tete HTTP
header("Content-type:text/tab-separated-values");
header("Content-Disposition:attachment;filename=testcsv.xls");
// Corps HTTP
echo "cellule
echo "cellule
echo "cellule
?>
: fichier au format CSV
a1\tcellule b1\tcellule c1\n";
a2\tcellule b2\tcellule c2\tcellule d2\n";
a3\tcellule b3\tcellule c3";
Il existe des fonctions PHP pour lire ou écrire des fichiers CSV (fputcsv et fgetcsv). Avec ces fonctions il est
possible de préciser le séparateur
2.2 Solutions 2 : PEAR
Le module PEAR Spreadsheet_Excel_Writer permet de créer un fichier Excel (format Excel 5 – BIFF5)
comportant plusieurs feuilles. Les données ont un style. Il est possible de définir les marges, les dimensions des
colonnes et lignes et les en-têtes et pieds de page. Le module permet d’écrire des formules Excel.
Vérifier la configuration requise
Pour utiliser ce module il faut que PHP soit compilé avec PEAR.
©Magali Contensin – avril 2005 – CNRS
7/10
Télécharger et installer
Télécharger http://pear.php.net/get/Spreadsheet_Excel_Writer-0.8.tgz et
le module OLE-0.5 s’il n’est pas installé http://pear.php.net/get/OLE-0.5.tgz
> pear install Spreadsheet_Excel_Writer-0.8
Exemple
<?php
// 1. inclusion du module Pear pour Excel
require_once 'Spreadsheet/Excel/Writer.php';
// 2. Creation d'un classeur
$classeur = new Spreadsheet_Excel_Writer();
// 3. Creation d'une feuille
$feuille = &$classeur->addWorksheet('feuille 1');
// style en tete de cellule
$th = &$classeur->addFormat(); // pointeur vers $classeur->addFormat
$th->setBold();
// gras
$th->setColor('white');
// texte blanc
$th->setFgColor('red');
// fond de la cellule rouge
$th->setAlign('center');
// alignement left, right, center
// ecriture des donnees dans les cellules
$feuille->write(0, 0, 'Nom', $th);
// ligne 0, colonne 0, format
$feuille->write(0, 1, 'Prenom', $th);
// ligne 0, colonne 1, format
$feuille->write(1, 0, 'Bond');
$feuille->write(1, 1, 'James');
$feuille->write(2, 0, 'Jones');
$feuille->write(2, 1, 'Indiana');
$feuille->write(3, 0, 'Gates');
$feuille->write(3, 1, 'Benjamin');
// 4. Creation d'une deuxieme feuille
$feuille2 = &$classeur->addWorksheet('xxx');
$feuille2->write(0, 0, 'test');
// donnees de la 2eme feuille
// 5. Envoi du fichier au client
$classeur->send('test.xls');
$classeur->close();
?>
Documentation
http://pear.activeventure.com/package/package.fileformats.spreadsheet-excel-writer.intro.html
http://pear.activeventure.com/package/package.fileformats.spreadsheet-excel-writer.intro-format.html
Magali Contensin – avril 2006 – CNRS
8/10
3 Génération de documents PDF
La classe PHP FPDF permet de générer des fichiers au format PDF (gestion des en-tetes et pieds de pages,
couleur, images au format png et jpg, format de page, liens, marges, ...).
Télécharger et installer
Télécharger FPDF : http://www.fpdf.org/en/dl.php?v=153&f=tgz
Placer le répertoire fpdf dans le répertoire de travail ou dans un dans un des répertoires d’inclusion.
Exemple
<?php
// --------- 1. inclusion de la bibliotheque fpdf
require('fpdf/fpdf.php');
// --------- 2. creation d'un document pdf
// Mode (P)ortrait (L)andscape / Unites mm, pt, cm, in / Page A4, Letter, Legal
$doc = new FPDF('P','mm','A4');
// --------- 3. ajout d'une page
$doc->AddPage(); // origine coin haut
$doc->SetFont('Helvetica','',16); //
$doc->SetFillColor(155, 155, 155); //
$doc->SetTextColor(255, 255, 255); //
gauche, position courante 1cm du bord
famille, style (I, U, B, ), taille
couleur du fond
couleur du texte;
// ajout d'un rectangle de texte
// arg 1 largeur (0 = prend toute la largeur), arg 2 hauteur, arg 3 texte
// arg 4 cadre 0, 1, L (left), T, R, B
// arg 5 position apres l'appel (0 droite, 1 nouvelle ligne, 2 en dessous)
// arg 6 : alignement du texte L, R, C, arg 7 : remplissage du fond 0, 1
$doc->Cell(0, 10, 'test pdf', 1, 1, C, 1);
$doc->SetFont('Times','B',12);
$doc->SetTextColor(0, 0, 0);
$doc->Cell(0, 10, 'un autre test', 0, 1, L, 0);
$doc->Cell(0, 10, 'du texte');
// ------- 4. envoi au client
$doc->Output("Test.pdf", I); // envoyer au navigateur sous le nom Test.pdf
?>
©Magali Contensin – avril 2005 – CNRS
9/10
<?php
require('fpdf/fpdf.php');
//------------- classe fille pour redefinir l'en-tete et le pied de page
class monPDF extends FPDF
{
function Header(){
$this->SetFont('Helvetica','B',16);
$this->SetFillColor(155, 155, 155);
$this->SetTextColor(255, 255, 255);
$this->Cell(0, 10, 'C.R.F.B', 1, 1, 'C', 1);
$this->Ln(20);
}
function Footer(){
$this->SetY(-20); // pied de page a 2 cm du bas
$this->SetFont('Times', '', 12);
$d = date("d/m/Y");
$this->Cell(0, 10, $d, T, 0, L);
$this->Cell(0, 10, 'p. '.$this->PageNo().'/{nb}', 0, 0, 'R');
}
}
//------------ creation du document et envoi
$doc = new monPDF('L','mm','A4');
$doc->AliasNbPages(); // alias sur le nb de pages
$doc->AddPage();
$doc->SetFont('Times','',12);
for($i=0; $i<=20; $i++){
$doc->Cell(0, 10, 'ligne '.$i, 0, 1);
}
$doc->Output();
?>
Documentation
Tutorial : http://www.fpdf.org/en/tutorial/index.php
Manuel : http://www.fpdf.org/en/doc/index.php
Magali Contensin – avril 2006 – CNRS
10/10