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

时间:2019-01-07 16:44:22

标签: python pdf virtualenv libreoffice

使用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

输出:

  

使用过滤器转换/tmp/docx5/output.docx-> /tmp/docx5//output.pdf   :writer_pdf_Export

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

没有其他的libreoffice实例在运行。

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

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

这是此python脚本的输出:

  

使用过滤器转换/tmp/docx5/output.docx-> /tmp/docx5//output.pdf   :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的无头操作会出现问题吗?

有任何提示吗?

更新

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

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:找不到Java运行时环境!

     

警告:无法从javaldx读取路径

     

使用过滤器转换/tmp/docx5/output.docx-> /tmp/docx5//output.pdf   :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运行时环境的地方指定thorugh命令行参数的任何想法?

1 个答案:

答案 0 :(得分:0)

我找到了解决方案,尽管我不清楚技术原因:

此工作(使用带有图表的docx文件的libreoffice完整的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

这不起作用(使用带有图表的docx文件的libreoffice生成部分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