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

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

我安装了 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/libreoffice777

此后,转换开始对每个用户起作用。

也许您还获得了Permission denied其他一些文件,它是默默处理的,并且您需要为您的用户修复权限?

相关内容