Converta arquivo para PDF usando o LibreOffice no usuário apache (ou seja, ao usar PHP)

9

Instalei o libreoffice-headless e posso converter documentos quando logado no shell como um usuário normal.

[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

Agora desejo fazer a mesma coisa, mas usando o PHP e, portanto, como usuário apache, no entanto, o seguinte não converterá o arquivo.

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

Na tentativa de solucionar problemas, executei o mesmo comando através do shell que o usuário apache, mas ele ainda não converterá o arquivo:

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

O Apache, diferentemente dos usuários normais, não possui uma casa, e lembro-me de ouvir que talvez seja necessário especificar uma casa HOME=/tmp/aybantes de tentar converter, mas isso não ajuda (acho que ao usar o CentOS 5.8 e provavelmente uma versão diferente do LibreOffice, (mas não tenho certeza).

Como converter um arquivo em PDF usando o libreoffice ao executá-lo como usuário apache?

Sistema instalado:

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
fonte

Respostas:

14

Existem dois problemas aqui. A primeira é que www-data(o usuário do apache) não possui um, $HOMEportanto o libreoffice não pode ser executado se não houver um $HOMEdefinido. O segundo problema é que, a menos que você o configure dessa maneira (e realmente não deveria), apachenão tem acesso ao /tmpdiretório do sistema . Um servidor da web normalmente é executado em um ambiente restrito e não possui acesso total ao sistema de arquivos por razões de segurança muito válidas.

Portanto, você precisa: i) fornecer uma home ao usuário do apache e ii) fornecer um diretório ao qual ele tem acesso para escrever. Portanto, crie um tmpdiretório na mesma pasta em que você armazena sua página da Web e execute o seguinte phpcódigo:

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

Acabei de testar e funciona perfeitamente na minha máquina. Certifique-se de ./tmpque suas permissões estejam definidas para 777. Além disso, pode ser necessário reiniciar o apache se você jogar muito alto com ele. Parou de funcionar para mim depois de um tempo, quando eu fiz alterações e precisei reiniciá-lo.

Terdon
fonte
Obrigado Terdon, funciona perfeito para mim também. Par de perguntas. Por que não mantê-los em / tmp e não na mesma pasta em que as páginas da Web estão armazenadas (eu testei, funciona). Por que não export HOME=/tmp/ayb libreoffice --headless ...funciona? Qual é o objetivo exporte por que não HOME=/tmp/ayb; libreoffice --headless....funciona?
user1032531
Se você realmente pode escrever para /tmpvocê, é livre para fazê-lo. No entanto, é recomendável, do ponto de vista da segurança, não conceder ao servidor da Web acesso a diretórios externos /var/www. exportexporta a variável, disponibilizando-a para todos os shells subseqüentes e &&assegura que seja executada apenas se a exportação tiver sido bem-sucedida. Não tenho certeza dos detalhes, o apache pode ser bastante exigente quanto às permissões, é sempre melhor manter tudo na sua wwwpasta.
terdon
Eu sou misto em usar tmp. Sim, o apache pode escrever /tmpe uma coisa boa (eu acho) sobre usá-lo é que ele limpa automaticamente os arquivos antigos. Mas, novamente, vejo o seu ponto de manter tudo embaixo /var/www.
user1032531
Também atual para o Ubuntu (sem o diretório inicial libreoffice --headlessmorre após a X11 connection rejected because of wrong authenticationmensagem).
Stanislav Ivanov
3

Eu tive um problema semelhante no Debian e resolvi-o.

Execute seu comando, mas com straceno início, assim:
strace -f -o output.txt soffice --headless --convert-to pdf (...)

Isso produzirá um arquivo de log enorme com todo acesso à API do sistema e seu resultado.
No meu caso, em algum lugar próximo à linha 5000, havia algo parecido com isto:
open("/var/spool/libreoffice/uno_packages/cache/uno_packages", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = -1 EACCES (Permission denied)

Após essa trilha, alterei as permissões recursivamente para a pasta /var/spool/libreofficepara 777.

Depois disso, a conversão começou a funcionar para todos os usuários.

Talvez você também tenha Permission deniedoutro arquivo, ele é tratado silenciosamente e você precisa corrigir as permissões do seu usuário?

Paweł Gutowski
fonte