Crea documentos PDF online con TCPDF

Muchas aplicaciones web crean documentos como facturas, contratos o simplemente páginas web en formato PDF. Hay unas cuantas clases de PHP que se pueden utilizar para crear documentos PDF online, una de ellas es TCPDF. En este tutorial veremos cómo utilizar la clase TCPDF para crear una simple factura generada online.

¿Por qué TCPDF y no otra clase de PHP?

TCPDF se basa en la clase FPDF, un proyecto muy estable desarrollado para PHP4. Desde hace unos cuantos años la clase TCPDF cuenta con muchas más características que la clase FPDF y, además, está desarrollada para PHP5 (aunque también tiene una versión para PHP4). Por si fuera poco, TCPDF cuenta con una excelente documentación y multitud de ejemplos para todas las acciones con PDFs importantes, como: Escritura en HTML y soporte RTL, múltiples columnas, Javascript y formularios, Bookmarks, alineamiento multicelda, códigos de barras, preferencias a la hora de visionar el propio PDF, soporte para imágenes vectoriales y mucho más...

Zend Framework también tiene clases para PDFs...

Si, correcto De hecho el primer plan era desarrollar este tutorial con Zend Framework, pero después de escribir unas cuantas filas de código me he dado cuenta de que la clase PDF le faltan algunas funciones importantes, como el MultiCell, que se utiliza para gestionar varias filas de texto. Me gusta mucho Zend Framework, pero no para la creación de documentos PDF, ya que la clase PDF es demasiado limitada. :(

Ok, vamos a empezar con el tutorial

En este tutorial vamos a crear una factura en PDF incluyendo el logotipo en la cabecera, las filas de factura, un cuadro de información y la fila del footer. En nuestro código incluiremos algunos archivos PHP, al lado hemos creado una pequeña extensión de clase para tener un header/footer personalizado y cierto método práctico para crear un cuadro de texto.

require_once('tcpdf/config/lang/eng.php');
require_once('tcpdf/tcpdf.php');
 
class MYPDF extends TCPDF {
	public function Header() {
		$this->setJPEGQuality(90);
		$this->Image('logo.png', 120, 10, 75, 0, 'PNG', 'http://www.finalwebsites.com');
 
	}
	public function Footer() {
		$this->SetY(-15);
		$this->SetFont(PDF_FONT_NAME_MAIN, 'I', 8);
		$this->Cell(0, 10, 'finalwebsites.com - PHP Script Resource, PHP classes and code for web developer', 0, false, 'C');
	}
	public function CreateTextBox($textval, $x = 0, $y, $width = 0, $height = 10, $fontsize = 10, $fontstyle = '', $align = 'L') {
		$this->SetXY($x+20, $y); // 20 = margin left
		$this->SetFont(PDF_FONT_NAME_MAIN, $fontstyle, $fontsize);
		$this->Cell($width, $height, $textval, 0, false, $align);
	}
}

El método header tiene sólo dos funciones, el primero define la calidad de la imagen y el segundo coloca la imagen (incluyendo el enlace) en un lugar que nosotros mismo hayamos definido (x = 120, Y = 10, width = 75). Todas las coordenadas se miden en mm y la altura de la imagen se calcula mediante un script. Dentro del método footer utilizaremos algunos métodos básicos de TCPDF para definir la posición, la fuente/estilo y la celda del texto del pie. El tercer método (CreateTextBox) es sólo un grupo de funciones de TCPDF que hace que sea más sencillo el colocar algún cuadro de texto en el documento PDF. Ten en cuenta que la variable constante PDF_FONT_NAME_MAIN se define en el archivo de configuración de TCPDF, que se encuentra en el directorio config.

El header de la factura

En el siguiente código se crea un objeto TCPDF con valores predefinidos, se definen los metadatos del PDF (autor, título, etc.), se añade una página y se crea el header de la factura con la información indicada usando nuestro método personalizado para cajas de texto.

// create a PDF object
$pdf = new MYPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
 
// set document (meta) information
$pdf->SetCreator(PDF_CREATOR);
$pdf->SetAuthor('Olaf Lederer');
$pdf->SetTitle('TCPDF Example');
$pdf->SetSubject('TCPDF Tutorial');
$pdf->SetKeywords('TCPDF, PDF, example, tutorial');
 
// add a page
$pdf->AddPage();
 
// create address box
$pdf->CreateTextBox('Customer name Inc.', 0, 55, 80, 10, 10, 'B');
$pdf->CreateTextBox('Mr. Tom Cat', 0, 60, 80, 10, 10);
$pdf->CreateTextBox('Street address', 0, 65, 80, 10, 10);
$pdf->CreateTextBox('Zip, city name', 0, 70, 80, 10, 10);
 
// invoice title / number
$pdf->CreateTextBox('Invoice #201012345', 0, 90, 120, 20, 16);
 
// date, order ref
$pdf->CreateTextBox('Date: '.date('Y-m-d'), 0, 100, 0, 10, 10, '', 'R');
$pdf->CreateTextBox('Order ref.: #6765765', 0, 105, 0, 10, 10, '', 'R');

Filas de la factura

Ahora vamos a crear la información relacionada con los productos que queramos insertar en la factura en PDF. Antes que nada, vamos a crear las cabeceras e iteraremos el array $order para pintar los datos de los productos.

// list headers
$pdf->CreateTextBox('Quantity', 0, 120, 20, 10, 10, 'B', 'C');
$pdf->CreateTextBox('Product or service', 20, 120, 90, 10, 10, 'B');
$pdf->CreateTextBox('Price', 110, 120, 30, 10, 10, 'B', 'R');
$pdf->CreateTextBox('Amount', 140, 120, 30, 10, 10, 'B', 'R');
 
$pdf->Line(20, 129, 195, 129);
 
// some example data
$orders[] = array('quant' => 5, 'descr' => '.com domain registration', 'price' => 9.95);
$orders[] = array('quant' => 3, 'descr' => '.net domain name renewal', 'price' => 11.95);
$orders[] = array('quant' => 1, 'descr' => 'SSL certificate 256-Byte encryption', 'price' => 99.95);
$orders[] = array('quant' => 1, 'descr' => '25GB VPS Hosting, 200GB Bandwidth', 'price' => 19.95);
 
$currY = 128;
$total = 0;
foreach ($orders as $row) {
	$pdf->CreateTextBox($row['quant'], 0, $currY, 20, 10, 10, '', 'C');
	$pdf->CreateTextBox($row['descr'], 20, $currY, 90, 10, 10, '');
	$pdf->CreateTextBox('$'.$row['price'], 110, $currY, 30, 10, 10, '', 'R');
	$amount = $row['quant']*$row['price'];
	$pdf->CreateTextBox('$'.$amount, 140, $currY, 30, 10, 10, '', 'R');
	$currY = $currY+5;
	$total = $total+$amount;
}
$pdf->Line(20, $currY+4, 195, $currY+4);

Después de las cabeceras y después del listado de productos de la factura creamos una línea. Dentro del bucle, utilizamos la variable de $currY para incrementar a 5 la coordenada Y por cada nueva fila. El total de la fila se calcula en PHP y también la cantidad total de incremento dentro del bucle foreach.

Información y pie de página de la factura

Primero creamos una fila total usando el valor del total de $ variable que hemos creado antes. Después de esa fila tenemos un MultiCell que puede contener las condiciones de pago o simplemente alguna otra información. Puede utilizar código HTML en esta celda, así, por ejemplo, un enlace a sus términos y condiciones.

// output the total row
$pdf->CreateTextBox('Total', 20, $currY+5, 135, 10, 10, 'B', 'R');
$pdf->CreateTextBox('$'.number_format($total, 2, '.', ''), 140, $currY+5, 30, 10, 10, 'B', 'R');
 
// some payment instructions or information
$pdf->setXY(20, $currY+30);
$pdf->SetFont(PDF_FONT_NAME_MAIN, '', 10);
$pdf->MultiCell(175, 10, '<em>Lorem ipsum dolor sit amet, consectetur adipiscing elit</em>. 
Vestibulum sagittis venenatis urna, in pellentesque ipsum pulvinar eu. In nec <a href="http://www.google.com/">nulla libero</a>, eu sagittis diam. Aenean egestas pharetra urna, et tristique metus egestas nec. Aliquam erat volutpat. Fusce pretium dapibus tellus.', 0, 'L', 0, 1, '', '', true, null, true);
 
//Close and output PDF document
$pdf->Output('test.pdf', 'F');

Al final llamamos al método output que guardará nuestro PDF bajo el nombre test.pdf y muestra el documento en el navegador.

Esto es sólo un ejemplo para demostrar lo fácil que es crear archivos PDF online. Antes de comenzar tus propios scripts para PDFs, comprueba todos los ejemplos de TCPDF para tener una idea de cómo hacerlo y cómo utilizar los diferentes métodos.

Fuente: web-development-blog.com

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP