Creación de documentos PDF desde PHP

Existen varias formas de construir documentos en formato PDF desde aplicaciones PHP. A lo largo de este ejemplo lo haremos utilizando la clase Ezpdf de R&OS

La ventaja de esta clase es que no es necesario ningún módulo adicional de PHP (tema delicado si alojamos las aplicaciones en servidores compartidos). Además R&OS la distribuye gratis, incluso para uso comercial.

Para probar la clase y evaluar algunas de sus posibilidades, nos planteamos un ejemplo muy sencillo.

Comenzaremos insertando un texto, una línea y un rectángulo:

Incluimos la clase Ezpdf

include "class.ezpdf.php";

En primer lugar creamos el objeto Cezpdf, al que hay que indicar el tipo de documento (tamaño de página, orientación, etc…), que en nuestro caso será de tipo ‘A4” y con posición vertical (valores que toma por defecto el constructor).

$pdf = new Cezpdf();

Para trabajar más cómodos con centímetros, creamos una función que nos pasa las medidas en centímetros a puntos (todas las medidas en PDF se expresan en puntos, cada punto es aproximadamente la 1/72 parte de una pulgada). A la función le pasamos dos parámetros: la ‘$medida’ que estará en centímetros y la ‘$resolucion’, al que por defecto le asignaremos ‘72’ (72 puntos por pulgada).

function puntos_cm ($medida, $resolucion=72)
{
   //// 2.54 cm / pulgada
   return ($medida/(2.54))*$resolucion;
}

Ezpdf viene acompañada de un conjunto de fuentes (en este caso las hemos almacenado en un subdirectorio ‘fonts’). Para seleccionar el tipo de fuente que queremos que aparezca en nuestro documento utilizamos la función “selectFont”, a la que se le indica el path al fichero donde se encuentra la fuente. En nuestro ejemplo utilizaremos la fuente ‘Times Roman’.

$pdf->selectFont('./fonts/Times-Roman');

Para comenzar a generar el contenido del ejemplo, vamos insertar un texto a 4 centímetros del margen izquierdo y a 3 centímetros del margen superior, para ello utilizamos la función “addText()” , la cual nos permite añadir un texto en una determinada zona (coordenadas) de la página.

$pdf->addText(puntos_cm(4),puntos_cm(26.7),12,'Encabezado');

Como se puede observar, para dejar la distancia del margen superior al texto, no lo hemos hecho directamente como con el margen izquierdo, sino que hemos tenido que quitarle los tres centímetros al total de lo que mide la página de largo (29.7 cm). Es decir, la coordenada vertical tiene su origen en la parte inferior de la página.

A continuación creamos un estilo de linea que tenga un espesor de tres milímetros y que su terminación sea redodeada. Esto lo haremos con la función “setLineStyle( )”, la cual nos permite definir el estilo de la linea antes de dibujarla. Se le pasan 5 parámetros, con los que se pueden conseguir todos los tipos de línea imaginables. Nosotros vamos a utilizar los dos primeros::

  • width : Ancho de la línea (en puntos)
  • cap : Forma en la que se remata la línea. Puede ser una terminación redondeada o cuadrada: round, square

Hay que tener en cuenta que esta función sólo pone el estilo de la línea pero no la dibuja, para ello necesitamos la función “Line”.

$pdf->setLineStyle(3,'round');

El color de la línea se puede definir con ‘setStrokeColor’.

A esta función se le pasan las componentes RGB del color.

En este caso elegimos el color negro (que es el color por defecto para las líneas, por lo tanto el siguiente código es opcional):

$pdf->setStrokeColor(0,0,0);

A continuación dibujamos una linea de 15 centímetros que esté separada a 2 centímetros del margen izquierdo y a 25 centímetros del límite inferior de la página.

Para ello utilizamos la función “Line” que permite dibujar una linea.

A esta función se le pasan 4 parámetros (x, y, x2, y2), es decir, las coordenadas del punto inicial y del final de la línea.

$pdf->line(puntos_cm(2),puntos_cm(25),puntos_cm(17),puntos_cm(25));

Ahora dibujaremos un rectángulo que esté a 14 centímetros de distancia del margen izquierdo, a 6.2 centímetros del margen superior, que tenga 3 centímetros de ancho y 1.5 centímetros de alto. Para ello utilizamos las funciones ‘rectangle’ (dibuja sólo las líneas externas) y ‘filledRectangle’ (dibuja sólo el relleno). A las dos se les pasan 4 parámetros (x, y, ancho, alto).

