4

我在 CLI 上使用 libreoffice 将一些文档转换为 Django 中的 PDF。

这是在我看来(并且也在模型的保存方法中尝试过):

outdir = '/'.join([settings.MEDIA_ROOT, 'pdf'])
command = ['libreoffice', '--headless', '--convert-to', 'pdf', '-outdir', outdir, form.instance.upload.path]
stdout, stderr = subprocess.Popen(command).communicate()

我还尝试了以下方法来代替subprocess.Popen

os.system("libreoffice --headless --convert-to pdf --outdir %s %s" % (outdir, instance.upload.path))                                                         

然后我检查一下:

# quick check new file exists                                                                                                                                                
with open("%s/%s.pdf" % (outdir, os.path.splitext(instance.upload.name)[0])): pass

当我通过网站运行它们时,它们是行不通的——没有生成 PDF 文件。

问题是:这两种方法都可以在我的本地环境中使用,也可以在调用它们所在的函数时使用$ python manage.py shell

问题仅在生产中。

  • 姜戈 1.4
  • Python 2.7.3
  • 服务器版本:Apache/2.2.22 (Ubuntu) 服务器构建:2012 年 2 月 13 日 01:51:50 (Rackspace)

请注意,我认为我可能遇到了这个错误:Popen 不再适用于 apache/wsgi 和 python 2.7.2?...

尽管格雷厄姆的解决方法如下(我将其添加到我的apache2.conf)似乎并没有改变任何东西。

WSGIApplicationGroup %{GLOBAL}

我的系统管理技能虽然不是很好,我可能做错了,我完全被难住了,任何其他尝试或解决方法的建议或指示将不胜感激。

4

2 回答 2

1

mod_wsgi当从apache2进程中生成时,您的 shell 上没有$PATH定义,因此您应该传递二进制文件subprocess.Popen绝对路径名libreoffice,即/usr/bin/libreoffice,而不仅仅是它的文件名。

于 2012-11-07T19:37:03.557 回答
0

您可以将 LibreOffice / OpenOffice uno 模块导入 Python 并避免使用命令行。我一直在编写一些更完整的文档,您可以从http://documenthacker.wordpress.com/(或者很快www.documenthacker.com)下载这些文档。

食谱部分中有一个将文档转换为 PDF 的示例。

于 2013-03-05T20:52:43.340 回答