Frage an windows, openoffice.org, iis, php – Wie konvertiere ich RTF in PDF von meiner PHP-Webseite mit OpenOffice?

1

Mein Betriebssystem ist Windows XP und ich verwende IIS 5.1 und PHP 5.2.9. Ich versuche, ein PHP-Skript von meiner PHP-Seite aus aufzurufen, um ein RTF-Dokument mit OpenOffice in ein PDF-Dokument zu konvertieren. Das Skript funktioniert einwandfrei, wenn ich es direkt von der Befehlszeile aus aufrufe, aber es gelingt mir nicht, das gleiche Skript zum Laufen zu bringen, wenn ich es von meiner PHP-Webseite aus starte.

Wenn ich das Skript von meiner PHP-Seite aus aufrufe, bleibt die Seite hängen und zeigt irgendwann einen Fehler an. Ich habe festgestellt, dass im Task-Manager angezeigt wird, wo die Prozesse soffice.bin und soffice.exe unter meinem IIS-Benutzernamen ausgeführt werden.

Das ist der Fehler:

<code>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
</code>

Ich habe die Berechtigungen für meinen IIS-Benutzer in den folgenden Bereichen überprüft:

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

In jedem Fall verfügt mein IIS-Benutzer über die folgenden Berechtigungen: Lesen und Ausführen, Ordnerinhalt auflisten, Lesen. Und in jedem Fall gibt es keine "Verweigerungen", um die Berechtigungen auszugleichen. Ich habe dem IIS-Benutzer auch Schreibrechte für den Ordner Web_Root erteilt, in dem sich der PHP-Code befindet.

Dies ist das PHP, das die Konvertierungsfunktion WordToPdf aufruft:

<code><?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);
?>
</code>

Und das ist WordToPdf.php:

<code><?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);
}
?>
</code>

Gibt es Probleme mit meinen Berechtigungen oder zusätzlichen Bereichen, in denen ich Berechtigungen für den IIS-Benutzer überprüfen muss? Hat jemand eine Idee, warum IIS das COM-Objekt nicht erstellt hat, wenn keine Berechtigungsprobleme vorliegen?

Vielen Dank!!

RTF zu PDF in PHP auf IIS. OH MEIN GOTT. harpo
Ja, jetzt sieht es gut aus! Das ist gut. user115487
Tut mir leid, der Code sieht so schrecklich aus! Ich habe die Codeblöcke mit <code> </ code> -Tags versehen, aber das hat offensichtlich nicht viel gebracht. Gibt es eine Möglichkeit, das Problem zu beheben, sodass die Codeblöcke lesbar sind und nicht alles zusammenspielt? user115487

Deine Antwort

2   die antwort
5

Yay!!!! Mit Hilfe eines Super-Duper-Hirns hier bei der Arbeit habe ich jetzt eine Lösung, die tatsächlich FUNKTIONIERT! Vergiss den ganzen Code, den ich vorher gepostet habe, ich benutze keinen davon mehr. Wenn jemand anderes Word-Dokumente von PHP auf IIS in PDF konvertieren muss, funktioniert Folgendes:

1) Installieren Sie natürlich OpenOffice

2) Gehen Sie hier:
http://www.artofsolving.com/opensource/pyodconverterund laden Sie DocumentConverter.py herunter

3) Legen Sie DocumentConverter.py im selben OpenOffice-Ordner ab, in dem sich soffice.exe befindet, wahrscheinlich C: \ Programme \ OpenOffice.org 3 \ program

4) Starten Sie OpenOffice als Dienst:

a) Sie können dies über die Befehlszeile tun:

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

b) Oder befolgen Sie die Anweisungen auf dieser Website und richten Sie OpenOffice als Windows-Dienst mit den richtigen Parametern ein:http://www.artofsolving.com/node/10

5) Führen Sie in PHP diesen Befehl aus:

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

Ja, was für eine nette und hübsche Lösung!

0

Das klingt so, als ob Open Office mit dem Desktop interagieren muss und dies nicht darf, da es von einem Dienst ohne das aufgerufen wurdeSERVICE_INTERACTIVE_PROCESS Flagge.

Verwandte Fragen