Introducción
Como probablemente ya sabe, el HTML no es el único formato para mostrar
contenido en Internet. Además de los distintos tipos de imágenes, tenemos
varios formatos capaces de contener textos como Adobe PDF, Macromedia Flash o algunos documentos alternativos escritos en XML como los archivos gráficos SVG (Gráficos Vectoriales Escalables), WML (Lenguaje de Marcas Inalámbrico) o XUL (Lenguaje de interfaz de Usuario en XML con Mozilla). Cada uno de estos tipos de documentos tiene su propio terreno y de nosotros depende elegir cuál o cuáles utilizar para dotar a nuestra Web de mayores posibilidades.
Los archivos Adobe PDF se han establecido como un estándar en los documentos
de texto para la Web.
Existen dos extensiones escritas para PHP, PDFLib y ClibPDF, capaces
de generar archivos PDF. Desgraciadamente estas librerías son de uso comercial
y requieren el pago de algún tipo de licencia.
Además de las extensiones anteriores, tenemos una serie de aplicaciones
escritas completamente en PHP que permiten llegar al mismo resultado,
como R&OS PDF o FPDF. No son tan rápidas como las extensiones, pero
cumplen perfectamente nuestras expectativas.
Librería FPDF
La librería FPDF, creada en septiembre de 2001, no necesita licencia de
uso, ni tampoco alguna configuración especial de PHP. Lo único que necesita
es la librería, que la puede descargar del sitio Web h t t p : //
www.fpdf.org.
La librería principal contiene la definición de una clase, que debe instanciar
para poder generar sus documentos. Nuestro código inicial debería
ser algo parecido a:
<?php
require__once ( f pdf /fpdf . php) ;
$pdf = new FPDF();
?>
El constructor se utiliza de esta forma con los valores por defecto que son
página A4 con orientación vertical y el tamaño medido en milímetros. El
primer parámetro del constructor permite elegir entre orientación vertical (L) u horizontal (P). El segundo parámetro sirve para que las medidas
de referencia se hagan en base a puntos (pt), milímetros (mm), centímetro
(cm) o pulgadas (in). El último parámetro nos ofrece la oportunidad de
elegir entre los diferentes formatos de página que existen: A3, A4, A5, Letter
y Legal.
Nota:
Hay que recordar que un punto es 1/72 pulgadas.
$pdf = new FPDF( ' P' , 'cm' , ' A 4 ' ) ;
Nuestro primer documento
El siguiente ejemplo muestra la creación básica de un documento PDF de
forma lineal.
<?php
define('FPDF_FONTPATH','fpdf/font/');
require_once ( 'fpdf/fpdf.php') ;
$pdf = new FPDF();
$pd£->A.ddPageU •,
$pdf->SetFont('Arial' , ' ' , 15) ;
$pdf->Write(155 , ' Mi primer documento!!!');
$pdf->Output();
?>
La primera línea define una constante que contiene la ruta donde están
almacenadas las fuentes. Después de las funciones que incluyen la clase y
la instancia del objeto tenemos una serie de llamadas a métodos que nos
permiten manipular el documento a nuestro antojo.
Advertencia:
FPDF mantiene la posición de un cursor. Las funciones que generan
texto imprimirán los datos de acuerdo con la posición del cursor
en ese momento. Es posible, de todas formas, cambiar de sitio
el cursor con algunas funciones que veremos en este capítulo.
El método AddPage () añade una página al documento con la orientación
que Le pida. En este caso hemos añadido una con orientación vertical,
que es la elegida por defecto. S e t F o n t () selecciona una fuente tomando como parámetro el tipo, la propiedad (negrita, cursiva) y el tamaño. Por
último tenemos una llamada a los métodos Write () y Output (), que
escriben el texto en una posición determinada del documento y lo muestran
en pantalla respectivamente, como puede ver en la figura 19.1.
Funciones de texto
Método Write()
Imprime el texto pasado como parámetro en la posición que indica el cursor.
La construcción es:
W r i t e ( a l t u r a , t e x t o , e n l a c e )
Los parámetros son los siguientes:
• altura: Altura de la celda.
• texto: Texto a imprimir.
• enlace: Podemos considerar el texto como un enlace a una página o a
una Web.
Como ejemplo puede ver el primer código que hemos realizado. Método Cell()
El método c e l l () puede tomar hasta 8 parámetros y es el encargado de
imprimir en el documento PDF un cuadro de texto en la posición indicada.
El cuadro de texto puede tener un borde alrededor o en alguno de los
lados.
La construcción es como sigue:
cell(ancho, altura, texto, borde, línea, alineación, relleno, enlace)
Los dos primeros parámetros son obligatorios, los demás opcionales. A
continuación vemos para qué sirve cada parámetro:
• ancho: Ancho de la celda. Si es 0 se considera el ancho total del folio.
• altura: Altura de la celda.
• texto: Texto a imprimir.
• borde: Un 1 significa que llevará borde. También se pueden incluir
algunos caracteres para indicar en cuál de las partes de la celda debe
llevar borde: L, R, T y B significan Izquierda, Derecha, Arriba y Abajo
respectivamente.
• línea: Cuando termine la llamada a la creación de la celda, indica al
generador de PDF dónde debe colocar el cursor para continuar. Un
0 indica a la derecha de la tabla, un 1 en la siguiente línea y un 2
seguido.
• alineación: Acepta 3 caracteres: L para alinear a la izquierda, R a la
derecha y C para texto centrado.
• relleno: Indica con un 1 si la celda debe tener un relleno para diferenciarla
del resto del folio.
• enlace: Enlace devuelto por la función A d d l i n k () .
Como ejemplo puede ver la forma de introducir un título en una página:
< ?php
define('FPDF_FONTPATH','fpdf/font/');
require__once ( ' fpdf/fpdf . php ' i ;
$pdf = new FPDF();
$pdf->AddPage();
$pdf->SetFont('Courier' , " , 1 0 );
$pdf->Cell(80);
$pdf->Cell (20,10, 'Titulo' ,1,1,'C);
$pdf->Output();
?>
Una celda sólo puede contener el número de caracteres que quepa en una
línea. Si necesita mostrar más líneas de texto, puede utilizar el método Muí ti Ce 11 () que toma los mismo parámetros que Ce 11 ( ) , pero cuando
el texto llegue al final de la línea, se añade automáticamente un salto a
la línea siguiente.
Truco:
Puede utilizar Ce 11 () para desplazar el cursor hacia la derecha
añadiendo como parámetro un ancho de 8 centímetros (80 milímetros).
Después, para imprimir el texto, añada otra celda que incluya
el literal "Título" centrado dentro de una celda con borde.
Desplazamiento de los cursores
Existen varias funciones para colocar el cursor en distintas partes del documento.
SetX () y S e tY () colocan el texto en el punto indicado, en la
medida seleccionada (centímetros, milímetros, etc).
SetX () desplaza el cursor de izquierda a derecha tantas unidades como
indique el parámetro y S e tY () de arriba hacia abajo. Si se les pasa un
número negativo, el origen se tomará desde la derecha o desde abajo respectivamente.
SetXY () toma dos valores y permite realizar las dos operaciones con una
sola instrucción.
$pdf->SetXY(100,100);
$pdf->write(2,"Este texto se mostrará a 10 cm del margen");
Salto de página automático
El método SetAutoPageBreak () activa o desactiva el salto de página
automático.
Esto quiere decir que si está activado, cuando el texto llegue al final de
la página, se creará una página nueva para poder contener el resto. El
primer parámetro debe ser true ofalse para activa o desactivar la propiedad.
El segundo parámetro indica la distancia desde la parte inferior que desencadena
la llamada a una nueva página.
SetAutoPageBreak(true,20);
El código anterior activa el salto de página automático cuando el texto llegue
a 2 centímetros del margen inferior.
Sobrescribir los métodos
La clase FPDF contiene algunos métodos vacíos que debe escribir usted si
quiere que sus documentos queden profesionales. Puede crear un objeto
propio que herede del objeto FPDF e implementar algunas características
avanzadas.
Cabecera
La cabecera de un documento es un conjunto de texto escrito en la parte
superior del folio y que debe aparecer en todas las páginas. La clase FPDF
implementa el método header () que se llama cada vez que existe un salto
de página.
Puesto que el método está vacío en FPDF, tendrá que crear un objeto nuevo
que herede todos sus métodos e implemente la cabecera.
<?php
define ( 'FPDF_FONTPATH' , 'fpdf/font/' ) ;
requireonce('fpdf/fpdf.php');
class PDF extends FPDF
{
function Header()
{
$this->SetFont('Arial','B',15);
$this->SetX(70);
$this->Cell(100, 10, 'Manual Imprescindible de PHP 5',1,0,'C);
$this->Ln(20);
}
}
$pdf = new PDF () ;
for($i=l;$i<=200;$i++)
$pdf->Cell(0,10,'Imprimiendo línea número '.$i,0,l);
$pdf->Output () ;
?>
El método header () configura un tipo de letra determinado, en negrita,
avanza el cursor 8 centímetros hacia la derecha e imprime una celda con
el título.
El método Ln (2 0 ) inserta un salto de línea cuya altura es determinada
por el argumento.
Para probar el objeto hemos hecho un bucle que imprime 100 líneas y así
comprobar que la cabecera aparece invariable. El resultado se puede observar
en la figura 19.2.
Imagen de cabecera
También es posible añadir una imagen a la cabecera con el método Image
(). La construcción es la siguiente:
Image(fichero, x, y, ancho, alto, tipo, enlace)
Los parámetros necesarios son: fichero, x e y. La descripción de todos los
argumentos es:
• fichero: Indica la ruta hacia el fichero que va a insertar.
• x: Posición en el eje x de la imagen.
• y: Posición en el eje y de la imagen.
• ancho: Ancho de la imagen.
• alto: Alto de la imagen. Si no se indica y el parámetro ancho está definido,
el alto se escala en función del ancho.
• tipo: El tipo de imagen. Por ahora sólo se aceptan imágenes JPG, JPEG
y PNG.
• enlace: La imagen puede ser un enlace.
Ahora que sabe cómo insertar imágenes, puede incluir en la cabecera el
logotipo de su empresa o asociación.
function Header()
{
$this->SetFont{'Arial','B',15);
$this->SetX(70);
$this->Cell(100,10,'Manual Imprescindible de PHP 5',1,0,'C);
$this->SetX(-20);
$this->Image("php.png",170,5);
$this->Ln (20) ;
}
Pie de página
De la misma forma, puede sobrescribir el método que imprime el pie de
página de la clase FPDF.
Este método recibe el nombre de F o o t e r () y tiene el mismo tratamiento
que la cabecera; cada vez que existe un salto de página se hace una llamada
al mismo.
Nuestro pie de página puede quedar de la siguiente forma:
function Footer()
{
$this->SetY (-15) ;
$this->SetFont('Arial' , 'I' ,10) ;
$this->Cell (0,10, 'Página ' . $this->PageNo() ,0,0, ' C ' ) ;
}
S e tY () nos coloca el cursor a 15 milímetros del borde derecho. Seguidamente
escoja el tipo de fuente Aria! e imprima el número de la página actual
con el método PageNo () .
Muchos documentos informan además del número de páginas que tiene
el texto. Esto es complicado a primera vista, porque, a priori, no podrá
saber cuántas páginas ocupará su texto. Existe un método que se ejecuta
cuando el documento es cerrado y sustituye una marca por el número de
folios con los que cuenta nuestro proyecto.
function FooterO
{
$this->SetY(-15);
$this->SetFont ( 'Anal ' , ' I ' , 10) ;
$this->AliasNbPages();
$this->Cell(0, 10, 'Página ' . $this->PageNo() . '/
{nb}' ,0,0 , 'C') ;
}
El método A l i a s N b P a g e s () cuenta el número de páginas cuando el documento está cerrado y sustituye la marca {nb} por este número.
Tablas
Una tabla no es más que un conjunto de celdas colocadas en un orden
determinado. Podemos diferenciar entre la cabecera de la tabla, que contendrá
las propiedades, y los datos. Si realiza una clase para escribir tablas
puede hacer también esa diferenciación, cambiando el tipo de letra,
el tamaño o el color. El código siguiente muestra cómo se puede instaurar
una clase para la creación de tablas fácilmente:
<?php
define('FPDF_FONTPATH','fpdf/font/');
require_once('fpdf/fpdf.php');
class PDF extends FPDF
{
function tabla($cabecera,$datos)
{
$this->cabecera ($cabecera) ;
$this->datos($datos);
}
function cabecera($cabecera)
{
//Cabecera
$this->SetFont('Arial','B',15);
foreach($cabecera as $columna) {
$this->Cell(40,7,$columna,1, 0 , ' C ' ) ;
}
$this->Ln();
}
function datos($datos)
{
//Datos
$this->SetFont('Arial','',12);
foreach ($datos as $dato) {
foreach ($dato as $columna) {
$this->Cell(40,7,$columna,1,0,' C );
}
$this->Ln () ;
}
}
}
$pdf = new PDF () ;
$pdf->AddPage () ;
$cabecera = array("Usuarios","Visitas","Localidad","Teléfono");
$datos = array(array("Luis Miguel ","12","Badajoz","555345678"),
array("María Fernanda", "45" , "Mérida", "234234654") ,
array("Pedro Casas","3","Cáceres","342123 890")) ;
$pdf->tabla($cabecera,$datos);
$pdf->Output () ;
?>
En este caso, los datos se sacan de un array de dos dimensiones, pero puede
utilizar la librería de bases de datos o la de XML, creadas en los capítulos
anteriores, para extraerlos.
Los datos los recibe el método T a b l a ( ) , que los envía a sus correspondientes
métodos para ser tratados. El funcionamiento básico consiste en
la creación repetitiva de celdas cuyo número coincidirá con el número de
datos existentes en el array. Todas las celdas se muestran seguidas, dando
sensación de ser una tabla, como puede ver en la figura 19.4.
Ahora que es casi un experto en la creación de tablas para facturas o albaranes
en PDF, puede dar un toque de color al relleno, texto o líneas de las
celdas.
Puede comprobar que, con tan sólo tres líneas de código más, el aspecto
visual del documento mejora considerablemente.
function cabecera($cabecera)
{
//Cabecera
$this->SetFillColor (255,0,0) ;
$this->SetTextColor(255) ;
$this->SetDrawColor(12 8,0,0);
$this->SetFont('Arial','B',15);
foreach($cabecera as $columna) {
$this->Cell(40,7,$columna,1,0,'C',1);
}
$this->Ln();
}
function datos($datos)
{
//Datos
$this->SetTextColor (1) ;
$thís->SetDrawColor (12 8,0,0) ;
$this->SetFont ( 'Arial' , ' ' ,12) ;
foreach ($datos as $dato) {
foreach ($dato as $columna) {
$this->Cell(40,7,$columna,1,0,'C');
}
$this->Ln () ;
}
}
El resultado es mucho más llamativo gracias a los métodos que añaden
color. El método S e t F i l l C o l o r () define el color de fondo de las celdas y los rectángulos que no sean transparentes. Puede ser expresado con un
componente RGB o en escala de grises. El valor se mantiene durante todo
el documento hasta que se vuelva a invocar el método.
S e t T e x t C o l o r () y SetDrawColor () funcionan de la misma forma,
actuando esta vez sobre el color del texto o el color de las líneas y bordes
de celda. La figura 19.4 muestra los colores (tonos de grises en este caso)
distintos que pueden tomar un archivo PDF.
Enlaces
Una de las ventajas del formato PDF es que permite hacer enlaces internos,
es decir, que si tiene un documento de 500 folios podrá acceder a cada
uno de los capítulos haciendo clic en el índice, tal y como funcionan los
enlaces en las páginas Web.
Un enlace externo es muy fácil de crear:
$pdf->Write(5,www.luisyfernanda.net,'http://www.luisyfernanda.net');
Los métodos dedicados a texto tienen un argumento para añadir un enlace
que, si es externo, debe llevar la dirección URL completa.
Crear un enlace interno es algo más complicado. Tiene que hacer uso del
método A d d l i n k ( ) , que genera una referencia que debe ponerse en el
lugar hacia donde quiere que se produzca el salto. En ese lugar utilice el
método S e t L i n k () para cerrar el enlace.
El código de ejemplo puede aclarar el concepto:
<?php
define('FPDF_FONTPATH','fpdf/font/');
require_once('fpdf/fpdf.php');
$pdf = new FPDF();
$pdf->AddPage () ;
$pdf->SetFont('Arial', ' ' ,15) ;
$enLace = $pdf->AddLink();
$pdf->Write(5,"Este texto contiene un enlace",$enlace) ;
$pdf->AddPage{);
$pdf->SetLink($enlace) ;
$pdf->Write (5, "Enlace Interno") ;
$pdf->Output () ;
?>
Lo único a destacar es la creación del enlace con AddLink ( ) . La variable
$ e n l a c e recoge el valor de referencia y se añade al texto de la línea siguiente.
En este momento el texto contiene un enlace, pero no sabemos
hacia dónde. La solución está en llamar al método S e t L i n k () en la página
de destino con la referencia de parámetro.
Resumen
Los archivos PDF se consideran desde hace unos años ideales para la generación
de contenidos on-line. Así, revistas digitales como www.
phparch.com o www.phpmag.net utilizan este sistema para vender su
publicación.
Además de revistas digitales, podemos encontrar empresas que hacen llegar
las instrucciones de sus productos en PDF o realizan las facturas de
los clientes on-line, como el programa de facturación extremeño Galopín
(http://galopin.sinuh.org).
La generación de sus propios archivos ya no es un misterio y puede implementar
clases muchos más potentes que las mostradas en el libro para sus propios proyectos. La inclusión de colores, imágenes y tablas de distintos tipos harán del lector un profesional de la edición Web. |