Generar documentos de Word RTF con 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.

Autor

Alfredo Anaya

Director Técnico de ADR Formacion

Compartir

Comentarios

Toni Martorell

18/2/2005
He probado este artículo pero me da un errar en la linea 74. he cambiado la secuencia sql para que atacara a una base de datos de mi servidor pero supongo que no lo hago bien, me gustaria saber si al alguien le a ido bien y si es así como lo ha conseguido.
p.d. podriais hacer un ejemplo más sencillo con la secuencia sql, de antemano muchas gracias por vuestros consejos y clases

Matyx

15/5/2005
No probé la función... pero se podría optimizar mucho la carga del archivo a una variable de texto utilizando:

a)
$var = file_get_contents($nombre_archivo);

b) //Si usamos una version anterior a la 4.3...
$var = implode("", file($nombre_archivo));

Salu2!

German Infante

07/7/2005
el artículo es intresante, le hacen falta algunas líneas de código para realizar bien la conexión a mysql desde PHP. Ya lo probé y funciona perfectamente y como lo dice su autor la plantilla en formato rtf es bastante sensible con caracteres extraños. Edite la plantilla con un editor de php como el maguma y elimine los caracteres extraños y todo funciono OK.
Bucaramanga-Colombia

Fabi

18/8/2005
linea 6 del codigo (función leef())cambiar:
$tamleef - sizeof($texto);
por
$tamleef = sizeof($texto);



Churris

12/1/2006
Hola, parece que la idea del script es bastante buena, pero tiene algunas fallas, por ahi antes del while tiene unos detalles la conexion, sustituyanlo por
mysql_select_db("data_base");
$result = mysql_query($sql);
y al momento de recuperar el dato de la base de datos sería de la siguiente forma
$datosql = $row[$dato[1]];
en vez de
$datosql = $row->$dato[1];

Saludos
El churris

@ndrey

19/1/2006
BUeno ya me funciono el codigo correstamente, le hice algunos cambios pequeños que estan contemplados por otos participantes de este articulo,
Solo cambie un poco la sentencia SQL por una mas basica y puse la ruta completa de la plantilla. Tuve un problema por que no me reeemplazaba los campos en la plantilla por los datos de la BD, intenten primero solo colocabdo en la platilla el #*NOMBRE*#, y cuando ya reeemplace pongan el texto que deseen..

//codigo....

<?php
function leef($fichero)
{
$texto= file($fichero);
$tamleef = sizeof($texto);
for ($n=0; $n<$tamleef;$n++)
{ $todo = $todo.$texto[$n];}
return $todo;
}

function rtf($sql, $plantilla, $fsalida, $matequivalencias)
{
$pre=time();
$fsalida="C:/AppServ/www/1/".$pre.$fsalida;
$link=mysql_connect('localhost','tu_usurio','tu_clave');

$txtplantilla=leef($plantilla);

$matriz=explode("sectd",$txtplantilla);
$cabecera=$matriz[0]."sectd";
$inicio=strlen($cabecera);
$final=strrpos($txtplantilla,"}");
$largo=$final-$inicio;
$cuerpo=substr($txtplantilla,$inicio,$largo);

$punt = fopen($fsalida ,"w");
fputs($punt,$cabecera);
mysql_select_db("tu_db",$link);
$result=mysql_query($sql,$link);
while($row=mysql_fetch_array($result)){
$despues=$cuerpo;
foreach($matequivalencias as $dato){
$datosql=$row[$dato[1]];
$datosql=stripslashes($datosql);
$datortf=$dato[0];
$despues=str_replace($datortf,$datosql,$despues);
}
fputs($punt,$despues);
$saltopag="par page par";
fputs($punt,$saltopag);
}
fputs($punt,"}");
fclose($punt);
return $fsalida;
}



$plantilla="plantilla.rtf";
$sql = "SELECT usuario,contrase FROM usuarios ORDER BY usuario";
$equivalencia[0][0]="#*NOMBRE*#";
$equivalencia[0][1]="usuario";
$equivalencia[1][0]="#*CLAVE*#";
$equivalencia[1][1]="contrase";

$salida=rtf($sql,$plantilla,"certificado.rtf",$equivalencia);
$salida="<A href='$salida'>Obtener</A>";
echo("<p>$salida</p>");
?>

