Foros del Web » Programando para Internet » PHP »

Necesito un consejo para crear documento Word dinámico

Estas en el tema de Necesito un consejo para crear documento Word dinámico en el foro de PHP en Foros del Web. Hola, Estoy creando un documento en Word dinámicamente desde PHP, con la siguiente rutina: Código PHP: <? $shtml  =  "aquí recoj datos desde una base de datos MySQL" $scarpeta = "miCarpeta" ; $sfile ...
  #1 (permalink)  
Antiguo 24/11/2004, 01:57
Avatar de TurKa  
Fecha de Ingreso: enero-2003
Ubicación: Gerli, Avellaneda
Mensajes: 543
Antigüedad: 14 años, 10 meses
Puntos: 4
Necesito un consejo para crear documento Word dinámico

Hola,

Estoy creando un documento en Word dinámicamente desde PHP, con la siguiente rutina:

Código PHP:
<?
$shtml 
"aquí recoj datos desde una base de datos MySQL"
$scarpeta="miCarpeta";
$sfile=$scarpeta."/libros.doc";
$fp=fopen($sfile,"w"); 
fwrite($fp,$shtml); 
fclose($fp);
header("location: $sfile");
?>
El tema es que en el documento creado, también van imágenes, las cuales incluyen la URL completa.
Ejemplo:

http://www.midominio.com/img/libro001254.gif

¿Dónde está el problema? El problema no es uno, sino dos!!!

Primer problema: En algunos exploradores, no pregunta si se desea descargar el documento y lo abre directamente en el explorador.
Esto quisiera evitarlo, pero es lo que menos me preocupa (aunque si pudiera resolverlo me vendría muy bien).

Segundo problema: Probé descargar el documento con:
Windows Me + Office XP --> las imágenes se ven correctamente
Windows 98 + Office XP --> las imágenes se ven bien
Windows XP + Office 2000 --> las imágenes no se ven
Windows XP + Office XP --> las imágenes no se ven

No tengo idea a que puede deberse el problema y mucho menos como resolverlo.

Lo único que se, es que necesito generar un catálogo con mis libros para que los usuarios puedan descargarlos a su ordenador

¿Qué me aconsejan?

Por las dudas, les comento que mi servidor correo bajo Linux (y no bajo Windows --> aclaración redundante ).

Bueno, muchísimas gracias!
Saludos,
__________________
Programación LAMP con Scrum y XP
www.eugeniabahit.com.com.ar
  #2 (permalink)  
Antiguo 24/11/2004, 06:26
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Sobre tus problemas:

1) .. Tan sólo haces un "location" para indicar a tu navegador que "redireccione" a tu documento.doc .. eso es lo mismo que hacer un:

http://www.tal.ta/documento.doc directamente ..

No deberías (o no es necesario) crear el archivo físicamente en tu servidor para luego tomar su ruta y "redireccionar" al navegador para que simule un "link" manual ... Lo que deberías hacer es generar las cabeceras HTTP adecuadas para indicar al navegador que los datos que vas a enviarles (y que has generádo dinámicamente) son para que los descargue.

Eso lo define el protocolo HTTP y sus cabeceras adecuadas. Desde PHP puedes "lanzar" cabeceras HTTP con la función header().

En tu caso se trataría de
Código PHP:
<?
// proceso para generar tus datos ...

// componer tus cabeceras HTTP para indicar que esos datos son para descargar.
header("cabecearas HTTP adecuadas");
// enviar tu dato generado al buffer de salida ..
echo $tu_doc_generado;
?>
más info:
www.php.net/header

2) .. Realmente no estás generando un documento .doc (de MS Word) "legítimo" pues no le das ningún formato en especial .. (por lo menos en el ejemplo que distes).

Podrías generar tu resultado en "HTML" .. respetando los tag's de HTML como corresponde para darle la estructura y disposición de elementos en tu página (sin más control sobre la página .. ni orientación .. ni margenes .. ni tamaños de página .. N.a.d.a.). Ese "HTML" depende de la versión de "Word" lo interpreta mejor o peor .. Word 2000 en adelante parece hacerlo mejor que Word 97 por ejemplo .. pero eso ya no depende de PHP ni del HTML que generas sino de Word en sí.

Consejos:
1) ¿ Por qué no generas un documento PDF ? .. es lo más standar que hay y donde realmente desde PHP puedes generar un documento para "imprimir" correctamente con toda la definición de la página .. tipografía .. etc que necesites. (Funciona en windows y linux .. no es necesario instalar ninguna extensión adicional en el servidor, puedes usar "classes" como por ejemplo R&OS, FPDF .. para generarlo).

2) .. Si usas PHP bajo windows .. podrías usar COM (www.php.net/com) para generar un documento realmente "Word" con todas las opciones de este

Un saludo,
  #3 (permalink)  
Antiguo 24/11/2004, 21:27
Avatar de TurKa  
Fecha de Ingreso: enero-2003
Ubicación: Gerli, Avellaneda
Mensajes: 543
Antigüedad: 14 años, 10 meses
Puntos: 4
Pregunta

Hola Cluster!
Nate todo mil gracias por tu respuesta. Intenté responder antes pero el servidor no me lo permitió

Te cuento:

En realidad sí hago una redirección al documento, pero este documento lo estoy escribiendo previamente en el servidor fwrite($fp,$shtml);
(la variable $shtml es la que contiene todos los formatos).

