viernes, 9 de marzo de 2007

Otra forma de generar documentos Word con PHP

Bueno en realidad no es otra forma, la base es simplemente la misma de Generar documentos de Word RTF con php, un articulo de José Luis Del Rincón. La estrategia que usaremos es la misma generar un RTF que es un formato que muchos procesadores de texto (por supuesto el Microsoft Word incluido) leen.

Lo primero que debemos hacer es generar una plantilla de nuestro RTF. Para eso voy a usar AbiWord que es un procesador de texto muy liviano, gratis y abierto (si, y no estoy en Linux). Por supuesto se puede usar el Word aunque es preferible que usen el WordPad si lo tienen.

Ahi escribimos el texto solo que escribiendo los valores variables como si fueran variables PHP adentro del RTF (con el signo $ delante de la palabra)

Codigo PHP

<?php

// Lee la plantilla
$plantilla = file_get_contents('plantilla.rtf');

// Agregamos los escapes necesarios
$plantilla = addslashes($plantilla);
$plantilla = str_replace('\r','\\r',$plantilla);
$plantilla = str_replace('\t','\\t',$plantilla);

// Datos de la plantilla
$nombre = "Juan";
$apellido = "Perez";
$prefijo = "Sr.";
$curso = '"Programacion Web con PHP"';
$fecha = date("d-m-Y", time() - 7 * 24 * 60 * 60); // de esta manera el codigo no envejece :P

