You are on page 1of 7

Generar documentos de Word RTF con php

Jos Luis Del Rincn 25-01-2005

Origen del articulo: http://www.adrformacion.com

Introduccin.
En muchos desarrollos web surge la necesidad de crear documentos que proceden de la combinacin de un documento origen con los datos almacenados en la Intranet/Extranet de la empresa, algo parecido a lo que se consigue con la combinacin de correspondencia de Word. Ejemplos prcticos pueden ser los siguientes: Generacin de etiquetas a partir de una base de datos de clientes o artculos Certificados o diplomas para los alumnos de un curso Listados de participantes en un evento. El control de la impresin desde un documento HTML es algo bastante complejo, por lo que generar un documento DOC, o mejor dicho RTF, nos permitir resolver nuestro problema de una manera muy efectiva. En este artculo desarrollaremos un ejemplo prctico, el de obtener un certificado de asistencia para cada uno de los alumnos que asisten a un curso.

La estrategia.
Nuestra estrategia se fundamenta en los siguientes pasos: 1. Partimos del documento en formato de Word que queremos obtener. 2. Convertimos el formato .DOC en .RTF. (Los archivos .RTF son de texto legible) 3. Introducimos en el documento .RTF unos cdigos manuales que sern sustituidos por los datos procedentes de la base de datos. 4. Creamos una aplicacin en PHP que lea el archivo .RTF y sustituya los cdigos introducidos por los datos buscados.

Manos a la obra.
Primer paso. Preparar la plantilla.
Para nuestro ejemplo partimos de un documento .DOC que certifica que un alumno ha realizado un curso. En la siguiente imagen vemos un certificado tipo.

Ser preciso crear un certificado para cada uno de los alumnos que ha realizado un curso, los datos que vara son los del alumno y los del curso realizado. Una vez abierto el documento con Word, lo guardamos en formato RTF y sustituimos cada dato variable por unos cdigos fcilmente reconocibles. Ojo, el formato RTF es muy puetero, por lo que ser preciso escribir los cdigos sin confundirse para que no se introduzcan caracteres raros.

En el caso del ejemplo utilizamos la # y el * de tal manera que por ejemplo, sustituimos el nombre del alumno por #*NOMBRE*# Guardaremos el documento con el nombre de plantilla.rtf

Segundo paso. El programa PHP.


Crearemos dos funciones auxiliares, la primera se llama leef().

Esta funcin como se puede ver, recibe como argumento el nombre del fichero RTF, lo abre y almacena el contenido en la variable de texto $todo. Esta funcin por tanto devuelve el contenido de un fichero. La siguiente funcin, rtf(), es la que crea un RTF a partir de una plantilla y sustituyendo los cdigos por los datos de la Intranet.

Esta funcin recibe cuatro argumentos: 1. $sql: la sentencia sql que devuelve los datos que se necesitan 2. $plantilla: la plantilla RTF con los cdigos 3. $fsalida: el nombre del fichero resultado 4. $matequivalencias: una matriz con las equivalencias entre los datos procedentes de la sentencia sql y los campos del certificado. Vamos a comentar lnea por lnea el programa: Las lneas 13 y 14 determinan el nombre y la ruta del fichero de salida, utilizamos la funcin time() para asegurarnos de que no se producirn dos ficheros con el mismo nombre.

En la lnea 17 se almacena el contenido de la plantilla en la variable $txtplantilla En las lneas de la 19 a la 24 se extrae el cuerpo del documento RTF, el cuerpo del documento es lo que se repite, para extraerlo primero obtenemos la cabecera del documento, la cabecera queda determinada por la etiqueta rtf sectd. Un documento rtf termina siempre en }, con esa informacin extraemos el cuerpo. En el paso 3, a partir de la lnea 26 vamos escribiendo el archivo resultado. En la lnea 27 escribimos la cabecera del documento En la lnea 28 ejecutamos la consulta y en la 29 entramos un un bucle, en cada ciclo obtendremos los datos de un alumno y crearemos un certificado. En la lnea 30 creamos una copia del cuerpo del documento llamada $despues, sobre esa copia realizaremos los cambios. En la lnea 31 entramos en un bucle que recorre la matriz de equivalencias, la lnea 32 obtiene de la base de datos el dato, la lnea 34 obtiene de la matriz el cdigo a sustituir en la plantilla y la lnea 35 sustituye el dato por el cdigo. Una vez sustituidos todos los campos la lnea 37 escribe el certificado del alumno y las lneas 38 y 39 generan un salto de pgina para volver a escribir el siguiente certificado. Una vez que hemos salido del While que va extrayendo los datos, la lnea 41 cierra el documento rtf y la 42 la escritura del fichero.

Tercer paso. Llamada a la funcin RTF.


Una vez hemos creado estas dos funciones ya podemos llamar a la funcin rtf() y generar el documento.

Comentamos las lneas: En la lnea 48 especificamos cual es la plantilla. En la lnea 49 establecemos la sentencia SQL que extrae los datos, en el caso del ejemplo es un poco compleja pues extrae los datos de varias tablas. En las lneas desde la 50 a la 71 creamos la matriz de equivalencias, se trata de una matriz de dos dimensiones que relaciona el cdigo que se encontrar en el archivo RTF con el campo de la sentencia SQL. La lnea 72 llama a la funcin rtf() Y por fin las lneas 73 y 74 generan un enlace al archivo resultado.

Mejoras y comentarios.
Todo en esta vida es susceptible de ser mejorado, en este caso me queda pendiente el generar el archivo de salida directamente al navegador, con el objeto de no tenerlo que escribir en el disco duro. Adems tenemos desarrollados ejemplos de listados y de etiquetas que podemos documentar en posteriores artculos. Un aspecto importante para seguir progresando en este tema es conocer la sintaxis de los documentos rtf, se trata de un trabajo un poco durillo que tambin podemos abordar en posteriores artculos.

You might also like