使用php exec()运行LibreOffice

14

我已经在一个安装了Apache的FreeBSD服务器上安装了无头LibreOffice,以便可以编程地转换文档(例如odt->pdf)。它可以通过命令行工作!但我的目标是能够从php中使用它。这需要Web用户(www)能够运行LibreOffice。但它无法正常工作。

当以我的用户名运行LibreOffice时,我会得到:

%libreoffice --headless -convert-to pdf Litteraturundervisningogit.doc
javaPathHelper: not found #This should not be a problem, says people on the net.
convert /usr/home/bundsgaard.net/www/jeppe/foredrag/Litteraturundervisningogit.doc ->
 /usr/home/bundsgaard.net/www/jeppe/foredrag/Litteraturundervisningogit.pdf using writer_pdf_Export
%

如果我以 root 用户身份尝试相同的命令,它不起作用。使用来自 PHP 的 www-user 也是同样的问题:

sp# libreoffice --headless -convert-to pdf Litteraturundervisningogit.doc
javaPathHelper: not found
sp#

问题在于我无法从LibreOffice获取任何信息,因此我不知道为什么除了我的账户之外,LibreOffice不愿意以其他用户身份运行。

我的问题是:如何在php中通过exec()给www用户权限运行LibreOffice?


2
这只是一个路径问题吗?他们各自的$PATH里有什么? - Wrikken
1
你使用根用户在命令行中进行了测试,%sudo php program.php,那么作为客户端是否具有权限? - Peter Krauss
8个回答

17

在运行转换命令之前,我通过快速执行export HOME=/tmp来解决了这个问题,这样LibreOffice就有可以进行写操作的可写空间了。


那非常聪明...你可能为我节省了很多时间。谢谢。 - Scalpweb
这对我解决了来自PHP的挂起转换问题,但你能告诉我这到底是做什么的吗?为什么这样可以解决挂起转换的问题? - Rvanlaak
1
Libreoffice会将阴影/临时/隐藏文件写入用户(运行PHP的用户,通常是apache或http或www-data)的主目录。从Web服务器(而不是从CLI)运行PHP的用户通常没有主目录,因此$HOME环境变量将为空或未设置,因此Libreoffice无法写入/。因此,将其明确设置为tmp可以为Libreoffice提供一些具有写入权限的空间。希望对您有所帮助。 - Question Mark

3

这不是一个严格的答案,但是你可以考虑使用PUNO来代替PHP的 exec。PUNO是一个PHP5模块,它提供了对 OpenOffice.org UNO编程API的访问。


3

我有点偏袒,因为显而易见的原因,但我认为这是最好的解决方案 :) - Robert Hyatt

2
"最初的回答":这对我有效。 请确保您已安装Java RE,例如在Ubuntu中:
apt-get install default-jre

First, find the location of your libreoffice

$ which libreoffice
/usr/bin/libreoffice

在PATH中包含文件夹位置,并通过添加以下行设置HOME变量:

将文件夹位置加入PATH路径,同时添加以下内容设置HOME变量:

putenv('PATH=/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin');
putenv('HOME=/tmp'); 
system("libreoffice .....

1

在执行exec()或shell_exec()之前,我建议先设置配置路径。

例如:

// Vars
putenv('PATH=/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin');
putenv('HOME=' . $outputdir); 
$outputdir = 对于libreoffice命令“--outdir”也需要将同一文件夹更改为chmod 777。

1

这对我很有帮助。

你可以使用LibreOffice将docx转换为HTML,您需要给予输出目录适当的权限。

exec("export HOME='/var/www/html/wp/wp-content/uploads/' && /usr/bin/libreoffice --headless   --convert-to html --outdir '/var/www/html/wp/wp-content/uploads/' /var/www/html/wp/wp-content/uploads/demo.docx");

1

我遇到了同样的问题,感谢Wrikken,将/usr/local/sbin添加到PATH环境变量之前,我无法在apache下以www-data身份运行libreoffice。


1
@nikyspag 先生,您能与我分享您的代码吗? - Mohammed Sufian

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接