Django项目调用外部程序soffice报错subprocess.CalledProcessError: Command 'soffice --headless --convert-to pdf

1、今天,在Linux上通过libreoffice调用外部程序把docx文档转换为pdf的时候,报了一个错:

[Java framework] Error in function createSettingsDocument (elements.cxx).
javaldx failed!
Warning: failed to read path from javaldx

Command 'soffice --headless --invisible --convert-to pdf /usr/local/测试.docx --outdir /usr/local/ ' returned non-zero exit status 77.

2、首先呢,我是先通过教程在Linux上安装好libreoffice,这一步可以省略不看,主要是记录安装过程:

cenos服务器执行以下命令安装libreoffice
[root@CentOS~]# yum install libreoffice 
[root@CentOS~]# yum install libreoffice-headless 
[root@CentOS~]# mkdir /usr/share/fonts/simsun 
##拷贝windows中的simsun.ttc到/usr/share/fonts/simsun/
 然后执行以下命令
[root@CentOS~]#cd /usr/share/fonts/simsun 

[root@CentOS~]#mkfontscale 
[root@CentOS~]#mkfontdir 
[root@CentOS~]#fc-cache -fv

3、其中,django项目通过wsgi关联部署到apache中,其中apache安装后默认是使用daemon用户和用户组的,在/usr/local/apache/conf底下的httpd.conf底下配置了daemon用户和用户组,具体我是参考这篇文章的:https://blog.csdn.net/yufen9987/article/details/76718290 ,其中我把底下的apcache_django_wsgi_conf的用户和用户组改为daemon,之后Django项目在授予daemon权限,利用命令:

 chown -R daemon:daemon demand_jango

4、之后通过代码调用soffice外部程序,执行命令,把docx转换为pdf的时候,就报了第一点的提出的错误,原因就是因为daemon(守护精灵这个用户)没有权限执行调用soffice这个外部程序,在linux底下这个daemon是没有对应的权限去执行这个soffice外部程序的,而且也没有对应的用户目录。

5、解决办法如下:

(1)、首先,停掉apache服务,通过命令service httpd stop

(2)、接着,新增多一个用户和用户组,使用以下命令:

groupadd apache
useradd -s /sbin/nologin -g apache apache
usermod -L apache

chown -R apache:apache /home/apache

(3)、接着修改apache的配置文件,/usr/local/apache/conf底下的httpd.conf:

User apache
Group apache

(4)、接着修改apcache_django_wsgi_conf的用户和用户组,改为apache:

WSGIDaemonProcess demand_jango python-path=/usr/lib64/python2.7/site-packages user=apache group=apache

(5)、接着在授予项目apache权限:

 chown -R apache:apache demand_jango

(6)、启动apache服务器,使用命令:service httpd start

注:其中的话,如果这个apache部署多个项目的话,记得另外一个项目的apcache_django_wsgi_conf也要改成apache。

6、重启之后,可以会出现一种情况,就是apache跑着跑着就超时,访问不了了,主要报错信息:

Timeout when reading response headers from daemon process 'demand_jango'

Resource temporarily unavailable: [client 112.134.52.134:356] mod_wsgi (pid=4589): Unable to connect to WSGI daemon process

原因:在Linux新建的一个用户的话,会默认限制访问的进程数,一般几分钟之后,就超过了进程数,就会一直刷刷刷,访问就失败超时,root用户是不做限制的

解决: 

(1)、使用root用户登陆,进入到/etc/security/limits.d/,并编辑20-nproc.conf,使用命令如下:

cd /etc/security/limits.d/
vi 20-nproc.conf

增加多一行信息,指定新建的用户限制的信息:

apache     soft    nproc     60000

(2)、编辑  /etc/security/limits.conf,使用vi命令打开这个文件,并增加内容:

apache soft nofile 65535
apache hard nofile 65535

之后,重启服务器就可以了,具体可以看参考文章,比较详细,参考文章如下:https://blog.csdn.net/qq_35963057/article/details/81489907

发布了276 篇原创文章 · 获赞 200 · 访问量 72万+

猜你喜欢

转载自blog.csdn.net/u012561176/article/details/90266631
今日推荐