微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

当从R调用时,Libreoffice给出“应用程序错误”

在docker容器内我试图使用LibreOffice将XLSX文件转换为PDF.相关命令在命令行上工作但在从R调用时失败并显示“Application Error”.我使用这个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

(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更改为使用R 3.4.4和Debian testing / sid的rocker / r-base,结果只会略有变化:

> system("loffice --version")
LibreOffice 6.0.2.1.0 00m0(Build:1)

> system("loffice --headless --convert-to pdf /tmp/foo.xlsx")
Application Error

当从R调用时,如何让LibreOffice将XLSX文件转换为PDF?

最佳答案
我找到了一个解决方法,但我仍然对正确的解释感兴趣.这是我发现的:

>使用选项–security-opt seccomp启动docker容器:unconfined并安装strace.
>在R电话中

system("strace -f -o R.trace loffice --headless --convert-to pdf /tmp/foo.xlsx")

>生成的跟踪文件显示加载libsal_textenclo.so时出错.奇怪的是它在/usr/lib / x86_64-linux-gnu中搜索库,即使ldconfig知道在哪里找到它:

root@1519f52c05e0:/# grep libsal R.trace 
257   open("/usr/lib/x86_64-linux-gnu/libsal_textenclo.so",O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
root@1519f52c05e0:/# ldconfig -p | grep libsal
    libsal_textenclo.so (libc6,x86-64) => /usr/lib/libreoffice/program/libsal_textenclo.so

>将LD_LIBRARY_PATH设置为包含/usr/lib / libreoffice / program并不能解决问题.

root@4a235dfa08e3:~# export LD_LIBRARY_PATH=/usr/lib/libreoffice/program
root@4a235dfa08e3:~# Rscript -e 'system("loffice --headless --convert-to pdf /tmp/foo.xlsx")'
Application Error

>我当前的解决方法是在R会话中设置LD_LIBRARY_PATH:

> Sys.setenv(LD_LIBRARY_PATH="/usr/lib/libreoffice/program")
> system("loffice --headless --convert-to pdf /tmp/foo.xlsx")
convert /tmp/foo.xlsx -> //foo.pdf using filter : calc_pdf_Export
Overwriting: //foo.pdf

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