Foros del Web » Programando para Internet » PHP »

COM y PHP

Estas en el tema de COM y PHP en el foro de PHP en Foros del Web. Antes que nada un saludo. Sucede que necesito generar un docuemnto de Word partiendo de una plantilla, y de ahi solo debo rellenar algunos campos. ...
  #1 (permalink)  
Antiguo 24/01/2005, 21:46
 
Fecha de Ingreso: octubre-2003
Ubicación: Veracruz, México
Mensajes: 169
Antigüedad: 14 años, 1 mes
Puntos: 0
COM y PHP

Antes que nada un saludo.
Sucede que necesito generar un docuemnto de Word partiendo de una plantilla, y de ahi solo debo rellenar algunos campos.
Estoy usando objetos COM para tal efecto ya que mi aplicacion trabaja sobre plataforma Windows XP, usando un código que obtuve de PHPBuilder.com:
http://www.phpbuilder.com/columns/yunus20031124.php3

Este es mi código:

$word = new COM("word.application") or die("Unable to instanciate Word");
$template_file = "C:\word_template.doc";
$word->Documents->Open($template_file);
$bookmarkname = "\"ciudadano\"";
if ($word->ActiveDocument->Bookmarks->Exists($bookmarkname)){
$word->ActiveDocument->Bookmarks->Item[$bookmarkname]->Range->Text="Arturo Lara";
}
$new_file = "C:/php_word.doc";
$word->ActiveDocument->SaveAs($new_file);
$word->Quit();
$word->Release();
$word = null;
header('Content-Type: application/msword');

mi código es similar pero no me funciona y tengo motivos para pensar que ha de ser porke no tengo configurado bien algo de PHP o de Apache, ya que probe ese código en Delphi y en Visual Basic y exceptuando las diferencias propias de cada lenguaje, si obtengo el resultado ke deseo.

Este es mi código en Delphi:

procedure TForm1.Button1Click(Sender: TObject);
var
Word,bookmark,range :Variant;
begin
template:='C:\word_template.doc';
Word:=CreateOleObject('Word.Application');
screen.Cursor:=crHourGlass;
try
Word.Documents.Open(template);
Word.visible:=true;
if ( (Word.ActiveDocument.Bookmarks.Exists('ciudadano') = true))then
begin
Word.ActiveDocument.Bookmarks.Item('ciudadano').Ra nge.Text:='Arturo Lara';
end
else
begin
Word.Selection.Typetext('Hola');
end;
Word.ActiveDocument.SaveAs('C:\delphito_word_job.d oc');
Word.ActiveDocument.Printpreview;
Word.Quit;
finally
Word.Quit;
end;
screen.Cursor:=crdefault;
end;

Ahora bien antes de que mencionen ke tal vez el probelam del script de PHP es ke le doy una ruta bya intenté probar poniendo la plantilla en el mismo lugar donde esta el script y PHp me marca ke no lo puede abrir, y si le pongo una ruta si lo abre pero de ahi no pasa el script se queda cargando y no termina, como si se estuviera ciclando o algo asi.

Ahora bien por el momento Delphi me saca de este apuro pero me gustaría mejor hacerlo desde PHP ya que tengo un futuro proyecto de una palicación para una Intranet que requerira que reportee en formatos propietarios de Microsoft (ya ven que hay gente que no quiere usar PDF que son más prácticos que los DOC).

Ahora bien si encontraron el error les agradecería también me orientasen sobre como podria guardarlo en la BD (de MySQL) directamente en formato binario, no se si sea del mismo proceso que para una imagen.

De antemano gracias por la ayuda y por el tiempo que invirteiron en leer todo el rollo... muchas gracias..
  #2 (permalink)  
Antiguo 25/01/2005, 05:50
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
No sé como funciona la API de Word .. pero ahí usas un método que genera un archivo:
SaveAs($new_file);

Luego con quit() cierras Word . .OK, pero luego envias una cabecera HTTP que indicaría que vas a enviar datos en formato "MS Word" .. pero no sé vé en envio del dato en sí .. ya sea por algún método propietario de la Api de Word u otro método ..

