Konwertuj plik na format PDF za pomocą LibreOffice pod apache użytkownika (tj. Przy użyciu PHP)

9

Zainstalowałem libreoffice-headless i mogę konwertować dokumenty po zalogowaniu do powłoki jako zwykły użytkownik.

[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

Chciałbym teraz zrobić to samo, ale używając PHP i dlatego jako apache użytkownika, jednak poniższe pliki nie będą konwertować pliku.

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

Próbując rozwiązać problem, uruchomiłem to samo polecenie przez powłokę, co apache użytkownika, ale nadal nie będzie on konwertować pliku:

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

Apache w przeciwieństwie do zwykłych użytkowników nie ma domu i przypominam sobie, że HOME=/tmp/aybprzed próbą konwersji może być konieczne określenie domu , ale to nie pomaga (myślę, że kiedy korzystam z CentOS 5.8 i prawdopodobnie innej wersji LibreOffice, to zrobił, ale nie jestem pewien).

Jak przekonwertować plik do formatu PDF za pomocą libreoffice, uruchamiając go jako apache użytkownika?

Zainstalowany 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
użytkownik1032531
źródło

Odpowiedzi:

14

Są tutaj dwa problemy. Po pierwsze, www-dataużytkownik apache nie ma $HOMEbiblioteki libreoffice, która nie może zostać uruchomiona, jeśli nie jest $HOMEzdefiniowana. Drugi problem polega na tym, że jeśli nie skonfigurujesz go w ten sposób (a naprawdę tak naprawdę nie powinieneś), apachenie ma dostępu do /tmpkatalogu systemowego . Serwer WWW zwykle działa w ograniczonym środowisku i ze względów bezpieczeństwa nie ma pełnego dostępu do systemu plików.

Tak więc, musisz: i) dać użytkownikowi apache dom oraz ii) dać mu katalog, do którego ma on dostęp do zapisu. Utwórz tmpkatalog w tym samym folderze, w którym przechowujesz swoją stronę, a następnie uruchom następujący phpkod:

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

Właśnie przetestowałem i działa idealnie na moim komputerze. Upewnij się, że masz ./tmpustawione uprawnienia na 777. Ponadto może być konieczne ponowne uruchomienie Apache, jeśli grasz zbyt dużo na nim. Przestał działać dla mnie po pewnym czasie, kiedy wprowadziłem zmiany i musiałem go ponownie uruchomić.

terdon
źródło
Dzięki terdon, działa również idealnie dla mnie. Kilka pytań. Dlaczego nie przechowywać ich w / tmp, a nie w tym samym folderze, w którym przechowywane są strony internetowe (przetestowałem to, działa). Dlaczego nie export HOME=/tmp/ayb libreoffice --headless ...działa? Jaki jest cel exporti dlaczego nie HOME=/tmp/ayb; libreoffice --headless....działa?
user1032531,
Jeśli możesz napisać do /tmpciebie, możesz to zrobić. Jednak z punktu widzenia bezpieczeństwa dobrym pomysłem jest nie dać serwerowi dostępu do katalogów znajdujących się na zewnątrz /var/www. exporteksportuje zmienną, udostępniając ją wszystkim kolejnym powłokom i &&upewnia się, że działa tylko wtedy, gdy eksport się powiódł. Nie jestem pewien szczegółów, apache może być dość wybredny w kwestii uprawnień, zawsze lepiej jest trzymać wszystko pod swoim wwwfolderem.
terdon
Mieszam się z używaniem tmp. Tak, apache może pisać /tmpi dobrą rzeczą (myślę) o korzystaniu z niego jest to, że automatycznie usuwa stare pliki. Ale z drugiej strony rozumiem twój punkt widzenia utrzymywania wszystkiego pod kontrolą /var/www.
user1032531,
Również aktualne dla Ubuntu (bez katalogu domowego libreoffice --headlessumiera po X11 connection rejected because of wrong authenticationwiadomości).
Stanislav Ivanov
3

Miałem podobny problem na Debianie i go rozwiązałem.

Uruchom polecenie, ale stracena początku tak:
strace -f -o output.txt soffice --headless --convert-to pdf (...)

Spowoduje to wygenerowanie ogromnego pliku dziennika przy każdym dostępie do systemowego interfejsu API i jego wyniku.
W moim przypadku gdzieś w pobliżu linii 5000 było coś takiego:
open("/var/spool/libreoffice/uno_packages/cache/uno_packages", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = -1 EACCES (Permission denied)

Idąc tą ścieżką, rekursywnie zmieniłem uprawnienia dla folderu /var/spool/libreofficena 777.

Następnie konwersja zaczęła działać dla każdego użytkownika.

Być może dostajesz także Permission deniedjakiś inny plik, jest on obsługiwany w trybie cichym i musisz naprawić uprawnienia dla swojego użytkownika?

Paweł Gutowski
źródło