从带有图表的 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'})
使用 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'})