在docker容器中,我试图使用LibreOffice将XLSX文件转换为PDF。相关的命令在命令行上工作,但从R调用时失败,并显示“应用程序错误”。我使用这个Dockerfile
,它添加了一些(在我的经验中是任意的)XLSX文件:
FROM rocker/r-ver:3.4.3
RUN apt-get update \
&& apt-get install --yes --no-install-recommends \
default-jre-headless libreoffice-calc \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/* \
&& echo /usr/lib/libreoffice/program > /etc/ld.so.conf.d/libreoffice.conf \
&& ldconfig
COPY foo.xlsx /tmp
(The ldconfig
的技巧来自shared library issue with the system function in R。)
在命令行中,我可以将XLSX文件转换为PDF:
root@b395caeba33b:/# loffice --headless --convert-to pdf /tmp/foo.xlsx
convert /tmp/foo.xlsx -> //foo.pdf using filter : calc_pdf_Export
然而,这在R中失败了:
> system("loffice --version")
LibreOffice 5.2.7.2 20m0(Build:2)
> system("loffice --headless --convert-to pdf /tmp/foo.xlsx")
convert /tmp/foo.xlsx -> //foo.pdf using filter : calc_pdf_Export
Application Error
如果我将基础镜像从rocker/r-ver:3.4.3
更改为rocker/r-base
,使用R 3.4.4和Debian testing/sid,结果只会有轻微的变化:
> system("loffice --version")
LibreOffice 6.0.2.1.0 00m0(Build:1)
> system("loffice --headless --convert-to pdf /tmp/foo.xlsx")
Application Error
如何让LibreOffice在从R调用时将XLSX文件转换为PDF?
3条答案
按热度按时间raogr8fs1#
这个问题是因为环境的差异。通过
system
运行env
命令时你可以看到默认的
R
有一组环境变量,其中一个是LD_LIBRARY_PATH
。把它清空就行了。它在bash中工作的原因是因为默认环境变量集很小
另外,当您从bash启动
r
而不是R
时在使用
r -i
从bash启动的交互式shell中在您的案例中,是从父进程继承的子进程环境导致了问题
ldioqlga2#
我已经找到了一个变通办法,但我仍然对一个适当的解释感兴趣。以下是我的发现:
--security-opt seccomp:unconfined
启动Docker容器并安装strace
。R
调用内libsal_textenclo.so
时出错。奇怪的是,它在/usr/lib/x86_64-linux-gnu
中搜索库,即使ldconfig
知道在哪里可以找到它:LD_LIBRARY_PATH
设置为包含/usr/lib/libreoffice/program
并不能解决问题。LD_LIBRARY_PATH
:v09wglhw3#
我的问题是安装
libreoffice-impress-nogui
而不是libreoffice-impress
。在我安装了GUI版本之后,一切--无头的开始工作得很好。