사용자 아파치에서 LibreOffice를 사용하여 파일을 PDF로 변환합니다 (예 : PHP를 사용하는 경우) apache -c “/usr/bin/libreoffice

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를 사용하므로 사용자 아파치로 다음을 수행하면 파일이 변환되지 않습니다.

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

문제를 해결하기 위해 쉘을 통해 사용자 아파치와 동일한 명령을 실행했지만 여전히 파일을 변환하지는 않습니다.

[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를 사용할 때 생각합니다. 하지만 확실하지는 않습니다).

사용자 아파치로 실행할 때 libreoffice를 사용하여 파일을 PDF로 변환하려면 어떻게해야합니까?

설치된 시스템 :

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



답변

여기에는 두 가지 문제가 있습니다. 첫 번째는 www-data(아파치 사용자)에 $HOMElibreoffice가 $HOME정의 되어 있지 않으면 실행할 수 없다는 것입니다 . 두 번째 문제는이 방법을 구체적으로 설정하지 않으면 (실제로 실제로는 사용하지 않아야 함) apache시스템 /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로 설정되어 있는지 확인하십시오. 또한 너무 큰 소리로 재생하는 경우 아파치를 다시 시작해야 할 수도 있습니다. 변경을 한 후 잠시 후에 작동하지 않아 다시 시작해야했습니다.


답변

데비안에 비슷한 문제가 있었고 해결했습니다.

다음 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다른 파일을 가져 와서 자동으로 처리하고 사용자의 권한을 수정해야합니까?


답변