9

Я установил libreoffice-headless и могу конвертировать документы при входе в оболочку как обычный пользователь.

[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

Теперь я хочу сделать то же самое, но с использованием PHP и, следовательно, как пользователь apache, однако, следующее не будет конвертировать файл.

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

В попытке устранить неполадки я выполнил через оболочку ту же команду, что и пользователь apache, но все равно он не будет преобразовывать файл:

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

Apache, в отличие от обычных пользователей, не имеет дома, и я помню, что слышал, что мне может потребоваться указать дом, используя HOME=/tmp/ayb прежде чем пытаться конвертировать, но это не помогает (я думаю, что при использовании CentOS 5.8 и, вероятно, другая версия LibreOffice, это сделал, но я не уверен).

Как мне преобразовать файл в PDF, используя libreoffice, когда он запускается как пользователь apache?

Установленная система:

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

2 ответа2

14

Здесь есть две проблемы. Во-первых, www-data (пользователь apache) не имеет $HOME поэтому libreoffice не может работать, если не определен $HOME . Вторая проблема заключается в том, что, если вы не настроите его таким образом (а вы действительно не должны этого делать), apache не будет иметь доступа к каталогу system /tmp . Веб-сервер обычно работает в ограниченной среде и не имеет полного доступа к файловой системе по очень веским соображениям безопасности.

Итак, вам нужно: i) предоставить пользователю apache дом и ii) предоставить ему каталог, в который он имеет доступ для записи. Итак, создайте каталог tmp в той же папке, где вы храните свою веб-страницу, а затем запустите следующий код php :

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

Я только что проверил, и он отлично работает на моей машине. Убедитесь, что ваш ./tmp имеет свои права доступа 777. Кроме того, вам может понадобиться перезапустить Apache, если вы слишком много играете с ним. Он перестал работать для меня через некоторое время, когда я внес изменения, и мне нужно было перезапустить его.

3

У меня была похожая проблема на Debian, и я решил ее.

Запустите команду, но strace в самом начале, как это:
strace -f -o output.txt soffice --headless --convert-to pdf (...)

Это создаст огромный лог-файл с каждым доступом к системному API и его результатам.
В моем случае где-то возле линии 5000 было что-то вроде этого:
open("/var/spool/libreoffice/uno_packages/cache/uno_packages", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = -1 EACCES (Permission denied)

Следуя этому пути, я рекурсивно изменил разрешения для папки /var/spool/libreoffice на 777 .

После этого конвертация начала работать для каждого пользователя.

Может быть, вам также Permission denied для какого-то другого файла, он обрабатывается в режиме без вывода сообщений, и вам нужно исправить разрешения для вашего пользователя?

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .