从带有图表的 docx python 调用 libreoffice 生成 pdf 时出现问题

issue when calling libreoffice for pdf generation from python of docx with charts

使用 debian 9.5、python 3.5、libreoffice 5.2、x86_64 arch.

我有一个 22 页的 word 文件 (docx),其中包含几个图表。

当 运行 从终端使用 bash 时,以下命令正常工作,即生成 22 页的 pdf 文件:

/usr/bin/libreoffice --headless --convert-to pdf --outdir /tmp/docx5/ /tmp/docx5/output.docx

输出:

convert /tmp/docx5/output.docx -> /tmp/docx5//output.pdf using filter : writer_pdf_Export

问题如下:使用 subprocess.run 从 python 执行的相同外部命令生成只有一页的 pdf 文件,而不是 22 页,没有错误消息。

没有其他 libreoffice 实例 运行ning。

cmd = '/usr/bin/libreoffice --headless --convert-to pdf --outdir /tmp/docx5/ /tmp/docx5/output.docx'

print(subprocess.run(cmd, shell=True, check=True))

这是这个 python 脚本的输出:

convert /tmp/docx5/output.docx -> /tmp/docx5//output.pdf using filter : writer_pdf_Export

CompletedProcess(args='/usr/bin/libreoffice --headless --convert-to pdf --outdir /tmp/docx5/ /tmp/docx5/output.docx', returncode=0)

貌似pdf生成成功了,但是只转换了docx文件的第一页。

当从 python 开始的 libreoffice 遇到第一个图表时,pdf 的生成似乎终止。

libreoffice 是否需要java运行时间来生成 pdf?

libreoffice 的无头操作会不会有问题?

有什么提示吗?

更新:

添加了 'env:UserInstallation' 选项,当 运行ning 从 python 修改后的脚本时:

cmd = '/usr/bin/libreoffice -env:UserInstallation=file:///home/marco/  --headless --convert-to pdf --outdir /tmp/docx5/ /tmp/docx5/output.docx'

print(subprocess.run(cmd, shell=True, check=True))

输出如下,现在它包含一个关于找不到java运行时间环境的警告:

javaldx: Could not find a Java Runtime Environment!

Warning: failed to read path from javaldx

convert /tmp/docx5/output.docx -> /tmp/docx5//output.pdf using filter : writer_pdf_Export

CompletedProcess(args='/usr/bin/libreoffice -env:UserInstallation=file:///home/marco/ --headless --convert-to pdf --outdir /tmp/docx5/ /tmp/docx5/output.docx', returncode=0)

关于如何指定 libreoffice 可以找到它需要的 java 运行time 环境的完整命令行参数的任何想法?

我找到了解决办法,虽然我不清楚技术原因:

这个作品(使用 libreoffice 的 docx 文件和图表完成 pdf 生成):

PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/usr/lib/jvm/java-10-oracle/bin:/usr/lib/jvm/java-10-oracle/db/bin /usr/bin/libreoffice -env:UserInstallation=file:///tmp/docx5/ --headless --convert-to pdf --outdir /tmp/docx5/ /tmp/docx5/output.docx

这行不通(使用带有图表的 libreoffice 的 docx 文件生成部分 pdf):

PATH=/home/marco/venv/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/usr/lib/jvm/java-10-oracle/bin:/usr/lib/jvm/java-10-oracle/db/bin /usr/bin/libreoffice -env:UserInstallation=file:///tmp/docx5/ --headless --convert-to pdf --outdir /tmp/docx5/ /tmp/docx5/output.docx

似乎 python virtualenv 与 libreoffice 发生了某种冲突。我使用了 strace 但没有发现任何有用的东西。

所以我的解决方案是在从 python 调用 libreoffice 时从 PATH 环境变量中删除 virtualenv 路径,这可以通过停用 virtualenv 来实现:

marco@pc:~$ source venv/bin/activate
...
(venv) marco@pc:~$ deactivate && /usr/bin/libreoffice -env:UserInstallation=file:///tmp/docx5/ --headless --convert-to pdf --outdir /tmp/docx5/ /tmp/docx5/output.docx

为遇到此问题的任何其他人添加此内容,您收到错误消息的原因是子进程使用并传递给 libreoffice 的路径变量不足以找到 jre。我 运行 遇到了同样的问题,并将其更改为以下似乎已解决的问题。

subprocess.run(cmd,env={'HOME':'/home/username'})