Anleitung: ODT nach PDF konvertieren

Hallo zusammen,

ich bin im Rahmen meines Integrationsprozesse auf die Möglichkeit gestoßen, die ODT Templates direkt als PDF konvertieren zu lassen und ohne das odt2pdf.sh Script zu verwenden. Da die folgende Schritte nicht dokumentiert sind und ich sie nur gefunden habe, weil ich mir den PHP Code (odt.php) angeschaut habe, hier eine kurze Anleitung.

Zur Info ich verwendet die neuste Version 8.0.0, deswegen kann ich nicht sagen ob es mit älteren bereits auch geht.

  1. LibreOffice installieren, wenn nicht schon vorhanden
  2. Sicherstellen das soffice.exe im Windows/Linux Path bekannt ist. Unter Windows ist zu beachten das der Pfad nicht im Benutzer Path sondern im System Path liegt, sonst findet PHP die soffice.exe Datei nicht.
  3. In Dolibarr unter Einstellungen->Andere Einstellungen folgende Variablen hinzufügen
  4. MAIN_ODT_AS_PDF auf libreoffice setzen
  5. MAIN_ODT_AS_PDF_DEL_SOURCE auf 1 setzen. (Optional). Das löscht nach Erstellung die generierte ODT Datei

Das wars. Ich habe es auf einem Windows System getestet. Ich werde das jetzt noch auf einem Debian Server, ohne UI testen. Das sollte aber gehen weil Dolibarr das Programm soffice im headless mode ausführt.

Ich habe es jetzt auch auf einem Linux System getestet, Ubuntu 18.0 (ohne UI). Es war dabei ein bischen was zu beachten.

Damit die Anwendung soffice die Konvertierung durchführen konnte, musste das Verzeichnis /var/www entsprechende Schreibrechte besitzten. Ich es erst auf chmod +R 777 gestellet. Einmal ausgeführt, und dann auf chmod +R 755. Seit dem läuft es Problem los.

soffice muss einmalig einen .cache Ordner anlegen und ein paar Dateien schreiben. Ansonsten kommt es zu Merkwürdigen fehlern.

3 Like

Hallo.

Danke für den hilfreichen Tipp.
Nur eine kleine Frage dazu:
LibreOffice muss (nehme ich an) am Server installiert sein oder?
Lässt sich dies irgendwie auf den Client auslagern?

Lieben Dank!

Hallo zusammen,

erstmal danke an Mschwenker für die Anleitung.
Ich habe diese Anleitung 1:1 nachvollzogen.
Sie klappt auch - jedenfalls laut Log. In der Logdatei wird der Befehl ja angezeigt:

dolibarr.log


Odf::exportAsAttachedPDF $execmethod=2 Run command=soffice -headless -convert-to pdf -outdir „c:/dolibarr/dolibarr_documents/facture/(PROV172)“ „c:/dolibarr/dolibarr_documents/facture/(PROV172)/(PROV172)_invoice-2018.odt“


Im Log wird der entsprechende String auch angezeigt, der wenn ich Ihn kopiere und in der Bash (bzw DOS-Box) ausführe auch prima funktioniert- Ich habe beides ausprobiert.

Im Produktiv-System (Linux) sind auch die entsprechenden Ordner auf 775 bzw. 777 (testweise) gesetzt.

Was mich am meisten wundert ist das es in der Bash (console) ja funktioniert,
nur wenn es der PHP-Code im odt.php machen soll macht er es nicht.

Jemand eine Idee woran das liegen könnte?

Lieben Dank

Man muss Folgendes verstehen:

php-Code der Webseite wird von dem Webserver aufgerufen. Das kann beispielsweise Apache oder nginx sein. Jetzt muss man wissen, unter welchem Benutzer denn der Apache oder der nginx überhaupt laufen. Dieser Benutzer ist es letztendlich, der soffice aufruft.

Beim ersten Aufruf wird im home-Verzeichnis eines Benutzer ein Unterverzeichnis libreoffice angelegt, und darin viele weitere Unterverzeichnisse, wo diverse Einstellungen hinterlegt werden.

Wenn dieses Verzeichnis nicht existiert oder nicht beschreibbar ist, dann kommt es zu einem Problem.

Man kann ganz einfach herausfinden, ob sich soffice mit dem entsprechenden Nutzernamen starten lässt, indem man den Nutzernamen ermittelt und dann soffice per sudo mit genau diesem Nuternamen startet.

Am einfachsten ist das, indem man sich vorher zu root macht:

[code]

sudo su -[/code]

Bei mir läuft nginx als Webserver und der wiederum läuft bei mir unter dem Benutzernamen nobody. Also versuche ich, mit dem Benutzer nobody das Programm soffice zu starten. „–headless“ als Parameter ist notwendig, damit Libreoffice nicht wirklich mit einer grafischen Benutzeroberfläche gestartet wird.

[code]

sudo -u nobody soffice --headless[/code]

Wenn ich das mache, bekomme ich aber folgende Fehlermeldung

LibreOffice 6.2 - Fatal Error: The application cannot be started. User installation could not be completed.
Also schaue ich doch mal, was denn überhaupt das home-Directory von nobody ist:

[code]

grep nobody /etc/passwd[/code]

und ich erhalte:

nobody:x:65534:65534:nobody:/var/empty:/bin/false
Mit anderen Worten: nobody möchte gerne in /var/empty schreiben, was aber nicht zulässig ist. Außerdem verfügt nobody auch über keine Shell, was aber auch so gewollt ist.

Jetzt gibt es mehrere Möglichkeiten:

  1. Man lässt den Webserver über einen anderen User laufen, der mehr Rechte hat.
  2. Man ändert die Rechte des Home-Verzeichnisses
  3. Man ändert den Code der odf.php dahingehend, dass ein weiterer Parameter verwendet wird: -env
    Bei mir steht in Zeile 587:

$command ='soffice --headless --convert-to pdf --outdir '. escapeshellarg(dirname($name)). " ".escapeshellarg($name);
Das ändere ich dann beispielsweise in

$command ='soffice --headless -env:UserInstallation=file:///tmp/nobody --convert-to pdf --outdir '. escapeshellarg(dirname($name)). " ".escapeshellarg($name);
mit -env:UserInstallation=file:///tmp/nobody (wirklich nur ein Minuszeichen vor dem env) lege ich fest, wo denn das home-Verzeichnis sein soll. Damit läuft es dann ganz bestimmt, weil das /tmp-Vereichnis gewöhnlich von jedem Benutzer aus beschreibbar ist. Alternativ kann man natürlich auch ein temp-Verzeichnis aus dem Dolibarr document-Verzeichnis nutzen. Meines Erachtens ist das schöner.

Ich will mal sehen, ob ich das nicht offiziell in die Sourcen kriege, sodass es in Zukunft diese Probleme nicht mehr gibt.

Ich hoffe, ich konnte helfen.

Hallo,

kann mir jemand einen Hoster empfehlen, der libreOffice auf dem Server installiert hat, sodass ich MAIN_ODT_AS_PDF verwenden kann?
Was hat es mit der odt2pdf.sh auf sich, brauche ich dafür auch libreOffice auf dem Server? Gibt es sonst noch eine Methode automatisch auf dem Server odt Templates in pdfs zu konvertieren?

Danke und viele Grüße
Björn