使用JODConverter转换文档时,需要连接到正在运行的OpenOffice并执行API调用,这需要openoffice创建一个UNO监听器并运行于监听模式下。 下面记叙openoffice以TCP监听模式启动作为后台服务的配置方法。
安装
当前的debian testing官方源已经不再提供openoffice,因为这货被libreoffice替代了。去ooo官方下载 Linux 64-bit(x86-64)(DEB)版本,下载的为tar.gz包,解压后进入en_US/DEBS目录,安装此目录下的所有deb包。
ooo被安装在了/opt/openoffice4目录,可执行程序soffice位于/opt/openoffice4/program目录下。
监听模式启动ooo
1 2 $ unset DISPLAY $ ./soffice -nologo -headless -nofirststartwizard -accept="socket,host=0,port=8100;urp;tcpNoDelay;StarOffice.ServiceManager"
这样ooo在本地所有网络接口地址的TCP 8100端口上启动监听服务。如果只在本地回环地址监听,可以设置host为127.0.0.1或localhost。 服务模式启动时不要设置DISPLAY变量。
libreoffice
ooo自从被收入o记囊中,是一天不如一天了,最近又传闻因为没有活跃的开发者要项目要关闭了。ooo当前最新的4.1.2还是2015年10月发布了,这货是没救了。
libreoffice则开发活跃,如日中天,开源社区真不是哪家公司可以一手遮天的,再大的公司也不行。
其实本篇所述的监听模式启动ooo是完全适用于libreoffice的,因此不必大费周章的安装openoffice,直接官方源安装libreoffice-common和libreoffice-writer即可。soffice bin存在于libreoffice-common包中,同时还需要安装jdk和libreoffice-java-common包。
使用libreoffice时,命令行参数使用双中线开头,不然会有deprecated提示:
1 2 3 4 Warning: -nologo is deprecated. Use --nologo instead. Warning: -headless is deprecated. Use --headless instead. Warning: -nofirststartwizard is deprecated. Use --nofirststartwizard instead. Warning: -accept=socket,host=0 ,port=8100 ;urp;tcpNoDelay;StarOffice.ServiceManager is deprecated. Use --accept=socket,host=0 ,port=8100 ;urp;tcpNoDelay;StarOffice.ServiceManager instead.
注:ooo是openoffice.org曾经的简称,不知道现在为何官方不再使用了。
为libreoffice设置systemd服务 编辑libreoffice.service单元文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 \[Unit\] Description=LibreOffice service After=syslog.target \[Service\] ExecStart=/usr/ bin/soffice --accept="socket,host=0,port=8100;urp;StarOffice.ServiceManager" --headless --nofirststartwizard --nologo --nodefault --nocrashreport --nolockcheck Restart=always KillSignal=SIGQUIT Type=simple StandardError=syslog NotifyAccess=all User=tomcat8 \[Install\] WantedBy=multi-user.target
将编辑好的文件拷贝到/lib/systemd/system文件夹,然后启用该unit文件,最后启动libreoffice服务。
1 2 3 4 5 6 $ sudo cp libreoffice.service /lib/systemd/system/ $ sudo systemctl enable libreoffice.service Created symlink from /etc/systemd/system/multi-user.target.wants/libreoffice.service to /lib/systemd/system/libreoffice.service. $ sudo systemctl start libreoffice $ sudo netstat -anp grep 8100 tcp 0 0 0.0 .0 .0 :8100 0.0 .0 .0 :* LISTEN 9895 /soffice.bin
可以看到libreoffice已经启用了后台服务,并在8100端口进行监听。
update(17/10/2019): debian buster系统: 只安装libreoffice-common和libreoffice-writer包即可,tomcat9的系统用户为tomcat,权限问题参考权限导致soffice(libreoffice/openoffice)无法运行的问题
References: [1]systemd service script for libreoffice/openoffice [2]Libreoffice LSB init script [3]Starting Multiple OpenOffice Instances
=== [erq]