我安装了 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
我现在希望做同样的事情,但是使用 PHP 并因此作为用户 apache,但是,以下操作不会转换文件。
<?php
shell_exec('/usr/bin/libreoffice --headless -convert-to pdf --outdir /tmp/ayb /tmp/ayb/document_34.doc');
?>
为了尝试排除故障,我以用户 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"
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
答案1
这里有两个问题。第一个问题是www-data
(apache 用户)没有,$HOME
因此如果没有$HOME
定义,libreoffice 就无法运行。第二个问题是,除非您以这种方式专门设置它(而您真的真的不应该这样做),否则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');
?>
我刚刚测试过,它在我的计算机上完美运行。请确保您的./tmp
权限设置为 777。此外,如果您过多地使用它,可能需要重新启动 apache。当我进行更改并需要重新启动它时,它在一段时间后停止工作。
答案2
我在 Debian 上遇到过类似的问题,并且已经解决了。
运行您的命令,但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
其他一些文件,它是默默处理的,并且您需要为您的用户修复权限?