Foros del Web » Programando para Internet » PHP »

generando Archivos RTF con PHP

Estas en el tema de generando Archivos RTF con PHP en el foro de PHP en Foros del Web. Que tal Maestros, Estoy probando un script de este site, donde se genera un .RTF y se le asignan datos dinámicamente de una B.D. Mysql: ...
  #1 (permalink)  
Antiguo 15/06/2005, 08:06
Avatar de jpogsistem  
Fecha de Ingreso: diciembre-2001
Mensajes: 2.405
Antigüedad: 22 años, 4 meses
Puntos: 4
generando Archivos RTF con PHP

Que tal Maestros,

Estoy probando un script de este site, donde se genera un .RTF y se le asignan datos dinámicamente de una B.D. Mysql:

http://www.desarrolloweb.com/articul...6.php?manual=6

El código es éste:

Código PHP:
<?
//Funcion que lee un archivo de texto y lo mete en una cadena
function leef ($fichero) {
    
$texto file($fichero);
    
$tamleef sizeof($texto);
    for (
$n=0;$n<$tamleef;$n++) {$todo$todo.$texto[$n];}
    return 
$todo;
}


//funcion que genera un rtf
function rtf($sql$plantilla$fsalida$matequivalencias){
$pre=time();
$fsalida="/rtf/".$pre.$fsalida;
mysql_connect("localhost""root""");
//Paso no 1.-Leo una plantilla rtf
$txtplantilla leef($plantilla);
//Paso no.2 Saca cabecera, el cuerpo y el final
$matriz=explode("sectd"$txtplantilla);
$cabecera=$matriz[0]."sectd";
$inicio=strlen($cabecera);
$final=strrpos($txtplantilla,"}");
$largo=$final-$inicio;
$cuerpo=substr($txtplantilla$inicio$largo);
//Paso no.3 Escribo el fichero
$punt fopen($fsalida"w");
fputs($punt,$cabecera);
$result mysql("usuarios"$sql);
While(
$row=mysql_fetch_object($result)){
      
$despues=$cuerpo;
      foreach (
$matequivalencias as $dato) {
      
$datosql=$row->$dato[1];
      
$datosqlstripslashes ($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 nombre, municipio from usuarios";
$equivalencias[0][0]="#*nombre*#";
$equivalencias[0][1]="nombre";
$equivalencias[1][0]="#*sitio*#";
$equivalencias[1][1]="municipio";
$salida rtf($sql$plantilla"certificado.rtf"$equivalencias);
$salida ="<A href='$salida'>Obtener</a>";
echo 
"<p>$salida</p>";
?>

La cuestión es que me sale los siguientes Warnings:

Código PHP:
Warningfputs(): supplied argument is not a valid stream resource in documento.php on line 37

Warning
fputs(): supplied argument is not a valid stream resource in documento.php on line 39 
Osea en:

Código PHP:
Linea 37   fputs($punt,$despues);
Linea 38   $saltopag="\par \page \par";
Linea39    puts($punt,$saltopag); 
He cambiado Fputs por Fwrite pero sale lo mismo.

Igualemnte el archivo .RTF no se genera y en la página documento.php se linkea el supuesto rtf como http://localhost/rtf/1118844467certificado.rtf

Por qué la numeración 1118844467certificado.rtf ???


Saludos y Gracias, el resolver esto me parece interesante.
__________________
EL LIMITE ES EL UNIVERSO
  #2 (permalink)  
Antiguo 27/06/2005, 13:47
Avatar de jpogsistem  
Fecha de Ingreso: diciembre-2001
Mensajes: 2.405
Antigüedad: 22 años, 4 meses
Puntos: 4
Ya Funciona.

El error estaba en la línea 5:

No es:

Código PHP:
$tamleef sizeof($texto); 
Sino:

Código PHP:
  $tamleef sizeof($texto); 
Además solo ha funcionado utilizando rutas relativas, del tipo:

Código PHP:
$fsalida="C:/EasyPHP1-7/www/rtf/prueba/".$pre.$fsalida

Por ejemplo.

Funciona de Maravilla.

Un Saludo a Todos, seguiré dando Lata después.
__________________
EL LIMITE ES EL UNIVERSO
  #3 (permalink)  
Antiguo 27/06/2005, 13:54
Avatar de jpogsistem  
Fecha de Ingreso: diciembre-2001
Mensajes: 2.405
Antigüedad: 22 años, 4 meses
Puntos: 4
El Código Maestros

Se me olvidaba, auí dejo el código por si alguien lo quiere probar o lo necesita, igualmente he comprobado que insertando imágenes, las guarda y las conserva perfectamente dentro del formato.

Sirve mucho para generar documentos on_line.



Código PHP:
<?
//Funcion que lee un archivo de texto y lo mete en una cadena
function leef ($fichero) {
    
$texto file($fichero);
    
$tamleef sizeof($texto);
    for (
$n=0;$n<$tamleef;$n++) {$todo$todo.$texto[$n];}
    return 
$todo;
}


//funcion que genera un rtf
function rtf($sql$plantilla$fsalida$matequivalencias){
$pre=time();
$fsalida="C:/EasyPHP1-7/www/rtf/prueba/".$pre.$fsalida;
mysql_connect("localhost""root""");
//Paso no 1.-Leo una plantilla rtf
$txtplantilla leef($plantilla);
//Paso no.2 Saca cabecera, el cuerpo y el final
$matriz=explode("sectd"$txtplantilla);
$cabecera=$matriz[0]."sectd";
$inicio=strlen($cabecera);
$final=strrpos($txtplantilla,"}");
$largo=$final-$inicio;
$cuerpo=substr($txtplantilla$inicio$largo);
//Paso no.3 Escribo el fichero
$punt fopen($fsalida"w");
fputs($punt$cabecera);
mysql_select_db("nombre_bd");
$result =mysql_query($sql); 
While(
$row=mysql_fetch_object($result)){
      
$despues=$cuerpo;
      foreach (
$matequivalencias as $dato) {
      
$datosql=$row->$dato[1];
      
$datosqlstripslashes ($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 "C:/EasyPHP1-7/www/rtf/plantilla.rtf";
$sql "SELECT nombre, ciudad from usuarios";
$equivalencias[0][0]="#*nombre*#";
$equivalencias[0][1]="nombre";
$equivalencias[1][0]="#*sitio*#";
$equivalencias[1][1]="municipio";
$salida rtf($sql$plantilla"certificado.rtf"$equivalencias);
$salida ="<A href='$salida'>Obtener RTF</a>";
echo 
"<p>$salida</p>";
?>
__________________
EL LIMITE ES EL UNIVERSO
  #4 (permalink)  
Antiguo 26/09/2005, 02:31
 
Fecha de Ingreso: marzo-2004
Ubicación: Extremadura
Mensajes: 206
Antigüedad: 20 años
Puntos: 0
ya estoy desesperado... necesito exportar un documento word, y he probado el script este. Pero no hace absolutamente nada. He guardado todo este código en una página php (generaRTF.php). En otra página de mi sitio tengo un enlace a generaRTF.php, pero cuando le doy, se queda el navegador blanco y ni me genera el documento ni nada de nada... lo peor de todo es que no sé dónde puede estar el fallo... si a alguien se le ocurre algo que pueda ser... muchas gracias
  #5 (permalink)  
Antiguo 26/09/2005, 07:50
Avatar de ADIÓS_ADRIANA  
Fecha de Ingreso: septiembre-2005
Mensajes: 263
Antigüedad: 18 años, 7 meses
Puntos: 0
1. Verifica la conexión a Base de Datos
2. Verifica las rutas relativas/absolutas del codigo con respecto al script.
3. Puede quedarse el navegador en blanco si le estás enviando demasiados registros al documento a generar.
4. Si utilizas un select específico verifica que sea correcto.
5. Verifica la asignación del array versus la consulta de BD.
6. la plantilla debe ser de extensión .RTF con .doc no funciona, también verifica que estás poniendo los marcadores de datos correctamente.

Además postea el código/configuración y select que estás haciendo.

Danos m`´as información y seguro lo solucionamos.
  #6 (permalink)  
Antiguo 10/11/2005, 13:11
 
Fecha de Ingreso: noviembre-2005
Mensajes: 10
Antigüedad: 18 años, 5 meses
Puntos: 0
A mí me funciona a medias ya que si genera el .rtf pero a la hora de abrirlo me muestra puro código (como tamaño y tipo de letra, posiciones, etc.) por lo que una página se convierten en 103 y no entiendo porqué me lo despliega así.

Si alguien puede ayudarme se lo agradecería ya que tengo más de una semana resolviendo esto
  #7 (permalink)  
Antiguo 10/11/2005, 13:30
 
Fecha de Ingreso: octubre-2005
Mensajes: 365
Antigüedad: 18 años, 6 meses
Puntos: 0
Si te muestra puro código ha de ser porque se está saltando la salida RTF por algún codigo que manipulaste.

La cantidad de páginas generadas (Supongo que son 103 repetidas) depende del select que hayas diseñado, si es un Select * from usuarios, te van a salir tantas páginas como usuarios tengas en la BD. Si pones Select * from usuarios Where id=20 te sale el 20 o según el filtro que le pongas.

Postea el código.

Saludos.
  #8 (permalink)  
Antiguo 10/11/2005, 15:10
 
Fecha de Ingreso: noviembre-2005
Mensajes: 10
Antigüedad: 18 años, 5 meses
Puntos: 0
Todavía no lo soluciono

Gracias por responderme... pero todavía no encuentro el error, y sé que no están repetidos los datos puesto que ya los revisé y si tienen filtro para mostrarme solo uno, incluyo el código por si detectas algún error y me puedas ayudar...

Código:
<?php
//función que lee un archivo de texto y lo mete en una cadena

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


//funcion que genera un rtf 
function rtf($sql, $plantilla, $fsalida, $matequivalencias){ 
$pre=time(); 
$fsalida="c:/protocolos/".$pre.$fsalida; 
$protocolos=mysql_connect("hostname","usuario","password");
//Paso no 1.-Leo una plantilla rtf 
$txtplantilla = leef($plantilla); 
//Paso no.2 Saca cabecera, el cuerpo y el final 
$matriz=explode("sectd", $txtplantilla); 
$cabecera=$matriz[0]."sectd"; 
$inicio=strlen($cabecera); 
$final=strrpos($txtplantilla,"}"); 
$largo=$final-$inicio; 
$cuerpo=substr($txtplantilla, $inicio, $largo); 
//Paso no.3 Escribo el fichero 
$punt = fopen($fsalida, "w"); 
fputs($punt, $cabecera); 
mysql_select_db("protocolos"); 
$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; 
}

//Llamar la función RTF

$plantilla = "c:/inetpub/wwwroot/RESPALDO/SGC/plantilla.rtf"; 
$sql="SELECT nombre,tipo,clave FROM protocolo_gen WHERE ID_protocolo='352'";
$equivalencias[0][0]="#*TIPOPROYECTO*#";
$equivalencias[0][1]="tipo";
$equivalencias[1][0]="#*CLAVEPROYECTO*#";
$equivalencias[1][1]="clave";
$equivalencias[2][0]="#*NOMBREPROYECTO*#";
$equivalencias[2][1]="nombre";
$salida = rtf($sql,$plantilla,"certificado.rtf",$equivalencias); 
$salida ="<A href='$salida'>Obtener RTF</a>"; 
echo "<p>$salida</p>";
?>
  #9 (permalink)  
Antiguo 10/11/2005, 17:29
 
Fecha de Ingreso: octubre-2005
Mensajes: 365
Antigüedad: 18 años, 6 meses
Puntos: 0
Cosas que veo:

1. No se por qué pones $todo=0 en la línea 5

2. Asumo que la carpeta c:/protocolos existe en tu PC

3. $protocolos=mysql_connect("hostname","usuario","pa ssword");
No sé que intentas hacer...............además los valores han de ser ("hostname","usuario","password") como ("localhost","root","password")
si no la onfiguración exacta de cuenta en el servidor.


No veo nada más, revísalo y nos cuentas. Igualmente puedes leer el artículo origianl del autor para que veas como lo explica.

Cualquier cosa nos cuentas,

Saludos.
  #10 (permalink)  
Antiguo 11/11/2005, 10:26
 
Fecha de Ingreso: noviembre-2005
Mensajes: 10
Antigüedad: 18 años, 5 meses
Puntos: 0
Gracias por tus observaciones...
mi gran problema esque no se como manejar a veces la versión de este php, por lo que a veces tengo que sustituir algunas funciones por otras...
Lo bueno es que ya encontré el error... lo que pasa es que cuando coloco la variable $todo me marca un error de que no está definida por lo que la intenté definir así $todo=0 y ya no me marcaba error pero no generaba bien mi rtf ya que la variable se definía como numérico por lo que resolví el problema así: $todo="" y ahora sí genera el documento perfectamente.

Cómo ves??? siempre resultan ser cosas tan sencillas pero difíciles de encontrar...

Mil gracias por tu ayuda...
  #11 (permalink)  
Antiguo 11/11/2005, 10:39
 
Fecha de Ingreso: octubre-2005
Mensajes: 365
Antigüedad: 18 años, 6 meses
Puntos: 0
Sip tienes razón, Que bueno que te haya servido.

Saludos.
  #12 (permalink)  
Antiguo 01/04/2006, 18:45
 
Fecha de Ingreso: marzo-2004
Mensajes: 186
Antigüedad: 20 años, 1 mes
Puntos: 0
Es posible usar esto, pero en ves de con datos de una BD, remplazarlo y usar los datos de un formulario
__________________
Software a Medida
voip Locutorios
  #13 (permalink)  
Antiguo 03/04/2006, 16:19
Avatar de jpogsistem  
Fecha de Ingreso: diciembre-2001
Mensajes: 2.405
Antigüedad: 22 años, 4 meses
Puntos: 4
Pues la verdad no lo sé...como verás los valores que toma el documento de word son los que se asignan a un arreglo fruto de una consulta sql.

o creo que si se puede hacer pero no sé nada de arreglos...quizás algun master que pase por aquí lo sepa, el còdigo en cuestión es :


Código PHP:
$sql="SELECT nombre,tipo,clave FROM protocolo_gen WHERE ID_protocolo='352'";
$equivalencias[0][0]="#*TIPOPROYECTO*#";
$equivalencias[0][1]="tipo";
$equivalencias[1][0]="#*CLAVEPROYECTO*#";
$equivalencias[1][1]="clave";
$equivalencias[2][0]="#*NOMBREPROYECTO*#";
$equivalencias[2][1]="nombre"

Saludos.
__________________
EL LIMITE ES EL UNIVERSO
  #14 (permalink)  
Antiguo 04/04/2006, 12:24
 
Fecha de Ingreso: marzo-2004
Mensajes: 186
Antigüedad: 20 años, 1 mes
Puntos: 0
nadie
__________________
Software a Medida
voip Locutorios
  #15 (permalink)  
Antiguo 09/11/2007, 17:28
 
Fecha de Ingreso: noviembre-2007
Mensajes: 5
Antigüedad: 16 años, 5 meses
Puntos: 0
Re: generando Archivos RTF con PHP

Hola, el código me funciona a medias, me da un error que es el siguiente:

Genera el documento rtf, pero lo que hace es copiar la planilla exacta como está, entonces cuando abro el certificado.rtf, lo que aparece son los valores #*nombre*#, etc.... como hago para que estos valores se puedan cambiar y me genere el documento.

Agradecería si alguien me ayudara.
  #16 (permalink)  
Antiguo 10/11/2007, 16:55
 
Fecha de Ingreso: noviembre-2007
Mensajes: 5
Antigüedad: 16 años, 5 meses
Puntos: 0
Re: generando Archivos RTF con PHP

Alguien que me ayude porfa ?
  #17 (permalink)  
Antiguo 22/12/2007, 09:55
 
Fecha de Ingreso: octubre-2004
Mensajes: 2
Antigüedad: 19 años, 6 meses
Puntos: 0
generando Archivos RTF con PHP

TENGO TAMBIEN UN PROBLEMA CON ESTE PROGRAMA, EL MIO YA ME GENERA EL ARCHIVO PERO NO REALIZA CAMBIOS SOBRE ESTE. GENERA UNO IDENTICO QUE LA PLANTILLA.

AQUI LES DEJO TANTO LA PLANTILLA COMO EL CODIGO PHP A VER QUE PUEDE SER.

CODIGO PHP

<?
//Funcion que lee un archivo de texto y lo mete en una cadena
function leef ($fichero) {
$texto = file($fichero);
$tamleef = sizeof($texto);
for ($n=0;$n<$tamleef;$n++) {$todo= $todo.$texto[$n];}
return $todo;
}


//funcion que genera un rtf
function rtf($sql, $plantilla, $fsalida, $matequivalencias){
$pre=time();
$fsalida="C:/AppServ/www/helpsoporte/onsites/".$pre.$fsalida;
mysql_connect("localhost", "root", "admin");
//Paso no 1.-Leo una plantilla rtf
$txtplantilla = leef($plantilla);
//Paso no.2 Saca cabecera, el cuerpo y el final
$matriz=explode("sectd", $txtplantilla);
$cabecera=$matriz[0]."sectd";
$inicio=strlen($cabecera);
$final=strrpos($txtplantilla,"}");
$largo=$final-$inicio;
$cuerpo=substr($txtplantilla, $inicio, $largo);
//Paso no.3 Escribo el fichero
$punt = fopen($fsalida, "w");
fputs($punt, $cabecera);
mysql_select_db("helpdesk");
$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];
echo"DATO DE LA BD".$datosql;
echo"DATO A REEMPLAZAR".$datortf;
$despues=str_replace($datortf,$datosql,$despues);
}
fputs($punt,$despues);
$saltopag="\par \page \par";
fputs($punt,$saltopag);
}
fputs($punt,"}");
fclose ($punt);
return $fsalida;
}

$plantilla="C:/AppServ/www/helpsoporte/plantilla.rtf";
$sql="select cedula from usercaso where nocaso='3'";

$equivalencias[0][0]="#*cedula*#";
$equivalencias[0][1]="cedula";
$salida = rtf($sql, $plantilla, "certificado.rtf", $equivalencias);
$salida ="<A href='$salida'>Obtener RTF</a>";
echo "<p>$salida</p>";
?>

PLANTILLA RTF

PRUEBA DE ARCHIVO #*cedula*#


Y NO ME FUNCIONA LOS DATOS LLEGAN BIEN HASTA EL MOMENTO DE REALIZAR EL CAMBIO PERO NO LOS REALIZA.

DE ANTEMANO MUCHAS GRACIAS.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Tema Cerrado




La zona horaria es GMT -6. Ahora son las 20:20.