Enrera
Mòdul 7
Creació i gestió d'entorns web dinàmics (PHP)
  Pràctica
1
2
3
4
   
Exercicis
Exercicis
 
 
 
  Creació de documents pdf
   
 

En aquesta pràctica veurem les possibilitats de crear fitxers PDF de manera dinàmica. Es tracta de veure mínimament alguna de les coses que es poden fer i no pas d'aprofundir-hi.

   
Opcions
   

Per crear documents d'aquest tipus amb el PHP podem trobar diferents possibilitats:

nom descripció webs
clibpdf

- Integrada al PHP
- Cal instal·lació de mòdul
- No totalment lliure

Documentació en castellà (PHP)
FastIO
pdflib - Cal instal·lació de mòdul
- No totalment lliure
PDFlib
R&OS pdf

- Classe (no cal instal·lar mòdul)
- Programari lliure

R&OS pdf class
fpdf - Classe (no cal instal·lar mòdul)
- Programari lliure
Fpdf

Les dues primeres opcions són parcialment comercials i ofereixen un xic més de rapidesa en la generació dels pdf. D'altra banda, cal que estiguin instal·lades en el servidor amb què treballem, cosa que no podrem controlar en cas que es tracti d'un servidor comercial.

La nostra pràctica se centrarà en la darrera de les opcions (Fpdf) pel seu cost, documentació i potència acceptable. D'altra banda, tot i que la pàgina web és en francès o anglès, hi ha la traducció al castellà del manual.

Podeu veure les possibilitats d'aquesta classe anant als tutorials de la seva pàgina web. Igualment, podeu veure les scripts (codis de barres, filigranes, diagrames, etc.) que han creat els seus usuaris.

   
  Classes i objectes
   
Informació

Ja veieu que aquí, i ja abans, ha sortit el concepte de classe. Segurament que esteu familiaritzats amb aquest concepte que el PHP comparteix amb molts d'altres llenguatges de programació orientats a objectes. Aprofundir gaire en aquest aspecte va més enllà dels objectius d'aquest curs, però sí que podem dir també que el PHP proporciona unes funcions destinades al treball amb classes i objectes. Igualment, hi podem afegir que un dels aspectes que s'ha millorat en el PHP 5 (darrera versió fins al moment) és precisament la millora de les capacitats de treball amb objectes.

   
En cas que no hagueu treballat abans amb classes i objectes, podeu veure unes notes introductòries sobre aquest tema que us poden ser d'ajut.
   
 

Un exemple de classe seria la que ens ocupa: fpdf crea un document pdf (un objecte) a partir de les dades que li donem. Remarqueu, a més, que podem estendre les funcionalitats de qualsevol classe, és a dir, la podem dotar de noves característiques que s'acumulen a les que portava de base.

També és interessant de saber que milers de programadors de tot el món creen les seves classes que posen a disposició de la comunitat de manera desinteressada. D'aquesta manera, és probable que trobem classes que fan alguna cosa en concret que ens interessi. La classe amb què treballarem en aquesta pràctica seria un bon exemple del que comentem.

Un dels webs on podeu trobar una gran quantitat de classes interessants, amb actualitzacions diàries i classificades temàticament és http://www.phpclasses.org.

   
   
  Fpdf
   
  Instal·lació
 

Trobarem els fitxers anant al web http://www.fpdf.org o bé en el servei cd-web de la XTEC. Si no esteu connectats a internet, també podeu trobar directament els fitxers corresponents a la versió 1.52, amb la qual treballarem, a /fitxers/m7/fpdf152/fpdf152.zip o bé en el paquet de materials de formació (cd 'Eines').

Per instal·lar-los, simplement cal que creem un directori anomenat fpdf al directori arrel de les pràctiques (\www\prac_d116\fpdf, si heu seguit la instla·lació recomanda). Així, quedarà: C:\Archivos de programa\EasyPHP1-7\www\prac_d116\fpdf. Després hi descomprimim el fitxer que hem baixat.