El estilo y color de las líneas (función ‘rectangle’) se define respectivamente con las funciones ‘setLineStyle’ y ‘setStrokeColor’.

El color del relleno (función ‘filledRectangle’) se define con la función ‘setColor’.

Las coordenadas indican la posición de el vértice inferior izquierdo del rectángulo. En este caso, la coordenada vertical se calculará como: 29.7 - 6.2 - 1.5 = 22 cm

$pdf->setColor(0.8,0.8,0.8);
$pdf->setStrokeColor(0,0,0);
$pdf->setLineStyle(1,'round');

$pdf->filledrectangle (puntos_cm(14), puntos_cm(22), puntos_cm(3), puntos_cm(1.5));
$pdf->rectangle (puntos_cm(14), puntos_cm(22), puntos_cm(3), puntos_cm(1.5));

Insertamos un texto dentro del rectángulo, poniéndole un centímetro más de ancho que el rectángulo y medio centímetro más que el largo del mismo.

$pdf->setColor(0, 0 ,0);
$pdf->addText(puntos_cm(15),puntos_cm(22.5),12,'Final');

Para continuar con nuestro ejemplo queremos insertar una imagen (imagen_prueba.jpg), y la queremos situar a 6 centímetros del margen izquierdo y a 15 centímetros del borde inferior de la página.

Utilizaremos la función “addJpegFromFile” que nos permite insertar una imagen. Se le pasan como parámetros: imgFilaName, x, y, ancho, alto, donde ‘x’ e ‘y’ son las coordenadas de la esquina inferior izquierda de la imagen.

$pdf->addJpegFromFile('imagen_prueba.jpg', puntos_cm(6),    puntos_cm(15));

A continuación pondremos nuestro cursor a 6 centímetros del final de la página con la función “ezSetY” que se utiliza para colocar el cursor a una determinada altura de la página. Esta función es muy útil para insertar textos, imágenes, etc… en la posición deseada.

$pdf->ezSetY(puntos_cm(6));

Creamos ahora una tabla (en la posición especificada).

Para ello primero vamos a definir dos arrays, uno para los contenidos de la tabla y otro para los parámetros (formatos de borde, cabeceras, texto…)

Array de contenidos:

$datos = array(
array('id'=>'id', 'ref'=>'ref', 'concepto'=>'concepto','precio'=>'precio'),
array('id'=>'1', 'ref'=>'01', 'concepto'=>'Lápiz','precio'=>'3'),
array('id'=>'2', 'ref'=>'02', 'concepto'=>'Pluma','precio'=>'4'),
array('id'=>'3', 'ref'=>'07', 'concepto'=>'Bolígrafo','precio'=>'4'),
array('id'=>'4', 'ref'=>'09', 'concepto'=>'Tinta','precio'=>'7'),
array('id'=>'5', 'ref'=>'13', 'concepto'=>'Papel','precio'=>'1'),
);

Array de opciones (sólo se definen unas cuantas):

////creamos un nuevo array en el que pondremos un borde=1
///y las cabeceras de la tabla las pondremos ocultas
unset ($opciones_tabla);

//// mostrar las lineas
$opciones_tabla['showlines']=1;

//// mostrar las cabeceras
$opciones_tabla['showHeadings']=0;

//// lineas sombreadas
$opciones_tabla['shaded']= 1;

//// tamaño letra del texto
$opciones_tabla['fontSize']= 10;

//// color del texto
$opciones_tabla['textCol'] = array(1,0,0);

//// tamaño de las cabeceras (texto)
$opciones_tabla['titleFontSize'] = 12;

//// margen interno de las celdas
$opciones_tabla['rowGap'] = 3;
$opciones_tabla['colGap'] = 3;

Y se muestra la tabla:

$pdf->ezTable($datos, "", "Tabla de precios",$opciones_tabla);

El segundo parámetro de la función ‘ezTable’ permite especificar los títulos de las columnas. Por el momento no lo utilizamos.

Finalmente vamos a generar el documento PDF mediante la función ‘ezOutput’:

$documento_pdf = $pdf->ezOutput();

Y lo guardamos en un fichero:

$fichero = fopen('prueba.pdf','wb');
fwrite ($fichero, $documento_pdf);
fclose ($fichero);

Conclusiones

La clase Ezpdf es una herramienta ideal para la creación dinámica de pequeños documentos en formato PDF.

En este ejemplo hemos visto (de lejos) las posibilidades que ofrece a la hora de crear documentos sencillos y lo fácil que resulta su integración en aplicaciones php.