使用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命令行参数的任何想法?
答案 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