Tampoco conozco "Delphi" .. pero fijate que despues de tu SaveAs() tienes este método:
Word.ActiveDocument.Printpreview .. Pero esto en PHP trabajando como "cliente-servidor" no podrías hacerlo .. el "previo" se vería en el "servidor" no en el cliente que es lo que te interesa ..

Fijate bien y usa completo el ejemplo del tutorial que mencionas en tu link .. ahí lo que hace es componer las cabeceras HTTP (header) adecuadas y luego lee el archivo que has grabado con "SaveAs" de la ruta que quedó para entregarlo al buffer de salida de PHP (vía la función readfile()).

Cita:
Ahora bien si encontraron el error les agradecería también me orientasen sobre como podria guardarlo en la BD (de MySQL) directamente en formato binario, no se si sea del mismo proceso que para una imagen.
Es el mismo proceso que para almacenar una imagen en binario ..

En tu caso ya generas archivos con cierto nombre .. así que podrías tomar ese nombre simplemente y gestionarlo en tus BD (como un campo más VARCHAR común).. El archivo queda ya en el servidor generado (hasta que lo borres si no lo vas a usar más con funciones como unlink())

Un saludo,
  #3 (permalink)  
Antiguo 25/01/2005, 14:55
 
Fecha de Ingreso: octubre-2003
Ubicación: Veracruz, México
Mensajes: 169
Antigüedad: 14 años, 1 mes
Puntos: 0
Gracias por la respuesta Cluster, voy a revisar mi código nuevamente para ver si puede foncionar en caso contario creo que en algun post del foro chequie que otra opción era hacer RTF's y poner marcas para despues al leer el archivo poder reemplazar, no sé si esta opción pueda convenirme ..

En cuanto a lo ke me comentaste de PrintPreview no te preocupes, no pensaba usarlo en PHP sino que como mencione en la descripción del problema cuando cambie mi código para Delphi o Visual Basic, relicé ciertos cambios pertinentes propios de dichos lenguajes, en ese caso la previsualización...

Nuevamente gracias y si ya ahi no me sale les volveré a dar lata XD
  #4 (permalink)  
Antiguo 25/01/2005, 16:33
 
Fecha de Ingreso: octubre-2003
Ubicación: Veracruz, México
Mensajes: 169
Antigüedad: 14 años, 1 mes
Puntos: 0
Cluster te vuelvo a dar lata con el mismo asunto tengo el siguiente código que es exactamente igual al de PHPBuiilder:
$word = new COM("word.application") or die("Unable to instanciate Word");
$template_file = "C:\word_template.doc";
$word->Documents->Open($template_file);
$bookmarkname = "'ciudadano'";
if ($word->ActiveDocument->Bookmarks->Exists($bookmarkname)){
$objBookmark=$word->ActiveDocument->Bookmarks($bookmarkname);
$objRange=$objBookmark->Range;
$objRange->Text="Arturo Lara";
}
$new_file = "C:\php_word.doc";
$word->ActiveDocument->SaveAs($new_file);
$word->Quit();
$word->Release();
$word = null;
header('Content-Type: application/msword');
header ('Content-Disposition: attachment; filename="php_word.doc"');
readfile($new_file);

