Converte o arquivo para PDF usando o LibreOffice sob o usuário apache (ou seja, quando usando PHP)

9

Instalei o libreoffice-headless e posso converter documentos quando conectado ao 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 eu quero fazer a mesma coisa, mas usando PHP e, portanto, como usuário apache, no entanto, o seguinte não irá converter o arquivo.

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

Em uma tentativa de solucionar problemas, executei o mesmo comando através do shell como usuário apache, mas ainda assim ele 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, ao contrário dos usuários normais, não tem casa, e eu lembro de ouvir que talvez precise especificar uma casa usando HOME=/tmp/ayb antes de tentar converter, mas não ajuda (acho que ao usar o CentOS 5.8 e provavelmente um versão diferente do LibreOffice, mas não tenho certeza).

Como faço para 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
    
por user1032531 02.08.2013 / 20:23

2 respostas

14

Existem dois problemas aqui. A primeira é que www-data (o usuário do apache) não possui um $HOME , então o libreoffice não pode ser executado se não houver $HOME definido. O segundo problema é que, a menos que você o configure especificamente dessa forma (e você realmente não deveria), apache não tem acesso ao diretório /tmp do sistema. Um servidor da Web normalmente é executado em um ambiente restrito e não tem acesso total ao sistema de arquivos por motivos de segurança muito válidos.

Então, você precisa i) dar ao usuário do apache uma casa e ii) dar a ele um diretório para o qual ele possa escrever. Portanto, crie um diretório tmp na mesma pasta onde você armazena sua página da Web e execute o seguinte código php :

<?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 que seu ./tmp tenha suas permissões definidas para 777. Além disso, talvez seja necessário reiniciar o apache se você jogar muito com o aroud. Parou de funcionar para mim depois de um tempo quando fiz alterações e precisei reiniciá-lo.

    
por 02.08.2013 / 21:07
3

Eu tive problemas semelhantes no Debian e resolvi isso.

Execute seu comando, mas com strace no começo, assim: strace -f -o output.txt soffice --headless --convert-to pdf (...)

Isso produzirá um enorme arquivo de log com todos os acessos à API do sistema e seu resultado.
No meu caso, em algum lugar perto da linha 5000, havia algo assim: open("/var/spool/libreoffice/uno_packages/cache/uno_packages", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = -1 EACCES (Permission denied)

Seguindo essa trilha, alterei as permissões recursivamente para a pasta /var/spool/libreoffice para 777 .

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

Talvez você também receba Permission denied em algum outro arquivo, ele seja tratado silenciosamente e você precise corrigir permissões para seu usuário?

    
por 29.01.2014 / 17:45