Конвертировать файл в PDF, используя LibreOffice, под пользователем apache (т.е. при использовании PHP)

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
user1032531
источник

Ответы:

14

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

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

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

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

terdon
источник
Спасибо, Тердон, отлично подходит и для меня. Пара вопросов. Почему бы не хранить их в / tmp, а не в той же папке, где хранятся веб-страницы (я проверял, все работает). Почему не export HOME=/tmp/ayb libreoffice --headless ...работает? Какова цель exportи почему не HOME=/tmp/ayb; libreoffice --headless....работает?
user1032531
Если вы действительно можете написать /tmpвам, вы можете это сделать. Тем не менее, с точки зрения безопасности рекомендуется не предоставлять вашему веб-серверу доступ к внешним каталогам /var/www. exportэкспортирует переменную, делая ее доступной для всех последующих оболочек и следя за тем, чтобы &&она работала, только если экспорт был успешным. Я не уверен в деталях, apache может быть довольно разборчивым в отношении разрешений, всегда лучше хранить все в своей wwwпапке.
Тердон
Я замешан на использовании TMP. Да, apache может писать /tmp, и хорошая вещь (я думаю) об использовании его в том, что он автоматически удаляет старые файлы. Но опять же, я понимаю вашу точку зрения о том, чтобы держать все под /var/www.
user1032531
Также актуально для Ubuntu (без домашнего каталога libreoffice --headlessумирает после X11 connection rejected because of wrong authenticationсообщения).
Станислав Иванов
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на какой-то другой файл, он обрабатывается без вывода сообщений, и вам нужно исправить права доступа для вашего пользователя?

Павел Гутовский
источник