Probe hasta descomentarear el resultado pues la verdad lo que me interesa es que se genere y que el usuario através de un link pueda descaragarlo o visualizarlo, pero esto no camina :-'( he notado en los procesos que WINWORD.EXE está corriendo y que cada vez ke actualizo el script se genera una nueva instancia pero como que nunca termina .. :-'( No se que podría hacer, que me recomiendas Cluster ?
  #5 (permalink)  
Antiguo 26/01/2005, 05:22
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
En principio el uso de COM es así .. es decir .. tu script "levanta" una instancia de la aplicación que usas y debería cerrarla al terminar .. (ahora, el método o función a emplear no lo conozco).

Un saludo,
  #6 (permalink)  
Antiguo 26/01/2005, 09:50
 
Fecha de Ingreso: octubre-2003
Ubicación: Veracruz, México
Mensajes: 169
Antigüedad: 14 años, 1 mes
Puntos: 0
Cluster, una vez más, gracias !
Ahora bien te comento que probe el script usando CLI y el script ha funcionado no sé por que desde Web ese script no me funciona, porke bajo CLI funciona perfectamente.
Ahora bien la pregunta que te tengo es que si esposible usando la función exec() pasarle la línea que ejecuta ese scriopt bajo CLI.

Muchas gracias por todo :D
  #7 (permalink)  
Antiguo 26/01/2005, 10:50
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
En teoría si (un poco lioso) pero si, .. debería funcionar .. pruebalo y nos comentas.

Otra cosa que podrías probar a nivel de cabeceras HTTP es usar "inline" en lugar de "attach" en el "content-disposition" .. para "forzar" a tu navegador a que abra el "Excel" instalado en ese PC (que debe estar instalado ..)

header ('Content-Disposition: inline; filename="php_word.doc"');


Un saludo,
  #8 (permalink)  
Antiguo 26/01/2005, 15:42
 
Fecha de Ingreso: octubre-2003
Ubicación: Veracruz, México
Mensajes: 169
Antigüedad: 14 años, 1 mes
Puntos: 0
Mira no me funciono, ya revisé en PHP.net sobre COM y ya incluso active los valores propios de COM en la seccion de COM en el php.ini, también revisé lo de correr dcomconfg.exe y darle permisos a la aplicación de word para que la pudiera correr el usuario que corre Apache (esto último no me quedo muy claro), cheque tambien lo del exec, y aun asi nada. En mi página PHP puse lo siguiente:

<?php
exec("cmd /C C:\php\cli\php -f reporteDOC.php");
echo "LISTO !";
?>

y de ahi ya todo el HTML, porke te juro que ya con ke lo genere me doy por bien servido ya luego con un link en otra página ke lo descargue, pero resulta que no funciona, sigue como hasta ahora, demorandose y nunca acaba de cargarse, así que yo creo ke ha de ser algo que no he aun configurado en el php.ini o en apache o algo asi porque ya se me han acabado las ideas ahora si que si alguien desarrolla en Windows a ver si tiene la respuesta...
Gracias Cluster y a cualquiera que colabore en el tema...
  #9 (permalink)  
Antiguo 27/01/2005, 05:30
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
No viene al caso pero podría ser este el caso .. usando un driver ODBC en modo "demo" que tenía una ventana de confirmación con un botón para poder seguir usandolo .. dicho "driver" (para el caso . .programa que ejecuta o llama PHP de cierta forma) .. la página PHP (el cliente y proceso) se quedaba eternamente esperando dicha confirmación .. así que la página cara al "navegador" quedaba en "blanco" ..)

Con esto lo que pretendo es hacerte el comentario que si hay algún error de la ejecución de ese comando/programa que lance una ventana de confirmación .. tal vez se quede "colgado" tu aplicación PHP esperando esa "confirmación" (pulsar tal botón) que nunca va a suceder vía PHP al menos.

Un saludo,
  #10 (permalink)  
Antiguo 27/01/2005, 12:32
 
Fecha de Ingreso: octubre-2003
Ubicación: Veracruz, México
Mensajes: 169
Antigüedad: 14 años, 1 mes
Puntos: 0
Pues no Cluster, ya lo he prbado en modo consola y si funciona una vez que lo eche andar con el php -f sin que el usuario intervenga mas..
Sólo me queda la opción de dejar ese procedimioento corriendo en modo background en el programador de tareas que se ejcute cada X minutos preguntando a quienes no se les ha creado su respectivo DOC.. porque de mientras no se me ocurre otra idea. No se que tanto le pueda pegar al rendimiento del server tener ese programa corriendo al menos cada 15 minutos,, tu que opinas ?
De todas maneras volvere a intentarlo porque no quiero pensar que COM me habia vencido.. jejeje estoy seguro de que algo no he configurado aun... o algo estoy pasando por alto..
Gracias ! XD
  #11 (permalink)  
Antiguo 08/02/2005, 15:27
 
Fecha de Ingreso: febrero-2005
Mensajes: 1
Antigüedad: 12 años, 10 meses
Puntos: 0
Php

hola intente copiando el codigo que viene, pero me marca un error de windows que dice que la memoria XXXXXX no se puede read, alguna idea??
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 21:09.