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.

4 „Gefällt mir“

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

Vielen Dank für diese Anleitung,
funktioniert bei mir sofort.

Katasun

Hallo zusammen,

ich würde das Thema gerne nochmal aufgreifen. Ich habe mich an die Anleitung gehalten und erhalte folgenden Fehler:

Das System hat einen technischen Fehler festgestellt.
Diese Informationen können bei der Fehlersuche hilfreich sein (Hinweise können entfernt werden indem $dolibarr_main_prod auf ‚1‘ gesetzt wird):
Datum: 20210910140432
Dolibarr: 14.0.1 - https://www.dolibarr.org
Funktionslevel: 0
PHP: 7.3.12
Server: Apache/2.4.41 (Win64) PHP/7.3.12
OS: Windows NT DESKTOP-VQQCJ4D 10.0 build 19043 (Windows 10) AMD64
UserAgent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36 Edg/93.0.961.38

Angefragte URL: /dolibarr/comm/propal/card.php?id=6
Referer: http://localhost/dolibarr/comm/propal/card.php?id=6&save_lastsearch_values=1
Menüverwaltung: eldy_menu.php

Module / Anwendungen: syslog, user, fckeditor, export, clicktodial, categorie, propal, contrat, modulebuilder, agenda, banque, barcode, cron, commande, facture, fournisseur, service, societe, ticket, takepos, paymentbybanktransfer, import, ficheinter, product
Datenbank Type Manager: mysqli
Letzter Fehlerhafter Datenbankzugriff: Keine Anfrage im Fehler
Rückgabewert des letzten fehlerhaften Datenbankzugriff: Keine Anfrage im Fehler
Information zum letzten fehlerhaften Datenbankzugriff: Keine Anfrage im Fehler

Message: Error generating document for CommonObject. Error: ODT to PDF convert fail (option MAIN_ODT_AS_PDF is libreoffice, command was soffice --headless -env:UserInstallation=file:‚c:/dolibarr/dolibarr_documents/users/temp/odtaspdf‘ --convert-to pdf --outdir „c:/dolibarr/dolibarr_documents/propale/21010001“ „c:/dolibarr/dolibarr_documents/propale/21010001/21010001_Facture_test.odt“, retval=1) :smiley:

Kann jemand von euch damit was anfangen?

Danke euch.

Gruß

Sebastian

Genaues kann ich nicht beitragen, aber ich würde versuchen, den fehlgeschlagenen Befehl mal auf der Kommandozeile auszuführen - in der Hoffnung, dass die Fehlermeldung dort weitere Hinweise bietet. Also:

soffice --headless -env:UserInstallation=file:‚c:/dolibarr/dolibarr_documents/users/temp/odtaspdf‘ --convert-to pdf --outdir „c:/dolibarr/dolibarr_documents/propale/21010001“ „c:/dolibarr/dolibarr_documents/propale/21010001/21010001_Facture_test.odt“

Wobei mir die Anführungszeichen etwas suspekt vorkommen - vielleicht sind sie Opfer der Forenformatierung geworden?

Gruß

Joachim

Habs gerade ausprobiert. Es wird kein Fehler zurückgegeben, aber die Datei wird auch nicht konvertiert…

Edit: Ich habe jetzt einmal in das Verzeichnis von soffice.exe gewechselt und von dort aus soffice aufgerufen. Dann erscheint folgende Fehlermeldung:

Die Anwendung kann nicht gestartet werden.
Die Konfigurationsdatei „C:\Program Files\LibreOffice\program\bootstrap.ini“ ist beschädigt.

Hallo, leider bin ich nicht in der Lage PDF´s zu generieren.

Die Ausgabe die kommt lautet:

Das System hat einen technischen Fehler festgestellt.
Diese Informationen können für Diagnosezwecke nützlich sein (Sie können die Option $dolibarr_main_prod auf ‚1‘ setzen, um sensible Informationen auszublenden):
Datum: 20220526123510
Dolibarr: 15.0.2 - https://www.dolibarr.org
Funktionslevel: 0
PHP: 7.3.12
Server: Apache/2.4.41 (Win64) PHP/7.3.12
OS: Windows NT DESKTOP-NPI24K3 10.0 build 19042 (Windows 10) AMD64
UserAgent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:100.0) Gecko/20100101 Firefox/100.0

Angefragte URL: /dolibarr/compta/facture/card.php?facid=22
Referer: http://localhost/dolibarr/compta/facture/card.php?facid=22
Menüverwaltung: eldy_menu.php

Module/Anwendungen: user, categorie, mailing, propal, tax, expedition, agenda, banque, commande, facture, fournisseur, service, societe, ticket, knowledgemanagement, ficheinter, contrat, product, projet
Datenbank Type Manager: mysqli
Letzter Fehlerhafter Datenbankzugriff: Keine Anfrage im Fehler
Rückgabewert des letzten fehlerhaften Datenbankzugriff: Keine Anfrage im Fehler
Information zum letzten fehlerhaften Datenbankzugriff: Keine Anfrage im Fehler

Message: Error generating document for CommonObject. Error: ODT to PDF convert fail (option MAIN_ODT_AS_PDF is libreoffice, command was soffice --headless -env:UserInstallation=file:‚c:/dolibarr/dolibarr_documents/users/temp/odtaspdf‘ --convert-to pdf --outdir „c:/dolibarr/dolibarr_documents/facture/(PROV22)“ „c:/dolibarr/dolibarr_documents/facture/(PROV22)/(PROV22)_invoice.odt“, retval=1) :

Ich habe unter Scripte odttopdf den Pfad zu Soffice eingetragen…so:

Full patch where soffice is installed

soffice=„C:„Program Files“\LibreOffice\program\soffice.exe“

Von Windows habe ich wenig Ahnung, aber in dem Pfad fehlt zumindest hinter „C:“ ein Backslash. Die Anführungszeichen kommen mir seltsam vor.

Das ist beim Kopieren wohl passiert…in der Konfig steht der Pfad richtig und ist so kopiert in die Kommandozeile auch aufrufbar

soffice=„C:\Program Files\LibreOffice\program\soffice.exe“
So würde ich es probieren. Das doppelte quoten in einer Pfadangabe erscheint mit ungewöhnlich.
Alternativ das soffice.exe weglassen, da ja anscheinend nur der Pfad bis dahin gefordert wird.

Moin,
das Leerzeichen bei „Program files“ rafft die Kommandozeile nicht, daher die „“.

Habe aber jetzt auch verstanden was der Kolege oben in dem Beitrag meinte…im Windows Path bekannt machen.

Nämlich das hier: Anleitung: Pfad-/Path-Variable in Windows einstellen | Tutonaut.de
die Script datei wird dann wohl gar nicht benötigt.

Mein System findet Soffice jetzt, allerdings wenn ich ne RG erzeugen möchte, friert Dolibarr ein und nix passiert mehr. Ist auch nicht mehr zurück zu holen, Browser zu, wieder auf und alles geht wieder…aber pdfs habe ich immer noch keine

es ist zum verzweifeln

Ich weiß nicht, ob und wie Apache oder PHP unter Windows logs anlegen, aber das wäre mein erster Anlaufpunkt.

da sehe ich eben nix…weder im apache_error log noch im Php_error log…

evtl. doch auf Linux gehn…läuft in ner HyperV-VM

Was passiert denn beim händischen Aufruf in der Konsole…

Vielen Dank für Deine Anleitung.

Deine Anleitung hat bei mir mit Dolibarr Version 16 und Debian bullseye sofort funktioniert, ohne weitere Konfiguration.

Katasun