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


9

我安装了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相同的命令运行,但仍然无法转换文件:

[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

Answers:


14

这里有两个问题。第一个是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。一段时间后,当我进行更改并且需要重新启动它时,它停止为我工作。


谢谢terdon,对我来说也很完美。几个问题。为什么不将它们保存在/ tmp中,而不是与存储网页的文件夹中(我测试过,它可以工作)。为什么不起作用export HOME=/tmp/ayb libreoffice --headless ...?目的是什么export,为什么不起作用HOME=/tmp/ayb; libreoffice --headless....
user1032531

如果您确实可以写信,/tmp您可以自由这样做。但是,从安全角度出发,最好不要让您的Web服务器访问外部目录/var/wwwexport导出变量,使其可用于所有后续外壳,&&并确保仅在导出成功后才运行。我不确定细节,apache可能对权限有些挑剔,将所有内容保存在www文件夹下总是更好。
13年

我对使用tmp感到困惑。是的,apache可以写入/tmp,关于它的一件好事(我认为)是它会自动清除旧文件。但话又说回来,我明白您的意思,就是要把一切都压在下面/var/www
user1032531

对于Ubuntu也是如此(消息libreoffice --headless后没有主目录消失X11 connection rejected because of wrong authentication)。
Stanislav Ivanov

3

我在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了其他文件,该文件已被静默处理,并且需要为用户修复权限?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.