我正在使用 wkhtmltopdf 和 django-wkhtmltopdf 包装器来创建模板的 .pdf。
我正在使用 django-wkhtmltopdf 文档中的示例(尽管我最终想要的不仅仅是静态模板):
url(r'^pipeline/snapshot/$', PDFTemplateView.as_view(
template_name='pdf/pipeline_snapshot.html',
filename='my_pdf.pdf'), name='pdf'),
我得到了错误:
Traceback:
File "/home/pluscitizen/webapps/odin/lib/python2.7/django/core/handlers/base.py" in get_response
140. response = response.render()
File "/home/pluscitizen/webapps/odin/lib/python2.7/django/template/response.py" in render
105. self.content = self.rendered_content
File "/home/pluscitizen/webapps/odin/lib/python2.7/django_wkhtmltopdf-1.2.2-py2.7.egg/wkhtmltopdf/views.py" in rendered_content
144. footer_filename=footer_filename)
File "/home/pluscitizen/webapps/odin/lib/python2.7/django_wkhtmltopdf-1.2.2-py2.7.egg/wkhtmltopdf/views.py" in convert_to_pdf
103. return wkhtmltopdf(pages=[filename], **cmd_options)
File "/home/pluscitizen/webapps/odin/lib/python2.7/django_wkhtmltopdf-1.2.2-py2.7.egg/wkhtmltopdf/utils.py" in wkhtmltopdf
92. return check_output(ck_args, **ck_kwargs)
File "/usr/local/lib/python2.7/subprocess.py" in check_output
575. raise CalledProcessError(retcode, cmd, output=output)
Exception Type: CalledProcessError at /pipeline/snapshot/
Exception Value: Command '['wkhtmltopdf', '--encoding', u'utf8', '--quiet', '/tmp/wkhtmltopdfVaAKrX.html', '-']' returned non-zero exit status 127
但是,当我从 Django shell 使用相同的文件运行相同的命令时
>>> subprocess.check_output(['wkhtmltopdf', '--encoding', u'utf8', '--quiet', '/tmp/wkhtmltopdfSGFfYh.html', '-'])
一切运行良好。同上:
>>> wkhtmltopdf(['/tmp/wkhtmltopdfSGFfYh.html'], **{})
因此,考虑到差异必须在整个 shell 情况下,我尝试在 django-wkhtmltopdf 中对子进程的调用添加 shell=True (我知道这是一个安全问题),但没有运气。可能是因为我不知道到底发生了什么。
我看到某处说这个问题可能与 PATH 设置不正确有关,但是我不明白为什么 Django 的 shell 没有这个问题。
整个过程非常繁重,现在我已经很接近了,我终于转向 SO 寻求答案。
编辑:我试过直接在视图中运行子进程,它返回相同的错误,我猜这意味着外壳和服务器不一定都在同一个环境中运行?
已解决:已解决,火花的答案引导我上路。我决定查看服务器上 django 应用程序输出的日志(duh),并注意到在回溯之前,我得到了命令的实际输出:
wkhtmltopdf: error while loading shared libraries: libwkhtmltox.so.0: cannot open shared object file: No such file or directory
这似乎意味着它没有找到我在 /home/user/lib 中的库。当我将这些显式添加到 settings.py 中的 WKHTMLTOPDF_ENV 变量时,一切正常。