¿Cómo convierto RTF a PDF desde mi página web PHP usando OpenOffice?
windows iis (2)
Mi sistema operativo es Windows XP y estoy usando IIS 5.1 y PHP 5.2.9. Intento llamar a un script PHP desde mi página PHP para convertir un documento RTF a PDF, usando OpenOffice. La secuencia de comandos funciona bien cuando la llamo directamente desde la línea de comandos, pero no estoy logrando que funcione el mismo script desde mi página web PHP.
Cuando llamo al script desde mi página PHP, la página se cuelga, mostrando eventualmente un error, y he notado que puedo ver en el Administrador de tareas donde los procesos soffice.bin y soffice.exe se están ejecutando bajo mi nombre de usuario de IIS.
Este es el error:
Fatal error: Uncaught exception ''com_exception'' with message ''Failed to create COM object `com.sun.star.ServiceManager'': Server execution failed '' in C:/WEB_ROOT/SoftwareContract/WordToPdf.php:14 Stack trace: #0 C:/WEB_ROOT/SoftwareContract/WordToPdf.php(14): com->com(''com.sun.star.Se...'') #1 C:/WEB_ROOT/SoftwareContract/Index.php(11): word2pdf(''file:///C:/web_...'', ''file:///C:/web_...'') #2 {main} thrown in C:/WEB_ROOT/SoftwareContract/WordToPdf.php on line 14
He verificado los permisos de mi usuario de IIS en estas áreas:
C:/PHP
C:/Program Files/OpenOffice.org 3
C:/Program Files/Java
C:/WEB_ROOT ---- location for my php code
En cada caso, mi usuario de IIS tiene estos permisos: Leer y ejecutar, Mostrar contenido de carpeta, Leer. Y en cada caso no se verifica "denys" para compensar los permisos. También le di permisos de escritura al usuario de IIS para la carpeta raíz_Web donde reside el código php.
Este es el php que llama a la función de conversión, WordToPdf:
<?php
require_once(''WordToPdf.php'');
$output_dir = ''C:/web_root/softwarecontract/'';
$doc_file = ''C:/web_root/softwarecontract/testdoc.rtf'';
$pdf_file = ''output.pdf'';
$output_file = $output_dir . $pdf_file;
$doc_file = "file:///" . $doc_file;
$output_file = "file:///" . $output_file;
word2pdf($doc_file,$output_file);
?>
Y esto es WordToPdf.php:
<?php
set_time_limit(0);
function MakePropertyValue($name,$value,$osm)
{
$oStruct = $osm->Bridge_GetStruct("com.sun.star.beans.PropertyValue");
$oStruct->Name = $name;
$oStruct->Value = $value;
return $oStruct;
}
function word2pdf($doc_url, $output_url)
{
//Invoke the OpenOffice.org service manager
$osm = new COM("com.sun.star.ServiceManager") or die ("Please be sure that OpenOffice.org is installed./n");
//Set the application to remain hidden to avoid flashing the document onscreen
$args = array(MakePropertyValue("Hidden",true,$osm));
//Launch the desktop
$oDesktop = $osm->createInstance("com.sun.star.frame.Desktop");
//Load the .doc file, and pass in the "Hidden" property from above
$oWriterDoc = $oDesktop->loadComponentFromURL($doc_url,"_blank", 0, $args);
//Set up the arguments for the PDF output
$export_args = array(MakePropertyValue("FilterName","writer_pdf_Export",$osm));
//Write out the PDF
$oWriterDoc->storeToURL($output_url,$export_args);
$oWriterDoc->close(true);
}
?>
¿Hay algún problema con mis permisos o áreas adicionales en las que necesito verificar los permisos para el usuario de IIS? ¿Alguien tiene una idea de por qué IIS no pudo crear el objeto COM, si no es un problema de permisos?
¡¡Gracias!!
¡¡¡¡Hurra!!!! ¡Con la ayuda de una mente cerebral súper inteligente aquí en el trabajo, ahora tengo una solución que realmente FUNCIONA! Olvide todo el código que publiqué antes, ya no usaré nada de eso. Si alguien más necesita convertir documentos de Word a PDF desde PHP en IIS, esto es lo que funcionará:
1) Instalar OpenOffice, por supuesto
2) Ve aquí:
http://www.artofsolving.com/opensource/pyodconverter , y descarga DocumentConverter.py
3) Coloque DocumentConverter.py en la misma carpeta de OpenOffice donde reside soffice.exe, probablemente C: / Program Files / OpenOffice.org 3 / program
4) Inicie OpenOffice como un servicio:
a) Puedes hacer esto desde la línea de comando:
soffice "-accept=socket,host=localhost,port=8100;urp;StarOffice.ServiceManager" -headless -norestore -nologo -nofirststartwizard
b) O siga las instrucciones en este sitio web y configure OpenOffice como un servicio de Windows con los parámetros adecuados: http://www.artofsolving.com/node/10
5) Desde PHP ejecuta este comando:
exec(''python "C:/Program Files/OpenOffice.org 3/program/DocumentConverter.py" path_to_doc/test.doc path_to_output_pdf/test.pdf"'');
¡Ah, qué solución tan bonita y bonita!
Parece que la oficina abierta necesita interactuar con el escritorio y no está permitida desde que fue invocada por un servicio sin el indicador SERVICE_INTERACTIVE_PROCESS .