代码之家  ›  专栏  ›  技术社区  ›  mrtexaz

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

  •  0
  • mrtexaz  · 技术社区  · 7 年前

    使用debian 9.5、python 3.5、libreoffice 5.2、x86 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_导出

    问题是:使用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_导出

    完成进程(args='/usr/bin/libreoffice--headless--convert to pdf--outdir/tmp/docx5//tmp/docx5/output.docx',返回代码=0)

    显然,PDF生成是成功的,但只转换了docx文件的第一页。

    当从python开始的libreoffice遇到第一个图表时,PDF的生成似乎终止了。

    LyBrice是否需要Java运行时来生成PDF?

    libreoffice的无头操作会有问题吗?

    有什么暗示吗?

    更新:

    添加了“env:userinstallation”选项,当从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:找不到Java运行时环境!

    警告:无法从javaldx读取路径

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

    完成进程(args='/usr/bin/libreoffice -env:userinstallation=file:///home/marco/--headless--convert to pdf--outdir/tmp/docx5//tmp/docx5/output.docx',returncode=0)

    关于如何指定Suruh命令行参数,LeBrice可以找到它需要的Java运行时环境的任何想法?

    1 回复  |  直到 7 年前
        1
  •  0
  •   mrtexaz    7 年前

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

    这作品 (使用带图表的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产生了某种冲突。我用了吸管,但没有发现有用的。

    因此,我的解决方案是在从python调用libreoffice时从path环境变量中删除virtualenv path,这可以通过停用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