Перетворити файл у PDF за допомогою LibreOffice під користувачем apache (тобто при використанні PHP)


9

Я встановив libreoffice без голови і можу конвертувати документи при вході в оболонку як звичайний користувач.

[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, коли запускається як користувальницький апарат?

Встановлена ​​система:

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

Відповіді:


14

Тут є дві проблеми. Перший полягає в тому, що www-data(користувач apache) не має $HOMEлібріофісу, який не може працювати, якщо він не $HOMEвизначений. Друга проблема полягає в тому, що якщо ви спеціально не налаштували її таким чином (і ви справді насправді цього не повинні), apacheнемає доступу до системного /tmpкаталогу. Веб-сервер зазвичай працює в обмеженому середовищі і не має повного доступу до файлової системи з дуже вагомих причин безпеки.

Отже, вам потрібно: i) надати користувачеві апачі будинок, і ii) дати йому каталог, в який він має доступ для запису. Отже, створіть tmpкаталог у тій же папці, де ви зберігаєте свою веб-сторінку, а потім запустіть такий phpкод:

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

Я щойно тестував, і це чудово працює на моїй машині. Переконайтеся, що для ваших ./tmpдозволів встановлено 777. Крім того, вам може знадобитися перезапустити apache, якщо ви занадто сильно зіграєте з ним. Через деякий час для мене це перестало працювати, і мені потрібно було його перезапустити.


Дякую тердон, прекрасно працює і для мене. Пара питань. Чому б не зберегти їх у / tmp і не в тій же папці, де зберігаються веб-сторінки (я перевірив це, він працює). Чому не export HOME=/tmp/ayb libreoffice --headless ...працює? Яка мета exportі чому не HOME=/tmp/ayb; libreoffice --headless....працює?
користувач1032531

Якщо ви насправді можете писати, /tmpви можете це зробити. Однак із точки зору безпеки корисною ідеєю не надавати веб-серверу доступ до каталогів, які знаходяться зовні /var/www. exportекспортує змінну, зробивши її доступною для всіх наступних оболонок і &&переконавшись, що вона працює лише в тому випадку, якщо експорт був успішним. Я не впевнений у деталях, апаш може бути досить вибагливим щодо дозволів, завжди краще тримати все під вашою wwwпапкою.
тердон

Я змішуюся з використанням tmp. Так, Apache може писати /tmp, і хороша річ (я думаю) про його використання полягає в тому, що він автоматично очищає старі файли. Але знову ж таки, я бачу вашу думку про те, щоб все було внизу /var/www.
користувач1032531

Також актуально для 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на якийсь інший файл, він обробляється безшумно, і вам потрібно виправити дозволи для вашого користувача?

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.