Ha tengan presente el orden enque estan la equivalencias una hace referencia al nombre en la plantilla $equivalencia[0][0]="#*algo*#"; y la otra al campo en la DB $equivalencia[0][1]="nombre campo base de datos";

espero ke les sirva.

@ndrey

19/1/2006
BUeno ya me funciono el codigo correstamente, le hice algunos cambios pequeños que estan contemplados por otos participantes de este articulo,
Solo cambie un poco la sentencia SQL por una mas basica y puse la ruta completa de la plantilla. Tuve un problema por que no me reeemplazaba los campos en la plantilla por los datos de la BD, intenten primero solo colocabdo en la platilla el #*NOMBRE*#, y cuando ya reeemplace pongan el texto que deseen..

//codigo....

<?php
function leef($fichero)
{
$texto= file($fichero);
$tamleef = sizeof($texto);
for ($n=0; $n<$tamleef;$n++)
{ $todo = $todo.$texto[$n];}
return $todo;
}

function rtf($sql, $plantilla, $fsalida, $matequivalencias)
{
$pre=time();
$fsalida="C:/AppServ/www/1/".$pre.$fsalida;
$link=mysql_connect('localhost','tu_usurio','tu_clave');

$txtplantilla=leef($plantilla);

$matriz=explode("sectd",$txtplantilla);
$cabecera=$matriz[0]."sectd";
$inicio=strlen($cabecera);
$final=strrpos($txtplantilla,"}");
$largo=$final-$inicio;
$cuerpo=substr($txtplantilla,$inicio,$largo);

$punt = fopen($fsalida ,"w");
fputs($punt,$cabecera);
mysql_select_db("tu_db",$link);
$result=mysql_query($sql,$link);
while($row=mysql_fetch_array($result)){
$despues=$cuerpo;
foreach($matequivalencias as $dato){
$datosql=$row[$dato[1]];
$datosql=stripslashes($datosql);
$datortf=$dato[0];
$despues=str_replace($datortf,$datosql,$despues);
}
fputs($punt,$despues);
$saltopag="par page par";
fputs($punt,$saltopag);
}
fputs($punt,"}");
fclose($punt);
return $fsalida;
}



$plantilla="plantilla.rtf";
$sql = "SELECT usuario,contrase FROM usuarios ORDER BY usuario";
$equivalencia[0][0]="#*NOMBRE*#";
$equivalencia[0][1]="usuario";
$equivalencia[1][0]="#*CLAVE*#";
$equivalencia[1][1]="contrase";

$salida=rtf($sql,$plantilla,"certificado.rtf",$equivalencia);
$salida="<A href='$salida'>Obtener</A>";
echo("<p>$salida</p>");
?>

Ha tengan presente el orden enque estan la equivalencias una hace referencia al nombre en la plantilla $equivalencia[0][0]="#*algo*#"; y la otra al campo en la DB $equivalencia[0][1]="nombre campo base de datos";

espero ke les sirva.

@ndrey

19/1/2006
BUeno ya me funciono el codigo correstamente, le hice algunos cambios pequeños que estan contemplados por otos participantes de este articulo,
Solo cambie un poco la sentencia SQL por una mas basica y puse la ruta completa de la plantilla. Tuve un problema por que no me reeemplazaba los campos en la plantilla por los datos de la BD, intenten primero solo colocabdo en la platilla el #*NOMBRE*#, y cuando ya reeemplace pongan el texto que deseen..

//codigo....

<?php
function leef($fichero)
{
$texto= file($fichero);
$tamleef = sizeof($texto);
for ($n=0; $n<$tamleef;$n++)
{ $todo = $todo.$texto[$n];}
return $todo;
}

function rtf($sql, $plantilla, $fsalida, $matequivalencias)
{
$pre=time();
$fsalida="C:/AppServ/www/1/".$pre.$fsalida;
$link=mysql_connect('localhost','tu_usurio','tu_clave');

$txtplantilla=leef($plantilla);

$matriz=explode("sectd",$txtplantilla);
$cabecera=$matriz[0]."sectd";
$inicio=strlen($cabecera);
$final=strrpos($txtplantilla,"}");
$largo=$final-$inicio;
$cuerpo=substr($txtplantilla,$inicio,$largo);

$punt = fopen($fsalida ,"w");
fputs($punt,$cabecera);
mysql_select_db("tu_db",$link);
$result=mysql_query($sql,$link);
while($row=mysql_fetch_array($result)){
$despues=$cuerpo;
foreach($matequivalencias as $dato){
$datosql=$row[$dato[1]];
$datosql=stripslashes($datosql);
$datortf=$dato[0];
$despues=str_replace($datortf,$datosql,$despues);
}
fputs($punt,$despues);
$saltopag="par page par";
fputs($punt,$saltopag);
}
fputs($punt,"}");
fclose($punt);
return $fsalida;
}