Lo que es cierto, que no es un Word legítimo sino bastante trucho. Es decir si en vez de poner $sfile=$scarpeta."/libros.doc"; escribiese $sfile=$scarpeta."/libros.html"; estaría creando un HTML.

El PDF lo intenté utilizando una clase (fpdf) pero el problema es que no puedo resolver el tema de dar un buen formato al documento por el tipo de datos que tengo que insertar.

Entonces, me gustó la idea que me comentaste de utilizar los encabezamientos adecuados. Por eso, estuve leyendo el documento que me recomendaste (mil gracias!! ) y vi esto:

Código PHP:
<?php
// Enviaremos un PDF
header('Content-type: application/pdf');

// Se va a llamar descarga.pdf
header('Content-Disposition: attachment; filename="descarga.pdf"');

// La fuente del PDF se encuentra en original.pdf
readfile('original.pdf');
?>
El tema es que todos los documentos derivados, etán en inglés y me cuesta horrores entenderlos.
Me pregunto:
Si sigo creando el Word como hasta ahora y en el tipo de aplicación por lógica indico que será un Word, el ejemplo anterior ¿Me servirá para forzar la descarga?

Estuve buscando algo similar en http://recursosphp.iefactory.com/ind...utoriales&n=82 pero no estoy segura si funcionará o si definitivamente se me mezcló todo.

De nuevo, mil gracias!
__________________
Programación LAMP con Scrum y XP
www.eugeniabahit.com.com.ar
  #4 (permalink)  
Antiguo 25/11/2004, 10:04
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Si, en principio si que debería forzar la descarga de tu documento . .así evitas tener que crear un archivo para luego "linkearlo".

El ejemplo del tutorial que mencionas lee un archivo del "disco" (del servidor) .. en tu caso NO tienes necesidad de crear ese archivo en el "disco". Lo puedes crear "al vuelo" y entregarlo para descarga como te indiqué.

La cabecera que indica que el "dato" que vas a enviar es de tal tipo es: 'Content-type' . ahí tendrás que ver el MIME (formato) que corresponde a un .doc (que no recuerdo cual es ahora ..)

La cabcera HTTP que indica que el archivo es para "descargar" es 'Content-Disposition: attachment' ..

Y por último .. no hacer "readfile()" para leer tu archivo que generas . pues se trata de evitar hacer eso (que no es necesario) y hacer tu "echo $shtml"

Un saludo,
  #5 (permalink)  
Antiguo 25/11/2004, 15:32
Avatar de TurKa  
Fecha de Ingreso: enero-2003
Ubicación: Gerli, Avellaneda
Mensajes: 543
Antigüedad: 14 años, 10 meses
Puntos: 4
De acuerdo

Cluster! De nuevo mil gracias por tu buena predisposición

Creo que ya estoy entendiendo . Si por ejemplo utilizo un código como este:

Código PHP:
<?
header
('Content-type: application/msword'); 
header('Content-Disposition: attachment; filename="biblioteca.doc"'); 
$shtml "bla bla bla aquí va todo el formato y contenido";
echo 
$shmtl;
?>
¿Esto solucionará todo? Es decir, ¿Ese es el codigo que debería usar?

(había puesto $shtml antes de los encabezados, )
__________________
Programación LAMP con Scrum y XP
www.eugeniabahit.com.com.ar

Última edición por TurKa; 25/11/2004 a las 15:36
  #6 (permalink)  
Antiguo 26/11/2004, 06:15
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Pruebalo .. pero en principio debería funcionar.

Ahora, algunos navegadores (y versiones de estos) no reconocen por igual las cabeceras HTTP como las que indican que el archivo es para "descargarlo". Te lo comento por si en lugar de ofrecerte el archivo para descargar .. te lo muestra en el navegador.

Un saludo,
  #7 (permalink)  
Antiguo 29/11/2004, 01:39
Avatar de TurKa  
Fecha de Ingreso: enero-2003
Ubicación: Gerli, Avellaneda
Mensajes: 543
Antigüedad: 14 años, 10 meses
Puntos: 4
De acuerdo

Cluster!!!
FUNCIONÓ!!!!


Cómo tu dices, debo esperar a probarlo con todas las versiones de todos los navegadores.
Por ahora, en el que antes generaba error, ya no lo genera.

Ahora solo resta solucionar un pequeño problema que me queda con las imágenes.

Coloco la referencia a cada imagen utilizando la URL exacta de cada una.
Por ejemplo: http://www.biaono.com.ar/img/libro_017.jpg

El tema es que cuando abro el archivo con el Word, se queda esperando largas horas (exagero pero para el caso da igual) a que cargue todas las imágenes.

Me pregunto ¿Existe alguna forma de indicar que esas imágenes deben estar embebidas en el Word? (me suena a burrada pero pregunto igual)
o, en todo caso ¿Habrá alguna forma de evitar que las imágenes deban descargarse desde la Web?
__________________
Programación LAMP con Scrum y XP
www.eugeniabahit.com.com.ar

Última edición por TurKa; 29/11/2004 a las 01:41
  #8 (permalink)  
Antiguo 29/11/2004, 09:01
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Tal como "montas" tu página HTML no es posible indicar que las imagenes sean "embedidas" (incrustradas).

Tendrías que generar un autentico formato .doc (de word) para usar el método que se requiera con la codificación de la imagen necearia para tal fin ..

Un saludo,
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.
Respuesta




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