Welcome to ShenZhenJia Knowledge Sharing Community for programmer and developer-Open, Learning and Share
menu search
person
Welcome To Ask or Share your Answers For Others

Categories

My OS is Windows XP, and I'm using IIS 5.1 and PHP 5.2.9. I'm trying to call a PHP script from my PHP page in order to convert an RTF doc to a PDF, using OpenOffice. The script works just fine when I call it directly from the command line, but I'm not having any success getting the very same script to work when launched from my PHP web page.

When I call the script from my PHP page, the page hangs, eventually showing an error, and I've noted that I can see in the Task Manager where the soffice.bin and soffice.exe processes are running under my IIS user name.

This is the error:

Fatal error: Uncaught exception 'com_exception' with message 'Failed to create COM object `com.sun.star.ServiceManager': Server execution failed ' in C:WEB_ROOTSoftwareContractWordToPdf.php:14 Stack trace: #0 C:WEB_ROOTSoftwareContractWordToPdf.php(14): com->com('com.sun.star.Se...') #1 C:WEB_ROOTSoftwareContractIndex.php(11): word2pdf('file:///C:/web_...', 'file:///C:/web_...') #2 {main} thrown in C:WEB_ROOTSoftwareContractWordToPdf.php on line 14

I've double-checked permissions for my IIS user in these areas:

C:PHP
C:Program FilesOpenOffice.org 3
C:Program FilesJava
C:WEB_ROOT ---- location for my php code

In each case, my IIS user has these permissions: Read and Execute, List Folder Contents, Read. And in each case there are no "denys" checked to offset the permissions. I also gave the IIS user write permissions for the Web_Root folder where the php code resides.

This is the php which calls the conversion function, 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);
?>

And this is 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.
");
    //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);
}
?>

Are there any problems with my permissions, or any additional areas where I need to check permissions for the IIS user? Does anyone have an idea why IIS failed to create the COM object, if not a permissions issue?

Thanks!!

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
thumb_up_alt 0 like thumb_down_alt 0 dislike
1.2k views
Welcome To Ask or Share your Answers For Others

1 Answer

Yay!!!! With the help of a super-duper brainiac here at work, I now have a solution that actually WORKS! Forget all the code I posted earlier, I'm not using any of it anymore. If anyone else needs to convert word docs to PDF from PHP on IIS here's what will work:

1) Install OpenOffice, of course

2) Go here:
http://www.artofsolving.com/opensource/pyodconverter, and download DocumentConverter.py

3) Place DocumentConverter.py in the same OpenOffice folder where soffice.exe resides, probably C:Program FilesOpenOffice.org 3program

4) Start OpenOffice as a service:

a)You can do this from the command line:

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

b) Or follow the directions on this website and setup OpenOffice as a windows service with the proper parameters: http://www.artofsolving.com/node/10

5) From PHP run this command:

exec('python "C:Program FilesOpenOffice.org 3programDocumentConverter.py" path_to_docest.doc path_to_output_pdfest.pdf"');

Yay, what a neat and pretty solution!


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
thumb_up_alt 0 like thumb_down_alt 0 dislike
Welcome to ShenZhenJia Knowledge Sharing Community for programmer and developer-Open, Learning and Share

548k questions

547k answers

4 comments

86.3k users

...