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