> Manuales > Gestión de archivos en PHP

Crear archivos RTF combinando un documento con datos almacenados en la Intranet/Extranet.

En muchos desarrollos web surge la necesidad de crear documentos que proceden de la combinación de un documento origen con los datos almacenados en la Intranet/Extranet de la empresa, algo parecido a lo que se consigue con la combinación de correspondencia de Word.

Ejemplos prácticos pueden ser los siguientes:

Generación de etiquetas a partir de una base de datos de clientes o artículos
Certificados o diplomas para los alumnos de un curso
Listados de participantes en un evento.
El control de la impresión 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 artículo desarrollaremos un ejemplo práctico, 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:

Partimos del documento en formato de Word que queremos obtener.
Convertimos el formato .DOC en .RTF. (Los archivos .RTF son de texto legible)
Introducimos en el documento .RTF unos códigos manuales que serán sustituidos por los datos procedentes de la base de datos.
Creamos una aplicación en PHP que lea el archivo .RTF y sustituya los códigos introducidos por los datos buscados.

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 varía 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 códigos fácilmente reconocibles. Ojo, el formato RTF es muy puñetero, por lo que será preciso escribir los códigos 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 función 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 función por tanto devuelve el contenido de un fichero.

La siguiente función, rtf(), es la que crea un RTF a partir de una plantilla y sustituyendo los códigos por los datos de la Intranet.



Esta función recibe cuatro argumentos:

$sql: la sentencia sql que devuelve los datos que se necesitan
$plantilla: la plantilla RTF con los códigos
$fsalida: el nombre del fichero resultado
$matequivalencias: una matriz con las equivalencias entre los datos procedentes de la sentencia sql y los campos del certificado.
Vamos a comentar línea por línea el programa:

Las líneas 13 y 14 determinan el nombre y la ruta del fichero de salida, utilizamos la función time() para asegurarnos de que no se producirán dos ficheros con el mismo nombre.

En la línea 17 se almacena el contenido de la plantilla en la variable $txtplantilla

En las líneas 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 información extraemos el cuerpo.

En el paso 3, a partir de la línea 26 vamos escribiendo el archivo resultado.

En la línea 27 escribimos la cabecera del documento

En la línea 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 línea 30 creamos una copia del cuerpo del documento llamada $despues, sobre esa copia realizaremos los cambios.

En la línea 31 entramos en un bucle que recorre la matriz de equivalencias, la línea 32 obtiene de la base de datos el dato, la línea 34 obtiene de la matriz el código a sustituir en la plantilla y la línea 35 sustituye el dato por el código.

Una vez sustituidos todos los campos la línea 37 escribe el certificado del alumno y las líneas 38 y 39 generan un salto de página para volver a escribir el siguiente certificado.

Una vez que hemos salido del While que va extrayendo los datos, la línea 41 cierra el documento rtf y la 42 la escritura del fichero.

Tercer paso, Llamada a la función RTF:
Una vez hemos creado estas dos funciones ya podemos llamar a la función rtf() y generar el documento.



Comentamos las líneas:

En la línea 48 especificamos cual es la plantilla.

En la línea 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 líneas desde la 50 a la 71 creamos la matriz de equivalencias, se trata de una matriz de dos dimensiones que relaciona el código que se encontrará en el archivo RTF con el campo de la sentencia SQL.

La línea 72 llama a la función rtf()

Y por fin las líneas 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.

Además tenemos desarrollados ejemplos de listados y de etiquetas que podemos documentar en posteriores artículos.

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 también podemos abordar en posteriores artículos.

Alfredo Anaya

Director Técnico de ADR Formacion

Manual