【问题标题】:issue when calling libreoffice for pdf generation from python of docx with charts使用图表从 docx 的 python 调用 libreoffice 生成 pdf 时出现问题
【发布时间】:2019-06-02 08:34:58
【问题描述】:

使用 debian 9.5、python 3.5、libreoffice 5.2、x86_64 架构。

我有一个 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

问题如下:使用 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 -> /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 运行时环境吗?

【问题讨论】:

    标签: python pdf virtualenv libreoffice


    【解决方案1】:

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

    此作品(使用带有图表的 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
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2016-02-04
        • 2023-03-22
        • 1970-01-01
        • 2018-09-19
        • 2015-03-06
        • 2020-10-07
        • 1970-01-01
        • 2011-11-17
        • 2015-07-19
        相关资源
        最近更新 更多