// Procesa la plantilla
eval( '$rtf = <<<EOF_RTF
' . $plantilla . '
EOF_RTF;
' );

// Guarda el RTF generado
file_put_contents("$apellido-$nombre-$fecha.rtf",$rtf);

?>

Bueno a primera vista si comparamos los codigos vemos que este es mas corto y simple. Pero analicemos profundamente para conocer la potencia de este codigo. Primero lo que hacemos es leer la plantilla, ahi podemos usar cualquier metodo para leer un archivo que conozcamos. Yo use file_get_contents. Luego debemos procesar un poco al texto del archivo (despues explicaremos porque).

Luego debemos tomar los datos, ahi podemos sacarlos de una base de datos, llenar por formularios, lo que sea. Para simplificar, lo que hacemos es directamente declarar los datos.

Las siguientes lineas son las que importan en el codigo. Lo que usamos es la sintaxis HEREDOC que nos ofrece PHP. El HEREDOC es como usar sintaxis de comillas en PHP, pero sin las comillas. Por esta sintaxis debemos escapar los caracteres \r y \t que son tomados como retorno de carro y tabuladores respectivamente. Esto incluido en una llamada a la funcion eval en la cual podemos procesar codigo dinamicamente. Ahi devolvemos el contenido procesado en la variable $rtf.

Bueno al final guardamos el archivo con la funcion file_put_contents. Lo mismo que al leer, aqui podemos usar cualquier metodo para guardar o enviar al navegador como archivo RTF

Como nota final (y tarea para el hogar) el archivo RTF debe ser procesado una sola vez, es decir que podemos guardarlo con los escapes y luego leerlo,en vez de escaparlo cada vez que lo llamamos (lo que hace al codigo mas efectivo).

21 comentarios:

Anónimo dijo...

Muy ilustrativo, sin embargo al probarlo con otra plantilla, resulta que genero caracteres el archivo rtf harto extraños en los lugares donde debería de haber acentos, algo así como:
ART\'cdCULO en lugar de ARTÍCULO
DELEGACI\'d3N en lugar de DELEGACIÓN

Te suplico me digas que es lo que paso, gracias por tomarte la molestía de leerme y de contestar mi duda.

Alfonso dijo...

Hola esta muy interesante tu articulo y tu codigo, mi pregunta es igual a la del compañero anterior, como hacer para trabajar las tildes y ñ, espero tus comentarios.

Alfonso dijo...

Hola esta muy interesante tu articulo y tu codigo, mi pregunta es igual a la del compañero anterior, como hacer para trabajar las tildes y ñ, espero tus comentarios.

Julio Capuano dijo...
Este comentario ha sido eliminado por el autor.
Julio Capuano dijo...

hola a todos, tengo casi 4 dias que vi este tutorial pero igual que a ustedes me costo conseguir información asi que me puse investigar un poco sobre el contenido que se marcaba en la variable "$rtf" despues que pasaba por eval(), y cai en cuanta que la mayor parte de la culpa era por la funcion addslashes(), pero igual es necesaria ya que para algunos caracteres especiales se utilizaria un formato del propio rtf que esta mejor explicado aquipara el rtf los caracteres tipo hex son validos pero en el codigo se mancan con doble slash "\\" en vez de uno "\" pero la solucion tampoco es pones el stripslashes ya que estos eliminarían todos los slash's y cambiaria el formato asi que lo unico que se me ocurrio fue marcarlo a mano de la siguiente forma:

// Procesa la plantilla
eval( '$rtf = <<<EOF_RTF
' . $plantilla . '
EOF_RTF;
' );

//esta es la nueva sesscion
$rtf = str_replace('\\\\','\\',$rtf);

// Guarda el RTF generado
file_put_contents("$apellido-$nombre-$fecha.rtf",$rtf);


espero que les sirva

Anónimo dijo...

GRACIAS, funciona excelente ya puedo ver bien los acentos.

Ludoviko Beaumont dijo...

Y qué hacer si no se dispone del file_put_contents por no tener el php 5.0???? cómo se escribiría correctamente ese mismo código pero con fwrite fopen y fclose????

JOSElin7 dijo...

Julio Capuano GRACIASSSSSSSSSSSSSSS GRACIASSSSS Y CIEN MIL GRACIAS MAS, uffff todo lo que he buscado para encontrar esta solucion!!!

PHPDOCX dijo...

Puedes generar dicumento word en PHP utilizando PHPDOCX, una libreria gratuita en PHP para la generación dinámica de MS Word a partir de una base de datos MySQL o cualquier otra fuente.

alberto dijo...

Funciona perfecto para los caracteres especiales pero creo q lo q añadiste afecto en el envio de la variable al documento en rtf ya que a mi me sale en el docto: $curso... que se puede hacer?

Anónimo dijo...

gracias a julio capuano


su solución todavía funciona.

Anónimo dijo...

Muchas Gracias hermano que belleza??? dos días buscando informacion, poniendo el mensaje en foros y nada. Mil Gracias

Anónimo dijo...

hola! le doy gracias a dios por personas como tu que ayudan a los demas! estoy super desesperada porque tengo que crear un documento txt y no se nada, copie tu codigo pero me genera estos errores (0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0·ð \\0 \\0C\\0a\\0p\\0a\. por favor ayudame!

Sungurue dijo...

Hola, gracias por tu ayuda :), tenia el problema de los signos raros

Anónimo dijo...

Hola, un buen ejemplo.

Alguien sabe cómo puedo lograr que el archivo me descargue en web.

Gracias

Marcela!

Anónimo dijo...

Biden of Delaware has become the Vice [url=http://www.salevivi.com]スーパーコピー 財布[/url]safety precautions that go with traveling [url=http://www.salevivi.com]ルイヴィトン 通販[/url]scenarios which unfortunately lead to the [url=http://www.salevivi.com]ルイヴィトン 通販[/url]as the appropriate accreditation scheme [url=http://www.salevivi.com]http://www.salevivi.com[/url] people tend not to think about is toothpaste [url=http://www.salevivi.com]http://www.salevivi.com[/url] become the 44th President of the United

Anónimo dijo...

Pгetty nicе pоst. І just ѕtumbled upon your
wеblog and wаnted to saу that І've truly enjoyed surfing around your blog posts. In any case I will be subscribing to your feed and I hope you write again soon!

Also visit my web page ... v2 cigs reviews

Anónimo dijo...

Hola buenas tardes el problema que tengo es que no me visualiza las tabla pone el contenido de la misma en diferentes linesas, necesito anexar algun código especial para poder verlas?

Anónimo dijo...

Quiero agradecer tu aporte Rodi, me ha sacado de un gran apuro, gracias, gracias y más gracias. Me ha ido espectacular. Saludos. Juanjo

Juan dijo...

Y cómo se podría combinar dos archivos rtf1 y rtf2 para obtener rtf3. Hice esto:
eval( '$rtf3 = <<<EOF_RTF
' . $rtf1.$rtf2 . '
EOF_RTF;
' );
Genera rtf3, pero solo con el contenido de rtf1, pero el tamaño es como si se hubieran conbinado los dos.

KEOS dijo...

PARA HACER EL DOCUMENTO RTF DESCARGABLE POR EL EXPLORADOR Y NO SE GUARDE AUTOMATICO EN RAIZ SE MODIFICA LO SIGUIENTE:

// Guarda el RTF generado
file_put_contents("$apellido-$nombre-$fecha.rtf",$rtf);

POR:

$name=$nombre.".rtf"; // o el nombre que quieras
header("Cache-Control: public");
header("Content-Description: File Transfer");
header("Content-Disposition: attachment; filename='$name'");
header("Content-Transfer-Encoding: binary");
echo $rtf;

ESPERO LES SIRVA :P