Come posso convertire RTF in PDF dalla mia pagina Web PHP usando OpenOffice?

Il mio sistema operativo è Windows XP e sto usando IIS 5.1 e PHP 5.2.9. Sto provando a call uno script PHP dalla mia pagina PHP per convertire un documento RTF in un PDF, usando OpenOffice. Lo script funziona bene quando lo chiamo direttamente dalla row di command, ma non sto avendo alcun successo nel far funzionare lo stesso script quando lanciato dalla mia pagina web PHP.

Quando chiamo lo script dalla mia pagina PHP, la pagina si blocca, mostrando un errore, e ho notato che posso vedere nel Task Manager where i processi soffice.bin e soffice.exe sono in esecuzione sotto il mio nome utente IIS.

Questo è l'errore:

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 

Ho ricontrollato le autorizzazioni per il mio utente IIS in queste aree:

 C:\PHP C:\Program Files\OpenOffice.org 3 C:\Program Files\Java C:\WEB_ROOT ---- location for my php code 

In each caso, il mio utente IIS ha queste autorizzazioni: lettura ed esecuzione, elenco contenuto cartella, lettura. E in each caso non ci sono "denys" controllati per compensare le autorizzazioni. Ho anche fornito le autorizzazioni di scrittura dell'utente IIS per la cartella Web_Root in cui risiede il codice php.

Questo è il php che chiama la function di conversione, 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); ?> 

E questo è 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 = arrays(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 = arrays(MakePropertyValue("FilterName","writer_pdf_Export",$osm)); //Write out the PDF $oWriterDoc->storeToURL($output_url,$export_args); $oWriterDoc->close(true); } ?> 

Ci sono problemi con le mie autorizzazioni o con altre aree in cui è necessario verificare le autorizzazioni per l'utente IIS? Qualcuno ha un'idea del motivo per cui IIS non è riuscito a creare l'object COM, se non un problema di autorizzazioni?

Grazie!!

Sìì!!!! Con l'aiuto di un brainiac super-duper qui al lavoro, ora ho una soluzione che funziona davvero! Dimentica tutto il codice che ho postato in precedenza, non ne uso più nessuno. Se qualcun altro ha bisogno di convertire documenti word in PDF da PHP su IIS, ecco cosa functionrà:

1) Installa OpenOffice, ovviamente

2) Vai qui:
http://www.artofsolving.com/opensource/pyodconverter e scarica DocumentConverter.py

3) Inserisci DocumentConverter.py nella stessa cartella di OpenOffice in cui risiede soffice.exe, probabilmente C: \ Program Files \ OpenOffice.org 3 \ program

4) Avvia OpenOffice come servizio:

a) Puoi farlo dalla row di command:

soffice "-accept=socket,host=localhost,port=8100;urp;StarOffice.ServiceManager" -headless -norestore -nologo -nofirststartwizard

b) O seguire le indicazioni su questo sito Web e impostare OpenOffice come servizio Windows con i parametri corretti: http://www.artofsolving.com/node/10

5) Da PHP esegui questo command:

exec('python "C:\Program Files\OpenOffice.org 3\program\DocumentConverter.py" path_to_doc\test.doc path_to_output_pdf\test.pdf"');

Yay, che soluzione carina e carina!

Sembra che l'ufficio aperto debba interagire con il desktop e non è autorizzato a farlo poiché è stato invocato da un servizio senza il flag SERVICE_INTERACTIVE_PROCESS .