加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 03:37:21 所属栏目:安全 来源:网络整理
导读:在docker容器内我试图使用LibreOffice将XLSX文件转换为PDF.相关命令在命令行上工作但在从R调用时失败并显示“Application Error”.我使用这个Dockerfile添加一些(根据我的经验任意)XLSX文件: FROM rocker/r-ver:3.4.3RUN apt-get update apt-get install

在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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读