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 格式