我正在尝试使用 Perl CGI (Mason) 将 xlsx 文件转换为 pdf。
由于我没有找到使用纯 perl 转换文件的方法,因此我使用它soffice
来执行这项工作。
在我通过浏览器执行此操作之前,这一切正常。
负责转换的代码非常简单:
my @cmd = ( "soffice", "--headless", "--convert-to", "pdf", $filename );
system(@cmd);
当由普通用户运行时,这在命令行上运行良好,但以 Apache 用户(Apache 上的 Mason)运行它,会抛出错误:
(process:14954): dconf-CRITICAL **: 14:28:42.846: unable to create directory '/usr/share/httpd/.cache/dconf': Permission denied. dconf will not work properly.
有人能指出我正确的方向吗?
有没有办法仅使用 perl 而不是系统命令将 xlsx 转换为 pdf?
编辑
为了传递dconf
错误,我手动创建了它所抱怨的目录树并将其 chowned 给 apache 用户,但是,出现了下一个错误:
[Java framework] Error in function createSettingsDocument (elements.cxx).
javaldx failed!
Warning: failed to read path from javaldx
如果我尝试也是如此unoconv
:
Error: Unable to connect or start own listener. Aborting.
解决方案
unoconv --listener
在操作之前手动启动,可以解决我的问题。正在创建 PDF 文件。
答案1
您收到此错误是因为 Apache 运行的用户与在命令行上运行此脚本的用户不同。这些天我不会使用 CGI。我将设置 Mason 与 FastCGI 一起运行。天哪,我什至会放弃 Apache 并使用 NGINX。要解决这个问题,你要么必须
- 使该目录归同一用户所有,或者可由运行 Apache 的用户写入。 Apache 产生 CGI 进程,因此它具有与运行脚本的用户不同的权限。查看文件
/etc/apache2/envvars
并检查变量APACHE_RUN_GROUP
和APACHE_RUN_USER
- 使用苏执行
答案2
unoconv --listener
在操作之前手动启动,可以解决我的问题。正在创建 PDF 文件。