Ara, si us trobeu en l'ordinador en què heu instal·lat el servidor i està en funcionament, podeu veure els tutorials entrant l'adreça http://localhost/prac_d116/fpdf/tutoriel/index.htm

   
Atenció !
Donem per suposat que teniu instal·lat en el vostre ordinador l'Acrobat Reader. Sense aquest programa, no podreu llegir, òbviament, els fitxers pdf generats. En cas que no sigui així, recordeu que des de http://www.acrobat.com el podeu baixar.
   
 

 

  Un llistat en pdf
   
Pràctica

Un cop tenim instal·lats els elements necessaris, crearem un llistat en pdf a partir d'un document de text (alumnat.txt) que hem exportat del WinSec. Aquest document conté les dades de l'alumnat d'un centre, en format de text, amb els camps separats per una coma (,) i amb els camps de text iniciats i acabats amb cometes. Podeu veure més detalls sobre la consulta clicant aquí.

Mitjançant el codi que proposem, crearem una taula en què s'alternaran els colors de fons i que contindrà les primeres dades de cada alumne/a del fitxer de text (DNI, cognom1, cognom2, nom, pla). A més, hi afegirem una primera columna amb un comptador.

El resultat final serà semblant al de la imatge següent:

Figura 7.3.1: Llistat d'alumnes

   
   
  Crear el llistat
 

Primerament, cal que aconseguim el fitxer alumnat en el format que hem especificat. Podeu fer la vostra consulta amb el Winsec, tal com s'ha explicat més amunt, o podeu baixar-vos un fitxer alumnat.txt que hem preparat.

   
Atenció !
Recordeu que amb algun navegador cal que cliqueu sobre l'enllaç amb el botó dret del ratolí, triant l'opció Guardar destino como... per baixar els fitxers.
   
 

Tingueu present que el fitxer alumnat.txt s'ha de trobar al mateix directori en què hi hagi l'script que ara explicarem.

Copieu el codi que teniu a continuació en l'editor i deseu-lo amb el nom de m7p3.php

   
Veure codi

Executar codi
<?php
/*---------------------------------------------------------------
* Mòdul: 7 Pràctica: 3 Fitxer: m7p3.php
* Autor: D116 Data:
* Descripció: Generació dinàmica d'un document pdf
* Pre condi.: Cal tenir instal·lada la bib. 'fpdf'
* Post cond.:
----------------------------------------------------------------*/

// Primerament creem el 'define' FPDF_FONTPATH amb el directori
// que conté la informació de les fonts
define('FPDF_FONTPATH', '../fpdf/font/');
// Requerim el fitxer amb les definicions de la classe pdf
require('../fpdf/fpdf.php');


