Konvertieren Sie eine Datei mit LibreOffice unter Benutzer-Apache in PDF (dh bei Verwendung von PHP).

9

Ich habe libreoffice-headless installiert und kann Dokumente konvertieren, wenn ich als normaler Benutzer in der Shell angemeldet bin.

[root@desktop ~]# yum install libreoffice-headless
[root@desktop ~]# yum install libreoffice-writer
[root@desktop ~]# su NotionCommotion
sh-4.1$ /usr/bin/libreoffice --headless -convert-to pdf --outdir /tmp/ayb /tmp/ayb/document_34.doc
convert /tmp/ayb/document_34.doc -> /tmp/ayb/document_34.pdf using writer_pdf_Export

Ich möchte jetzt das Gleiche tun, aber mit PHP und daher als Benutzer-Apache wird die Datei jedoch im Folgenden nicht konvertiert.

<?php
  shell_exec('/usr/bin/libreoffice --headless -convert-to pdf --outdir /tmp/ayb /tmp/ayb/document_34.doc');
?>

Bei dem Versuch, eine Fehlerbehebung durchzuführen, habe ich denselben Befehl über die Shell ausgeführt wie Benutzer-Apache, aber die Datei wird trotzdem nicht konvertiert:

[root@desktop ~]# su -s /bin/sh apache -c "/usr/bin/libreoffice --headless -convert-to pdf --outdir /tmp/ayb /tmp/ayb/document_34.doc"

Im Gegensatz zu normalen Benutzern hat Apache kein Zuhause, und ich erinnere mich, dass ich möglicherweise ein Zuhause angeben muss, HOME=/tmp/aybbevor ich versuche, es zu konvertieren, aber es hilft nicht (ich denke, wenn ich CentOS 5.8 und wahrscheinlich eine andere Version von LibreOffice verwende, ist es das tat, bin mir aber nicht sicher).

Wie konvertiere ich eine Datei mit libreoffice in PDF, wenn ich sie als Benutzer-Apache ausführe?

Installiertes System:

CentOS 6.4
httpd.x86_64                    2.2.15-28.el6.centos              @updates
libreoffice-headless.x86_64     1:3.4.5.2-16.1.el6_3              @base
user1032531
quelle

Antworten:

14

Hier gibt es zwei Probleme. Das erste ist, dass www-data(der Apache-Benutzer) kein $HOMELibreoffice hat, das nicht ausgeführt werden kann, wenn es nicht $HOMEdefiniert ist. Das zweite Problem ist, dass Sie apachekeinen Zugriff auf das Systemverzeichnis haben , es sei denn, Sie haben es speziell auf diese Weise eingerichtet (und Sie sollten es wirklich wirklich nicht tun) /tmp. Ein Webserver wird normalerweise in einer eingeschränkten Umgebung ausgeführt und hat aus sehr gültigen Sicherheitsgründen keinen vollständigen Zugriff auf das Dateisystem.

Sie müssen also i) dem Benutzer von Apache ein Zuhause geben und ii) ihm ein Verzeichnis geben, in das er schreiben kann. Erstellen Sie also ein tmpVerzeichnis in demselben Ordner, in dem Sie Ihre Webseite speichern, und führen Sie dann den folgenden phpCode aus:

<?php
  shell_exec('export HOME=/tmp && libreoffice --headless -convert-to pdf --outdir ./tmp /tmp/ayb/document_34.doc');
?>

Ich habe gerade getestet und es funktioniert perfekt auf meiner Maschine. ./tmpStellen Sie sicher, dass Ihre Berechtigungen auf 777 festgelegt sind. Außerdem müssen Sie möglicherweise Apache neu starten, wenn Sie zu viel damit spielen. Nach einer Weile funktionierte es nicht mehr für mich, als ich Änderungen vornahm und es neu starten musste.

Terdon
quelle
Danke Terdon, funktioniert auch perfekt für mich. Ein paar Fragen. Warum bewahren Sie sie nicht in / tmp und nicht im selben Ordner auf, in dem Webseiten gespeichert sind (ich habe es getestet, es funktioniert). Warum funktioniert das nicht export HOME=/tmp/ayb libreoffice --headless ...? Was ist der Zweck von exportund warum funktioniert es nicht HOME=/tmp/ayb; libreoffice --headless....?
user1032531
Wenn Sie tatsächlich schreiben können, können /tmpSie dies tun. Aus Sicherheitsgründen ist es jedoch eine gute Idee, Ihrem Webserver keinen Zugriff auf Verzeichnisse zu gewähren, die sich außerhalb befinden /var/www. exportExportiert die Variable, stellt sie allen nachfolgenden Shells zur Verfügung und &&stellt sicher, dass sie nur ausgeführt wird, wenn der Export erfolgreich war. Ich bin mir nicht sicher über die Details, Apache kann sehr pingelig in Bezug auf Berechtigungen sein, es ist immer besser, alles in Ihrem wwwOrdner zu behalten .
Terdon
Ich bin gemischt mit tmp. Ja, Apache kann darauf schreiben /tmp, und eine gute Sache (glaube ich) bei der Verwendung ist, dass alte Dateien automatisch gelöscht werden. Aber andererseits sehe ich Ihren Standpunkt, alles unter Kontrolle zu halten /var/www.
user1032531
Auch aktuell für Ubuntu (ohne Home-Verzeichnis libreoffice --headlessstirbt nach X11 connection rejected because of wrong authenticationNachricht).
Stanislav Ivanov
3

Ich hatte ein ähnliches Problem mit Debian und habe es gelöst.

Führen Sie Ihren Befehl aus, aber mit straceam Anfang wie folgt:
strace -f -o output.txt soffice --headless --convert-to pdf (...)

Dadurch wird bei jedem Zugriff auf die System-API und deren Ergebnis eine riesige Protokolldatei erstellt.
In meinem Fall gab es irgendwo in der Nähe der Linie 5000 so etwas:
open("/var/spool/libreoffice/uno_packages/cache/uno_packages", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = -1 EACCES (Permission denied)

Im Anschluss an diese Spur, änderte ich Berechtigungen rekursiv für Ordner /var/spool/libreofficezu 777.

Danach begann die Konvertierung für jeden Benutzer zu funktionieren.

Vielleicht greifen Sie auch Permission deniedauf eine andere Datei zu, die unbeaufsichtigt behandelt wird und Sie müssen die Berechtigungen für Ihren Benutzer festlegen?

Paweł Gutowski
quelle