Portada | Monotemáticos | Secciones | Desarrolladores | Comunidad | Servicios | Servicios profesionales | RSS
Desde 0 | HTML | CSS | ASP | PHP | AJAX | Javascript | Diseño web | Promoción web | Ganar dinero
Directorio | Manuales | Scripts | FAQs | Programas | Artículos Copyleft | Actualidad | La Cosecha | Colabora
Registrarse | Vuestras páginas | Foros del web | Lista de correo | Boletín de novedades
Generador METAs | Compras | Busca cursos
Alojamiento | Dominios.es | Micropagos SMS | Buscadores | Patentes, marcas | Creación web | Multimedia | Videos
Desarrollo Freelance | Buscar proyectos | Buscar profesionales | Solicitar desarrollo
ARTICULO: Generar documentos de Word RTF con php

 Se muestran 22 comentarios sin revisar

Ruben  06/7/05 
Hola me gustaria saber como puedo modificar el script para que en lugar de que se almacenen los documentos en el disco duro los envie por email a un campo de la base de datos, por ejemplo cada alumno tiene en la base de datos su email y yo quiero enviar cada carta a un mail

German Infante  07/7/05 
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/05 
linea 6 del codigo (función leef())cambiar:
$tamleef - sizeof($texto);
por
$tamleef = sizeof($texto);




Juan Carlos  27/9/05 
Bueno, soy un aprendiz de php... Para mi proyecto necesito preparar reportes en mi aplicación!!! El codigo lo he utilizado... Pero no pasa NADA!!! al realizar click en obtener se abre el archivo y lo que hay en el es solo: "sectd}" si alguien me puede ayudar!!!! le agradeceria...

Juan Carlos  29/9/05 
Gracias FABI!!! era eso y otro error que tenia!!! pero ahora se ve bien y en mi word tambien, pero una vez que lo imprimo no se ven las cajas de texto... Si tenes alguna idea... del porque...

christian landeo  04/11/05 
Estoy modificando el codigo, pero no estoy pasando una sentencia sql, sino que el reemplazo ya lo hice antes. La cuestion es que no funciona, no reemplaza nada.

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

function crearRtf($plantilla,$fsalida,$matequivalencias,$contador) {
$nombrefile = $fsalida;
$fsalida = "/var/www/html/notaria/documentos/".$fsalida;
$rtf = new Rtf();
$txtplantilla = $rtf->leef($plantilla);
$matriz = explode("sextf",$txtplantilla);
$cabecera=$matriz[0]."sectd";
$inicio=strlen($cabecera);
$final=strrpos($txtplantilla,"}");
$largo = $final - $inicio;
// $cuerpo = substr($txtplantilla,$inicio,$largo);
$cuerpo = $txtplantilla;
$punt=fopen($fsalida, "w");
fputs($punt,$cabecera);
$despues = $cuerpo;
foreach ($matequivalencias as $dato) {
$datosql=$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);
$fsalida = "../documentos/".$nombrefile;
return $fsalida;
}

Jaime  07/11/05 
Cuando abre el Word me escribe solamente esto:
sectd\par \page \par\par \page \par\par \page \par}


Si alguien sabe como arreglarlo, aviseme a gatroxx@yahoo.es o gatrox@gmail.com

Agustín  30/11/05 
He transcrito el codigo en PHP y no he obtenido resultados positivo agradeceria a la persona (as) que ya obtubieron resultados satifactorios su apoyo

Agustín  30/11/05 
Cree tres ficheros php uno llamado funciones.php, otro llamado Formato.php y uno tercero para la conexion.

Aqui el Fichero Funciones.php

function leef($fichero){

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

function rtf($sql,$plantilla,$fsalida,$matequivalencias){
include ("cnn.php");
$pre = time();
$fsalida = "/Capacitacion/php/".$pre.$fsalida;
$txtplantilla = leef($plantilla);
$matriz= explode("sectd",$txtplantilla);
$cabecera = $matriz[0]."sectd";
$inicio= sterlen($cabecera);
$final= strrpos($txtplantilla,"}");
$largo=$final-$inicio;
$cuerpo=substr($txtplantilla,$inicio,$largo);
$punt=fopen($fsalida, "w");
fputs($punt,$cabecera);
$result=mysql_query($sql);
While ($row=mysql_fetch_object($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;

}
$salida = rtf($sql,$plantilla,$fsalida,$matequivalencias)

Como pueden apreciar inclui el archivo cnn.php para la conexion y seleccion de la base de datos

Aqui el fichero Formato.php

include ("Funciones.php");

$plantilla = "plantilla.rtf";
$sql= "SELECT * FROM reintegro";
$equivalencias[0][0]="#*rfc*#";
$equivalencias[0][1]="#*nombre*#";
$equivalencias[1][0]="#*cve_p*#";
$equivalencias[1][1]="#*cct*#";
echo "<a href=\"$salida\">Obtener</a>";

Y por ultimo el fichero cnn.php

function cnn()
{

$host = 'localhost';
$usr = 'root';
$cve = '*******';
$bd = 'base_reintegros';

$conexion = mysql_connect($host, $usr, $cve);

if (! $conexion){
echo "El usurio $usr no se ha podido conectar al Servidor $host";
exit();}
else{
echo " "."<BR>";
}

if (!mysql_select_db($bd,$conexion)){
echo "Error al seleccionar la base de datos: $bd";
}

return $conexion;
}

$conexion = cnn();

Bueno a todo esto el detalle esta en que no me funciona en la practica he detectado error en esta linea

$salida = rtf($sql,$plantilla,$fsalida,$matequivalencias)

Si alguien pudiera asesorarme diciendome que estoy haciendo mal mi correo guti01@gmail.com

De antemano Gracias por la atención

Churris  12/1/06 
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/06 
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/06 
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/06 
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/06 
¡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/06 
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:\Servidor\WEB\SEC\aepaf\constanciaapfrtf.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/06 
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/06 
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/06 
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/06 
tan puro gueviando,, HAY UNA FORMA MAS FACIL

zamora  07/11/06 
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/06 
Amigos me sale esto \"sectd\\par \\page \\par}\" en el word!!!!!!alguien me puede ayudar porfavor????? Gracias

galax13a  04/10/07 
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.

Ver el articulo / faq completo Ver el articulo y todos sus comentarios
Añadir un comentario al artículo Añadir un comentario del artículo
  Ir arriba

Comentarios no revisados de:

+ Generar documentos de Word RTF con php


DesarrolloWeb.com | Copyright | Anunciese | Acerca de | Datos legales | Contacta | Por GuiarteMultimedia