$plantilla="plantilla.rtf";
$sql = "SELECT usuario,contrase FROM usuarios ORDER BY usuario";
$equivalencia[0][0]="#*NOMBRE*#";
$equivalencia[0][1]="usuario";
$equivalencia[1][0]="#*CLAVE*#";
$equivalencia[1][1]="contrase";

$salida=rtf($sql,$plantilla,"certificado.rtf",$equivalencia);
$salida="<A href='$salida'>Obtener</A>";
echo("<p>$salida</p>");
?>

Ha tengan presente el orden enque estan la equivalencias una hace referencia al nombre en la plantilla $equivalencia[0][0]="#*algo*#"; y la otra al campo en la DB $equivalencia[0][1]="nombre campo base de datos";

espero ke les sirva.

Pere

30/1/2006
¡Hola! Ahora mismo no tengo aquí un ejemplo de código parecido al tuyo que pillé de un libro. (te felicito, es muy bueno).
Pero alguien sabría insertar una imagen en el documento final RTF? (una imagen que se encuentra en la bdd y es distinta para cada usuario.
Por ejemplo, en el caso que tú pones, como si tubiera que aparecer la fotografía de cada alumno.

Soy incapaz de conseguirlo, aún habiendo hecho millones de purebas.

favs_01

16/2/2006
Hola he probado este articulo y me genera un error que no he podido resolver

Warning: file(plantilla.rft) [function.file]: failed to open stream: No such file or directory in C:ServidorWEBSECaepafconstanciaapfrtf.php on line 7

no me encuentra el fichero pero este si se encuentra en el directorio

Aguien le ha ido bien ??

favs_01

16/2/2006
Hola he solucionado el problema del archivo con el ejemplo de @ndrey, pero ahora obtengo el archivo en blanco =(

aqui les pongo lo que estoy haciendo

function leef($fichero)
{
$texto= file($fichero);
$tamleef = sizeof($texto);
for ($n=0; $n<$tamleef;$n++)
{ $todo = $todo.$texto[$n];}
return $todo;
}

function rtf($plantilla, $fsalida, $matequivalencias)
{
$pre=time();
$fsalida="reporte".$pre.$fsalida;

$txtplantilla=leef($plantilla);

$matriz=explode("sectd",$txtplantilla);
$cabecera=$matriz[0]."sectd";
$inicio=strlen($cabecera);
$final=strrpos($txtplantilla,"}");
$largo=$final-$inicio;
$cuerpo=substr($txtplantilla,$inicio,$largo);

$punt = fopen($fsalida ,"w");
fputs($punt,$cabecera);
require_once('conexion.php');
require_once('conexionct.php');
$busqueda = mysql_query("SELECT a.*, b.NOMBRELOC, c.NOMBRECT, d.NOMBRE_DIR, d.PUESTO, d.FIRMA from asoc.integrantes a, asoc.a_itba b, ctba.a_ctba c, asoc.firma_constancias d where a.CCT = '".$_COOKIE["clavecct"]."' and b.MUNICIPIO = a.NMPIO AND b.LOCALIDAD = '0000' AND a.CTIPOASOC = 'APF' and a.CPUESTO = 'PR' AND c.CLAVECCT = '".$_COOKIE["clavecct"]."'");
$row = mysql_fetch_array($busqueda);
//mysql_select_db("tu_db",$link);
//$result=mysql_query($sql,$link);
while($row=mysql_fetch_array($busqueda)){
$despues=$cuerpo;
foreach($matequivalencias as $dato){
$datosql=$row[$dato[1]];
$datosql=stripslashes($datosql);
$datortf=$dato[0];
$despues=str_replace($datortf,$datosql,$despues);
}
fputs($punt,$despues);
$saltopag="par page par";
fputs($punt,$saltopag);
}
fputs($punt,"}");
fclose($punt);
return $fsalida;
}



$plantilla="plantilla.rtf";
//$sql = "SELECT a.*, b.NOMBRELOC, c.NOMBRECT, d.NOMBRE_DIR, d.PUESTO, d.FIRMA from asoc.integrantes a, asoc.a_itba b, ctba.a_ctba c, asoc.firma_constancias d where a.CCT = '".$_COOKIE["clavecct"]."' and b.MUNICIPIO = a.NMPIO AND b.LOCALIDAD = '0000' AND a.CTIPOASOC = 'APF' and a.CPUESTO = 'PR' AND c.CLAVECCT = '".$_COOKIE["clavecct"]."'";
$equivalencias[0][0]="#*NOMBREPR*#";
$equivalencias[0][1]="CNOMBRE";
$equivalencias[1][0]="#*NOMBRECCT*#";
$equivalencias[1][1]="NOMBRECCT";
$equivalencias[2][0]="#*MUNICIPIO*#";
$equivalencias[2][1]="NOMBRELOC";
$equivalencias[3][0]="#*CLAVECCT*#";
$equivalencias[3][1]="CCT";
$equivalencias[4][0]="#*CLAVEASOC*#";
$equivalencias[4][1]="CCLAVEASOC";

$salida=rtf($plantilla,"certificado.rtf",$equivalencia);
$salida="<A href='$salida'>Obtener</A>";
echo("<p>$salida</p>");
?>

genaro

23/6/2006
muy bueno el articulo, yo realice lo mismo pero para una base de datos postgresql, ademas cambie algunos valores al principio para iniciar las variables.
function leef($fichero)
{
$texto=file($fichero);
$tamleef=0;
$tamleef=$tamleef+sizeof($texto);
//$tamleef sizeof($texto);
for($n=0 ; $n < $tamleef ;$n++)
{
$todo=$todo.$texto[$n];
}
return $todo;
}

celia

06/7/2006
hola,
Yo tengo un problema que se ha planteado más arriba: insertar una imagen en el documento final RTF (una imagen que se encuentra en la bdd y es distinta para cada usuario).
He probado de mil maneras pero no he podido conseguirlo.
Alguien sabe cómo hacerlo?

c3sar

14/9/2006
tan puro gueviando,, HAY UNA FORMA MAS FACIL

omar

07/11/2006
hola amigos estoy formando una pagina pero quiero q un archivo en word ponerlo en mi pagina para q lo revisen y me den una respuesta del documento gracais si alguien me puede ayudar

zamora

07/11/2006
hola amigos en mi pagina quiero poner archivos en word para q lo revise otro usuario y me envie una respuesta del documento como un comentario pero automaticamante se almacene en mi base de datos; la base de datos es solicitudes y los campos son aceptada o rechazada dependiendo de la respuesta de usuario por favor si alguien me pùede ayudar

Williams

01/12/2006
Amigos me sale esto "sectd\par \page \par}" en el word!!!!!!alguien me puede ayudar porfavor????? Gracias

galax13a

04/10/2007
bueno amigo mio es muy interesante tu aporte sobre el tema q trata , pero seria recomentable que no pegaras las images ya que es dificil trasquibir ya que se pueden producir errores . seria recomendable q siempre trabajas textos si es posible o mejor aun si tenez el .zip para bajarlo seria famuloso de ante mando gracias por tu aporte.

Juan Carlos Hinojosa

15/1/2009
Alguien conoce en un libro que se exponga el tema con mayor detalle

alma

14/4/2009
pueden ayudarme
hola el articulo esta muy padre,probe el codigo y funciona de maravilla pero solo desde mi servidor local,bueno quiero decir que funciona con un direccionamiento de este tipo:c://......., pero ya con direccion como http://...., ya no me funciona, es posible direccionarlo de esta forma???

Mister_F

29/4/2009
LA SOLUCION a esto!
Saludos, amigos despues de tanto luchar he logrado conseguir que funcione una plantilla con logotipo, tablas, etc en RTF, no precisamente con esta funcion aqui colocada sino con este codigo:

<?PHP
// Se Lee la plantilla
$plantilla = file_get_contents('nombre_de_tu_plantilla.rtf');

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

// Se Procesa la plantilla, AQUI ES DONDE SE HACE EL TRUCO!!
eval( '$rtf = <<<EOF_RTF
' . $plantilla . '
EOF_RTF;
' );

//simplemente le doy un nombre, sin la extension
$NombreFormato='Lo_ke_yo_kiera';

// Guarda el RTF generado, el nombre del RTF
file_put_contents("$NombreFormato.rtf",$rtf);

?>

Lo que hay que hacer es la plantilla en WORDPAD!, no en Word. y los campos que quieren que aparezcan cambiados solo colocarles el simbolo pesos ($) adelante, por ejemplo $mivariable, y ya esta.

Tengo ejemplos reales en la aplicacion comercial que estoy generando para manejo logistico, Cualquier duda con mucho gusto a mi correo.

alexander casas ravello

29/6/2009
No se por k tanto codigo
No entiendo realmente por q' tanto codigo pero bueno...
les voy a pasar mi codigo ok para generar archivos de word okix
//usare su funcion para leer archivos ok
function leer($fichero){
$todo="";
$texto=file("documento/".$fichero);
$tamleef=sizeof($texto);
for ($n=0;$n<$tamleef;$n++)
{
$todo=$todo.$texto[$n];
}
return $todo;
}

function generar_carta_compromiso($id,$modalidad){

//obtengo los datos de la bd
$datos=$this->db->get_where("cliente",array('id_cliente' => $id));
//lleno el array con las variables recogidas por la bd
foreach($datos->result() as $row) :
$arr = array(
"#*apellido_paterno*#" => strtoupper($row->apellido_paterno),
"#*apellido_materno*#" => strtoupper($row->apellido_materno),
"#*nombres*#" => strtoupper($row->nombres),
"#*dni*#" => strtoupper($row->dni),
"#*modalidad*#" =>$modalidad,
"#*direccion_obra*#"=>strtoupper($row->obra_direccion),
"#*distrito_obra*#"=>strtoupper($row->obra_distrito)
);
endforeach;
//cargo el archivo rtf y le paso los valores ... P.D.: chekeen la funcion strtr toy algo cansadito xD

$salida=strtr($this->leer("carta_compromiso.rtf"),$arr);
//creo los encabezados de word y le doy el nombre de mi archivo por si aka estoy imprimiendo el nombre de mi cliente para k se guarde el doc ok
header ("Content-type: application/msword");
header("Content-Disposition: inline; filename=carta_compromiso_".strtoupper($row->apellido_paterno)."_".strtoupper($row->apellido_materno)."_".strtoupper($row->nombres).".doc");
echo "$salida";


}


espero les haya servido, me gusta simplificar codigos ok me sirvio mucho este graxiax, bueno bye k uno debe programar como si tu jefe fuera un ogro jajaja

Marco

07/7/2009
del codigo de alexander casas ravello
Me parece mmuy bueno tu código , pero no lo he podido echar andar, lo copie y remplze mis datos y al ejecutarlo no me hace nada :( , soy un novato en PHP, pero no le he encontrado, espero me puedas ayudar. Saludos

AVALON

27/7/2009
oigan un punto como es para varios datos de la base
esto es algo que me gustaria saber, aver si me doy a entender:
tengo una tabla que tiene varios datos de un paciento esto es resultado de lab 1, lab 2 y lab 3, que estan relacionados con este paciente, y el formato tiene unas tablas como poner estos datos dentro de la tabla dado que este formateador de rtf solo lo hace con datos especificos y necesito repetirlo solo en una tabla........ no repetir las hojas...

dJ KIRE

17/8/2009
foreach me da error
en la linea de el forech me da un error invalid argument me podrian ayudar!!!

eduardo

01/10/2009
Generar docx con PHP
Esta herramienta permite generar sofisticados documentos de word (texto, gráficas, cabeceras,...) mediante PHP. http://www.phpdocx.com

juan_felipe_sarmiento

30/7/2010
Problemas con tablas
Tengo problemas al querer remplazar los datos de una tabla, todo me funciona pero con tablas imposible.

ingjuanfelipe

22/9/2010
Generar Hojas Dinámicas
Hola, como puedo hacer para repetir tantas hojas necesite dentro del mismo formato, necesito duplicar la info tantas veces lo pase como parámetro, es posible hacer esto antes de remplazar los valores del formato?

David Ortega

02/2/2011
Problemas con acentos y ñ
Estimados el codigo va bien pero tengo un problema las Ñ y las tildes la reemplaza con caracteres especiales, que debo hacer?
ya puse
header("Content-Type: text/html; charset=iso-8859-1");

Mauricio

22/3/2011
Muy bueno el codigo !
quiero agradecer al autor de post!! muy buena el codigo, funciona excelente, tambien use las mejoras que fueron dejando los demas..

Pero tengo la siguiente consulta:
necesito que el archivo final, el documento que se crea en rtf, necesto que salga en PDF, ¿como lo puedo transformar mediante codifo ?

que el usuario pueda descargar el documento creado, pero en pdf...

gracias por la ayuda,.

JANETTE

19/4/2011
Tablas RTF
Tengo un sistema en php, con un formulario con unboton de generar : word y pdf, cuando inserto una tabla en el pdf me aparece bien, pero en word no me respeta la tabla, solo pone el texto sin la tabla, como corrijo el error. Gracias

kubid

25/5/2011
Convertir RTF a PDF en PHP
Buenas tardes.

Hemos conseguido generar unos archivos RTF siguiendo el manual y nos ha funciona perfectamente.

Esto nos permite que el cliente pueda generar las plantillas RTF y nosotros con PHP generamos los documentos sustituyendo las etiquetas por la información que tenemos en lala base de datos.

Ahora hemos llegado al punto que necesitamos convertir dichos documentos RTF al formato PDF, pero no hemos encontrado ninguna librería o parecido para poder realizarlo directamente con PHP.

Alguien podría indicarnos si conocen alguna solución para realizar dicha operación.

Muchas gracias.

ericksuper

20/11/2011
NO JALA ARCHIVOS DE MI WeB
BUEN DIA QUISE CONECTAR A UNA BASE DE DATOS PERO PARESE QUE ALGO ESTA MAL NO ME JALA UN ARCHIVO, SI PUDIERAS ME PODRIAS ESCRIBIR LA SENTENCIA DETALLADAMENTE,

GRACIAS

ferdinand

13/9/2012
ayuda.
laguien me podria pasar un ejemplo de este tema no importa que sea con un solo campo, aplicacion,php,plantilla se les agradecera...

Carlos Sanchez

16/10/2012
DUDAS CON EL CODIGO
EL CODIGO ME FUNCIONO PERFECTO CUADNO LO PROBE LOCAL PERO AHORA ME DA PROBLEMAS CUANDO LO MONTE AL SERVIDOR YA QUE ME LO GUARDA EN OTRA UBICACION Y EN BLANCO QUIEN ME PODRIA AYUDAR<br />
, LA CONEXION SE RELAIZO CON POSTGRES, SALUDOS Y GRACIAS<br />
<br />
&lt;?php<br />
function leef($fichero)<br />
{<br />
$texto= file($fichero);<br />
$tamleef = sizeof($texto);<br />
for ($n=0; $n&lt;$tamleef;$n++)<br />
{ $todo = $todo.$texto[$n];}<br />
return $todo;<br />
}<br />
<br />
function rtf($sql, $plantilla, $fsalida, $matequivalencias)<br />
{<br />
$pre=time();<br />
$fsalida=$_SERVER[&#039;DOCUMENT_ROOT&#039;].&quot;SIMCEDMod_Historialplanilla_Generadas&quot;.$pre.$fsalida;<br />
//$fsalida=&quot;C:varwwwlogicasa_desaSIMCEDMod_Historialplanilla_Generadas&quot;.$pre.$fsalida;<br />
$user = &#039;postgres&#039;;<br />
$passwd = &#039;postgres&#039;;<br />
$db = &#039;SIMCED&#039;;<br />
$port = 5432;<br />
$host = &#039;127.0.0.1&#039;;<br />
$strCnx = &quot;host=$host port=$port dbname=$db user=$user password=$passwd&quot;;<br />
$link=pg_connect($strCnx);<br />
<br />
$txtplantilla=leef($plantilla);<br />
<br />
$matriz=explode(&quot;sectd&quot;,$txtplantilla);<br />
$cabecera=$matriz[0].&quot;sectd&quot;;<br />
$inicio=strlen($cabecera);<br />
$final=strrpos($txtplantilla,&quot;}&quot;);<br />
$largo=$final-$inicio;<br />
$cuerpo=substr($txtplantilla,$inicio,$largo);<br />
<br />
$punt = fopen($fsalida ,&quot;w&quot;);<br />
fputs($punt,$cabecera);<br />
//mssql_select_db(&quot;SGRH1&quot;,$link);<br />
$result=pg_query($sql);<br />
while($row=pg_fetch_array($result)){<br />
$despues=$cuerpo;<br />
foreach($matequivalencias as $dato){<br />
$datosql=$row[$dato[1]];<br />
$datosql=stripslashes($datosql);<br />
$datortf=$dato[0];<br />
$despues=str_replace($datortf,$datosql,$despues);<br />
}<br />
fputs($punt,$despues);<br />
//$saltopag=&quot;par page par&quot;;<br />
fputs($punt,$saltopag);<br />
}<br />
fputs($punt,&quot;}&quot;);<br />
fclose($punt);<br />
return $fsalida;<br />
}<br />
<br />
<br />
function GenerarDoc($idModificador) {<br />
$idModificador;<br />
<br />
$plantilla=&quot;plantilla.rtf&quot;;<br />
//Incluimos libreria<br />
include_once(&quot;class_historial/class_Historial.php&quot;);<br />
$objectDocument= new operacionHistorial();<br />
$fecha_actual = date(&quot;d/m/Y&quot;);<br />
$sql = $objectDocument-&gt;selectDocumentoG($idModificador,$fecha_actual);<br />
<br />
$equivalencia[0][0]=&quot;#*Solicitante*#&quot;;<br />
$equivalencia[0][1]=&quot;nombre_doc&quot;; <br />
$equivalencia[1][0]=&quot;#*Dia*#&quot;;<br />
$equivalencia[1][1]=&quot;dia&quot;; <br />
$equivalencia[2][0]=&quot;#*Mes*#&quot;;<br />
$equivalencia[2][1]=&quot;mes&quot;; <br />
$equivalencia[3][0]=&quot;#*Anio*#&quot;;<br />
$equivalencia[3][1]=&quot;anio&quot;; <br />
$equivalencia[4][0]=&quot;#*cant_personas*#&quot;;<br />
$equivalencia[4][1]=&quot;id_doc_aso&quot;; <br />
$equivalencia[5][0]=&quot;#*Especialidad*#&quot;;<br />
$equivalencia[5][1]=&quot;descripcion&quot;; <br />
$equivalencia[6][0]=&quot;#*tiempo*#&quot;;<br />
$equivalencia[6][1]=&quot;per_dest&quot;;<br />
$equivalencia[7][0]=&quot;#*gerencia*#&quot;;<br />
$equivalencia[7][1]=&quot;cargo_dest&quot;;<br />
$equivalencia[8][0]=&quot;#*cant_personas*#&quot;;<br />
$equivalencia[8][1]=&quot;NUMERO_PLAZAS&quot;;<br />
$equivalencia[9][0]=&quot;#*Especialidad*#&quot;;<br />
$equivalencia[9][1]=&quot;ESPECIALIDAD&quot;;<br />
$equivalencia[10][0]=&quot;#*tiempo*#&quot;;<br />
$equivalencia[10][1]=&quot;TIPO_CONTRATO&quot;;<br />
$equivalencia[11][0]=&quot;#*gerencia*#&quot;;<br />
$equivalencia[11][1]=&quot;AREA&quot;;<br />
$equivalencia[12][0]=&quot;#*Funciones*#&quot;;<br />
$equivalencia[12][1]=&quot;FUNCIONES&quot;;<br />
$equivalencia[13][0]=&quot;#*Beneficios*#&quot;;<br />
$equivalencia[13][1]=&quot;BENEFICIOS&quot;;<br />
$equivalencia[14][0]=&quot;#*Observaciones*#&quot;;<br />
$equivalencia[14][1]=&quot;OBSERVACIONES&quot;;<br />
$equivalencia[15][0]=&quot;#*Aprobado*#&quot;;<br />
$equivalencia[15][1]=&quot;APROBACION&quot;;<br />
<br />
<br />
<br />
$salida=rtf($sql,$plantilla,&quot;certificado.rtf&quot;,$equivalencia);<br />
/*$salida=&quot;&lt;a href=&#039;$salida&#039;&gt;Obtener&lt;/a&gt;&quot;;*/<br />
/*echo (&quot;&lt;p&gt;$salida&lt;/p&gt;&quot;);*/<br />
return $salida;<br />
<br />
}<br />
?&gt;

emma

27/11/2013
variables truncadas
hola todo muy bien, el código me ha funcionado perfecto, solo que a veces me pasa que las variables para reemplazar se me truncan en el documento, por ejemplo #*pena_convencional*# se me trunca así { tlchfcs1 af1afs21 ltrchfcs0 f39fs21highlight7insrsid13397037charrsid23260 64 #*pena}{ tlchfcs1 af1afs21 ltrchfcs0 f39fs21highlight7insrsid15283324charrsid23260 64 _}{ tlchfcs1 af1afs21 ltrchfcs0 f39fs21highlight7insrsid13397037charrsid23260 64 convencional*#} y por lo tanto no puede ser sustituida, alguien sabe como lograr que no pase eso?

hector_rivera58472

11/11/2015
error
function leef($fichero)
{
$texto= file($fichero);
$tamleef = sizeof($texto);
for ($n=0; $n<$tamleef;$n++)
{ $todo = $todo.$texto[$n];}
return $todo;
}
en esta parte me dice que la variable todo no esta definida
function leef($fichero)
{
$todo="";
$texto= file($fichero);
$tamleef = sizeof($texto);
for ($n=0; $n<$tamleef;$n++)
{ $todo = $todo.$texto[$n];}
return $todo;
} corrijo el error asi pero cuando descargo el documento no rtf solo me muestra #*nombre*#, #*apellido*#,
en vez de jesus , david

hector_rivera58472

12/11/2015
éxito
Hola que tal ya logre generar el rtf
bueno resulta que la plantilla RTF yo la creaba desde mi pc y luego la copiaba y la pegaba en una carpeta del servidor y solo la podía visualizar con wordpad, entonces me decidí a construir el archivo rtf y el código php desde cero nuevamente pero desde mi pc personal y resulta que funcionó sin problemas.
luego de pensar un rato y hacer comparaciones me di cuenta que el código php y el archivo rtf quedaron igualitos, con la diferencia que mi pc personal funcionaba bien y en el servidor no , luego revise el ambiente de desarrollo en el servidor y el mi pc personal y estaba iguales, después de un rato de me dije a mi mismo, y si instalo el paquete de offices en el servidor.
y puf mágicamente mente funcionó. de alguna manera para generar el rft necesita librerías o dlls propias del paquete de offices de microsoft.
otra cosa que note y que se debe de tener en cuenta al momento de realizar el rft es que cuando se cargue la consulta el registro que se esta consultado debe de existir en la base de datos porque de lo contrario cuando se baje el rtf te va a parecer un documento en blanco.
y con respeto al código hay algunos códigos que requieren inicializar la variable $todo como vacía lo hacen antes de iniciar el el ciclo for y listo

TOMAS

04/4/2016
SALTO DE LINEA
Hola que tal

Realice tu código el que me muestras al principio y me funciona muy bien, solo tengo un inconveniente,
Cuando digito el número de identificación(como tengo la consulta) y tiene el usuario varios registros con ciertos datos pues me sale en la pagina asigna y todo muy bien, el problema es el salto de pagina, ya que si tiene varios registro pues el salto de pagina va bajando..es decir:

Lo tengo asi:
Xxxxxxxxxxx NOMBRE DEL CONTRATISTA XXXXXXXXXXX XXXXXXXXXX XXXXXXXXX NUMERO_IDENTIFICACION XXXX XXX XXXXX
TIPO CONTRATO XXXXXX NUMERO_CONTRATO
XXXX:OBJETO
FECHA:INICIO Y FINAL
XXXXX : (VALOR CONTRATO)

XXXXXXXXXXXX
XXXXXXXXXXXXXXX

Este es el cuerpo del oficio, pero cuando tiene varios registros pues va bajando y no se cuadra como va en el primer ciclo donde está ubicado el primer contenido y así sucesivamente se va mostrando.

No se como cuadrar que cuando inicio una nueva pagina coloque todo igual que la primera...

Adri

24/6/2016
Datos manuales
Como hariamos para meter en ese mismo código un dato manual?
he intentado a hacer esto pero da error:
$datomanual="PEDRO";
$equivalencias[0][0]="*(NOMBRE)*";
$equivalencias[0][1]=$datomanual;

alguien podría decirme por favor?
Un saludo

Raey

10/1/2017
Varios registros
Como podría hacerlo para una consulta para realizar varios documentos, ya que se me generan en el servidor pero no en el equipo local, solo descarga uno pero como archivo corrupto, alguno sabria como hacerlo que me pudiera orientar.

HECTOR F.SANCHEZ

13/7/2017
RTF
Excelente el Material, he logrado generar desde una base de datos un informe. MUCHAS GRACIAS!!

Consulta: Se podra insertar una Imagen con la misma sencillez de un campo?