当前位置: 首页 > 知识库问答 >
问题:

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

冀崇凛
2023-03-14

使用debian 9.5、Python3.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-

问题如下:使用subprocess.run从python执行的相同外部命令生成的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-

完成进程(args='/usr/bin/libreoffice-----------------------------------------------------------------------------------------------------------

显然,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-

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

关于如何指定thorugh命令行参数,libreoffice可以在其中找到它所需要的java运行时环境,有什么想法吗?

共有2个答案

洪捷
2023-03-14

另外,对于遇到此问题的其他人,您会收到错误消息的原因是,由子进程使用并传递给libreoffice的path变量不足以找到jre。我遇到了同样的问题,并将其更改为以下内容,似乎可以解决它。

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

呼延升
2023-03-14

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

这项工作(使用libreoffice of 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

这不起作用(使用带图表的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

pythonvirtualenv似乎与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
 类似资料:
  • 我想用apache poi转换一个docx到pdf,docx是用Docx4j正确生成的。对于简单的文档,转换很好,但是当我想转换一个更风格化的文档时,POI抛出了一个异常: org.apache.xmlbeans.impl.values.xmlvalueOutoFrangeException:union value'0000ff“>http://schemas.openxmlformats.org

  • 我有一个演示中嵌入了一个视频。我想将此演示文稿导出为PDF格式,其中包含视频。现在,不是一个视频,而是一个带有问号的图像。这段视频从演示文稿中看得很好。

  • 我花了大量的时间试图确定到底出了什么问题,使用LibreOffice将pdf转换为docx(以及doc转换为docx)的代码。 我使用了两个windows run接口来测试运行一些我发现相关的代码,也尝试了python,但两者都不起作用。 我在Windows上安装了LibreOffice v6.0.2。 我一直在使用此代码的变体尝试将某些pdf文件转换为与特定pdf文件不相关的docx: 我已经在

  • 我试图生成一个. docx从超文本标记语言字符串与docx4j在Java,其中包含Base64图像里面。目前,我能够生成Word并下载它(在一个Vaadin项目内),但图像没有正确插入。但是,如果我把超文本标记语言代码放入index.html页面,它们确实显示正确! 我使用的代码是这样的: 有没有什么特别的工作应该做,而我没有做? 编辑: 我现在可以插入图片了!用以下代码替换行下方和行上方的代码:

  • 这段代码第一次可以运行得很好,但是当我第二次运行app时,它不会立即生成PDF文件。

  • 我正在创建包含表格和图像的pdf。问题是我可以在第一页看到图像,但在第二页看不到。 > 使用