// Estenem les possibilitats de la classe original (fpdf)
// en una de nova
class PDF extends FPDF
{

//Càrrega de dades
function CarregaDades($fitxer)
{
// Llegim les línies del fitxer mitjançant la funció file()
// que torna un array amb una línia del fitxer per a cada element
$linies=file($fitxer);
// creem un array (de nom 'data') que serà multidimensional
// El resultat serà: data[0][0], data[0][1], data[0][2], data[0][n]...
// data[1][0], data[1][1]
$data=array();
// Recorrem l'array $lines amb un foreach
// Mitjançant la funció explode() "trossejarem" la cadena original de
// cada element de $lines en un nou array inclòs a $data
// El separador de camps del fitxer li donarem a explode
// (en aquesta cas, la coma)
foreach($linies as $linia)
// Aquí afegim un nou element a l'array $data
// El contingut d'aquest element és un 'subarray'
// creat mitjançant explode(). La funció chop treu espais en blanc
$data[] = explode(',',chop($linia));
return $data;

} // Fi funció CarregaDades

// Creació de la taula
// Aquest funció rep dos arrays com a paràmetres:
// $cap ->array que conté els noms de les capçaleres
// $data -> array que conté les dades de cada registre
function Taula($cap,$data)
{
// Definim la capçalera:
// Colors, amplada de línia i establim la font a negreta
$this->SetFillColor(25,0,200); // color de fons de la ce·la
$this->SetTextColor(255); // color del text
$this->SetDrawColor(128,0,0); //
$this->SetLineWidth(.3);
$this->SetFont('','B');

// Capçalera
$w = array(12,30,40,40,40,20); // amplada de les columnes
// escrivim la capçalera amb un for que llegeix l'array
for($i=0;$i<count($cap);$i++)
$this->Cell($w[$i],7,$cap[$i],1,0,'C',1);

$this->Ln(); // saltem línia

// Cos del llistat
$this->SetFillColor(255,255,192); // Canviem el color de fons
$this->SetTextColor(0); // Canviem color del text
$this->SetFont(''); // Mantenim la mateixa font

// Escriptura de les línies (dades)
// 'Fill' anirà canviant per tal d'alternar el fos bland
// amb el definit més amunt. Comença a 0 (en blanc)
$fill = 0;
// Establim un comptador inicial per marcar cada alumne i conèixer el total
$comptador = 1;
// Recorrem tota la taula $data
foreach($data as $row)
{
// Escrivim les 5 primeres columnes de cada registre.
// $row[n] es correspon amb cada columna.
// A cada columna li apliquem la funció
// substr(dada, 2 caràcter, total llaragda-2) per tal d'eliminar
// les cometes (") amb què ens arriben les dades al principi i al final.
// A més, als camps de text els convertim a majúscules amb la funció
// strtoupper() per unificar la sortida
$this->Cell($w[0],6,$comptador++,'LR',0,'R',$fill);
$this->Cell($w[1],6,substr($row[0],1, strlen($row[0])-2),'LR',0,'L',$fill);
$this->Cell($w[2],6,strtoupper(substr($row[1],1, strlen($row[1])-2)),'LR',0,'L',$fill);
$this->Cell($w[3],6,strtoupper(substr($row[2],1, strlen($row[2])-2)),'LR',0,'L',$fill);
$this->Cell($w[4],6,strtoupper(substr($row[3],1, strlen($row[3])-2)),'LR',0,'L',$fill);
$this->Cell($w[5],6,strtoupper(substr($row[4],1, strlen($row[4])-2)),'LR',0,'L',$fill);
$this->Ln(); // Saltem una línia
$fill=!$fill; // Posem 'fill' al contrari de com estava (0/1)
}
} // Fi funció Taula

} // Fi d'extensió de classe

////////////////////////////////////////////////////////
// Creació del fitxer pdf
////////////////////////////////////////////////////////
$pdf = new PDF(); // creem el pdf
$pdf->Open(); // obrim document per poder-hi treballar
// Definim títols de les columnes
$header = array('Núm.','Dni','Cognom 1','Cognom 2', 'Nom','Pla');
// Càrrega de dades amb CarregaDades() -> definit a dalt
$data = $pdf->CarregaDades('alumnat.txt');
// Establim Font i mida
$pdf->SetFont('Arial','',12);
// Creem una pàgina
$pdf->AddPage();
// Creem la taula
$pdf->Taula($header,$data);
// Donem sortida (publiquem) el document
$pdf->Output();
?>

  Llistat 7.3.1. Creació de fitxer pdf
   
 

Aquest codi està basat en un dels exemples del tutorial i conté una extensió de la classe fpdf, és a dir, dotem de més possibilitats la classe original.

El codi té nombrosos comentaris que ajuden a entendre'l millor. El procés que seguim és:

  • Establim el directori on es troben les fonts o tipus de lletra.
  • Afegim el codi de la classe original mitjançant require.
  • Estenem les possibilitats de la classe original (fpdf) amb dues noves funcions:
    • CarregaDades($fitxer) llegeix el contingut del fitxer de text que li passem i retorna un array multidimensional amb cada camp transformat en un element.
    • Taula($cap,$data) crea la taula a partir de l'array $cap (encapçalament) i l'array $data.
  • Creació del fitxer pdf:
    • creem el document (buit)
    • l'obrim
    • establim l'encapçalament de la taula
    • carreguem dades $data=$pdf->CarregaDades('alumnat.txt')
    • establim la font per defecte
    • creem (afegim) una pàgina $pdf->AddPage();
    • creem la taula: $pdf->Taula($header,$data);
    • publiquem el pdf: $pdf->Output()
Atenció !
Si a aquesta darrera funció li passéssim com a paràmetre un nom de fitxer, el resultat es desaria al servidor en un fitxer amb aquest nom i no es mostraria en el navegador.
Ex.: $pdf->Output("llista.pdf").
   
   
Amunt
Pràctica
1
2
3
4
   
Exercicis
Exercicis