사용자 아파치에서 LibreOffice를 사용하여 파일을 PDF로 변환합니다 (예 : 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를 사용하므로 사용자 아파치로 다음을 수행하면 파일이 변환되지 않습니다.

<?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

답변:


14

여기에는 두 가지 문제가 있습니다. 첫 번째는 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로 설정되어 있는지 확인하십시오. 또한 너무 큰 소리로 재생하는 경우 아파치를 다시 시작해야 할 수도 있습니다. 변경을 한 후 잠시 후에 작동하지 않아 다시 시작해야했습니다.


감사합니다 terdon, 나에게도 완벽하게 작동합니다. 몇 가지 질문. 왜 웹 페이지가 저장된 폴더와 같은 폴더가 아닌 / tmp에 보관하지 않습니까? 왜 작동하지 export HOME=/tmp/ayb libreoffice --headless ...않습니까? 목적이 무엇 export이며 왜 작동하지 HOME=/tmp/ayb; libreoffice --headless....않습니까?
user1032531

당신이 실제로 쓸 수 있다면 그렇게 할 수 있습니다 /tmp. 그러나 웹 서버에 외부 디렉토리에 대한 액세스 권한을 부여하지 않는 것이 보안상의 관점에서 볼 때 좋습니다 /var/www. export변수를 &&내보내 모든 후속 쉘에서 사용할 수 있도록 하고 내보내기에 성공한 경우에만 변수를 실행합니다. 세부 사항에 대해 잘 모르겠습니다. 아파치는 권한에 대해 매우 까다로울 수 있습니다 www. 모든 것을 폴더 아래에 두는 것이 좋습니다 .
terdon

나는 tmp를 사용하는 것에 섞여있다. 예, 아파치는에 쓸 수 있으며 /tmp사용하는 것에 대한 좋은 점은 오래된 파일을 자동으로 제거한다는 것입니다. 그러나 다시, 나는 모든 것을 지키는 것에 대한 당신의 요점을 봅니다 /var/www.
user1032531

우분투의 경우에도 마찬가지입니다 ( 메시지 libreoffice --headless후 홈 디렉토리 가 없으면 X11 connection rejected because of wrong authentication).
Stanislav Ivanov

3

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.