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
// 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).
20 comentarios:
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.
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.
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.
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
GRACIAS, funciona excelente ya puedo ver bien los acentos.
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????
Julio Capuano GRACIASSSSSSSSSSSSSSS GRACIASSSSS Y CIEN MIL GRACIAS MAS, uffff todo lo que he buscado para encontrar esta solucion!!!
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.
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?
gracias a julio capuano
su solución todavía funciona.
Muchas Gracias hermano que belleza??? dos días buscando informacion, poniendo el mensaje en foros y nada. Mil Gracias
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!
Hola, gracias por tu ayuda :), tenia el problema de los signos raros
Hola, un buen ejemplo.
Alguien sabe cómo puedo lograr que el archivo me descargue en web.
Gracias
Marcela!
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
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?
Quiero agradecer tu aporte Rodi, me ha sacado de un gran apuro, gracias, gracias y más gracias. Me ha ido espectacular. Saludos. Juanjo
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.
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
Publicar un comentario