在用户 apache 下使用 LibreOffice 将文件转换为 PDF(即使用 PHP 时)

use*_*531 11 linux centos apache-http-server php libreoffice

我安装了 libreoffice-headless 并且可以在以普通用户身份登录 shell 时转换文档。

[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
Run Code Online (Sandbox Code Playgroud)

我现在希望做同样的事情,但使用 PHP,因此作为用户 apache,但是,以下不会转换文件。

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

为了进行故障排除,我以用户 apache 的身份通过 shell 运行了相同的命令,但它仍然不会转换文件:

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

Apache 与普通用户不同,没有家,我记得听说我可能需要HOME=/tmp/ayb在尝试转换之前指定一个家,但这没有帮助(我认为在使用 CentOS 5.8 和可能是不同版本的 LibreOffice 时,它有,但不确定)。

以 apache 用户身份运行文件时,如何使用 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
Run Code Online (Sandbox Code Playgroud)

ter*_*don 16

这里有两个问题。第一个是www-data(apache 用户)没有$HOME所以 libreoffice 如果没有$HOME定义就不能运行。第二个问题是,除非你专门这样设置(你真的真的不应该),apache否则无法访问系统/tmp目录。Web 服务器通常在受限环境中运行,并且出于非常有效的安全原因不能完全访问文件系统。

所以,你需要 i) 给 apache 的用户一个家,ii) 给它一个可以写入的tmp目录。 所以,在你存储网页的同一文件夹中创建一个目录,然后运行以下php代码:

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

我刚刚测试过,它在我的机器上完美运行。确保您./tmp的权限设置为 777。此外,如果您玩弄太多,您可能需要重新启动 apache。一段时间后,当我进行更改时,它停止为我工作,我需要重新启动它。