Comentarios sin revisar del artículo: Generar documentos de Word RTF con php

22 comentarios sin revisar
12/1/06

Por: Churris
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
19/1/06

Por: @ndrey
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.
19/1/06

Por: @ndrey
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.
19/1/06

Por: @ndrey
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.
30/1/06

Por: Pere
¡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.
16/2/06

Por: favs_01
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 ??
16/2/06

Por: favs_01
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>");
?>
23/6/06

Por: genaro
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;
}
06/7/06

Por: celia
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?
14/9/06

Por: c3sar
tan puro gueviando,, HAY UNA FORMA MAS FACIL
07/11/06

Por: omar
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
07/11/06

Por: zamora
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
01/12/06

Por: Williams
Amigos me sale esto "sectd\par \page \par}" en el word!!!!!!alguien me puede ayudar porfavor????? Gracias
04/10/07

Por: galax13a
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.
15/1/09

Por: Juan Carlos Hinojosa
Alguien conoce en un libro que se exponga el tema con mayor detalle
14/4/09
pueden ayudarme
Por: alma
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???
29/4/09
LA SOLUCION a esto!
Por: Mister_F
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.
29/6/09
No se por k tanto codigo
Por: alexander casas ravello
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
07/7/09
del codigo de alexander casas ravello
Por: Marco
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
27/7/09
oigan un punto como es para varios datos de la base
Por: AVALON
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...
17/8/09
foreach me da error
Por: dJ KIRE
en la linea de el forech me da un error invalid argument me podrian ayudar!!!
01/10/09
Generar docx con PHP
Por: eduardo
Esta herramienta permite generar sofisticados documentos de word (texto, gráficas, cabeceras,...) mediante PHP. http://www.phpdocx.com

Alojados en el grupo