Libreoffice --headless 拒绝转换,除非是 root,不能在 PHP 脚本中工作

Posted

技术标签:

【中文标题】Libreoffice --headless 拒绝转换,除非是 root,不能在 PHP 脚本中工作【英文标题】:Libreoffice --headless refuses to convert unless root, won't work from PHP script 【发布时间】:2012-08-19 13:44:28 【问题描述】:

运行无头 Ubuntu 服务器 12.something。

root@server:chown www-data /my/path/ -R

root@server:chgrp www-data /my/path/ -R

root@server:chmod 755 /my/path/ -R

root@server:libreoffice --headless --convert-to pdf:writer_pdf_Export /my/path/foo.ppt --outdir /my/path

convert /my/path/foo.ppt -> /my/path/foo.pdf

像魅力一样工作。


root@server:sudo -i -u www-data

$libreoffice --headless --convert-to pdf:writer_pdf_Export /my/path/foo.ppt --outdir /my/path

convert /my/path/foo.ppt -> /my/path/foo.pdf
Error: Please reverify input parameters...

该死的。


root@server:sudo -i -u someotheruser

$libreoffice --headless --convert-to pdf:writer_pdf_Export /my/path/foo.ppt --outdir /my/path

convert /my/path/foo.ppt -> /my/path/foo.pdf
Error: Please reverify input parameters...

该死的。

有人知道吗?试图研究这个让我更加困惑。这可能是一个错误还是一些依赖怪癖?

【问题讨论】:

我在 Ubuntu 12.04 中遇到了同样的问题,我正在尝试将 ods 文件转换为 pdf 并且它仅适用于 sudo @Jacek Wysocki - 我找到了一种将 DocumentConverter.py 与 LibreOffice (artofsolving.com/opensource/pyodconverter) 结合使用的解决方法。唯一的麻烦是,你需要守护 libreoffice,这有点让人头疼,给我带来了一些麻烦。哦,守护进程仍然需要以 root 身份运行。 我也有一个:$ sudo visudo 并且我添加了这一行:%users ALL=(ALL) NOPASSWD: libreoffice 之后 sudo libreoffice ... 没有密码 【参考方案1】:

正如 Jacek 在他的评论中所说,将您尝试执行命令的用户设置为不需要密码的 sudoer。然后将您的 libreoffice 命令更改为

sudo libreoffice <rest of command>

为我工作。我有同样的问题。

【讨论】:

【参考方案2】:

您不能使用 www-data 用户运行 libreoffice soffice 二进制文件。请改用具有 sudo 权限的用户。检查我的要点https://gist.github.com/nathanielvarona/423bda9e4a8a4f0f9bbf#file-soffice-listener-sh

因为您将在 php 中使用它。也试试 PHP-FPM。安装它,然后修改 /etc/php5/fpm/pool.d/www.conf 文件。

来自

user = www-data 
group = www-data

收件人:

user = ubuntu
group = ubuntu

我已经在 AWS EC2 以及我的 VBox 虚拟机上成功运行了它。

【讨论】:

【参考方案3】:

我终于找到了答案... 添加:

export HOME=/tmp &&

从头到尾,所以:

export HOME=/tmp && libreoffice --headless --convert-to pdf:writer_pdf_Export /my/path/foo.ppt --outdir /my/path

这在 CentOS 6.5 上对我有用,在 PHP 中作为 shell_exec()。

【讨论】:

这确实应该是公认的答案。你拯救了我的一天。 您也可以使用:HOME=/tmp libreoffice --headless --convert-to pdf:writer_pdf_Export /my/path/foo.ppt --outdir /my/path,因为您只是为一个进程设置 HOME 变量。 很适合我谢谢@greatmatter【参考方案4】:

我遇到了同样的错误,但问题不是 root 访问权限。命令错误。

这对我有用,从 LibreOffice 4.2 的文档中获取文本。:

soffice --headless --convert-to txt:Text file_to_convert.odt

(http://ask.libreoffice.org/en/question/14130/how-do-i-install-filters-for-the-soffice-command/)

【讨论】:

此外,我必须引用过滤器名称 soffice --headless --convert-to txt:"Text" ./*.docx(是的,这是在 Kubuntu 14.10 上安装 LibreOffice,apt-file 确认 libreoffice-common: /usr/bin/soffice)。【参考方案5】:

在 CloudFoundry (Diego) 容器中作为 NodeJS 应用程序的一部分运行 soffice 二进制无头 (LibreOffice 5.0.5.2) 时,我们遇到了同样的问题。

似乎较新版本的libreoffice 不希望有可写的HOME,但尝试写信给TMPDIR

strace 显示: 8349 mkdir("app/tmp", 0777) = -1 ENOENT (No such file or directory) 8349 open("app/tmp/lu8349pzgegi.tmp", O_RDWR|O_CREAT|O_EXCL, 0600) = -1 ENOENT (No such file or directory)

TMPDIR=app/tmp

我们通过将 TMPDIR 设置为 App 进程用户可写的目录来修复它,即 CloudFoundry 上的 TMPDIR=/tmp

process.env.TMPDIR = "/tmp";

【讨论】:

【参考方案6】:

您需要做的所有事情 - 创建文件夹“/var/www/.config”。当您尝试在 www-data 用户 libreoffice 下转换某些文件时,需要用户主目录中的“.config”目录。但是 libreoffice 没有创建此类文件夹的权限。用户 www-data 默认主目录是“/var/www”。所以只需运行命令:

sudo mkdir /var/www/.config
sudo chmod 700 /var/www/.config
sudo chown www-data /var/www/.config

【讨论】:

谢谢,我认为这是最好的解决方案。作为 Ubuntu 18.04 和 LibreOffice 6.3.1 下的 www-data 用户,它对我有用。【参考方案7】:

我能够通过先删除文件然后运行转换文件来解决这个问题。由于文件所有者问题,文件的覆盖似乎失败。

【讨论】:

【参考方案8】:

对我来说,这是由于不可写的输出文件夹。使用--outdir 并指定一个可写文件夹。

如果输出文件已经存在,会自动覆盖。

例子:

$ libreoffice --headless --convert-to pdf --outdir myfolder/ myfile.docx

【讨论】:

以上是关于Libreoffice --headless 拒绝转换,除非是 root,不能在 PHP 脚本中工作的主要内容,如果未能解决你的问题,请参考以下文章

Html to pdf with libreoffice headless 不显示图像

使用 --headless --convert-to 标志使用 libreoffice 将 .doc(x) 转换为 PDF/A-1a 格式

在 Web 服务器上使用 LibreOffice(无头)是不是安全?

centos7下安装LibreOffice

Apache/PHP + LibreOffice

libreOffice 命令行宏不返回输出或错误