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 シェルから同じファイルを使用して同じコマンドを実行すると、
>>> subprocess.check_output(['wkhtmltopdf', '--encoding', u'utf8', '--quiet', '/tmp/wkhtmltopdfSGFfYh.html', '-'])
すべてがうまくいきます。同様に:
>>> wkhtmltopdf(['/tmp/wkhtmltopdfSGFfYh.html'], **{})
したがって、違いはシェル全体の状況にあるに違いないと考えて、django-wkhtmltopdf 内のサブプロセスへの呼び出しに shell=True を追加しようとしましたが (セキュリティ上の問題であることはわかっています)、うまくいきませんでした。おそらく、実際に何が起こっているのか分からないからです。
問題は PATH が適切に設定されていないことに関係している可能性があるとどこかで見ましたが、Django のシェルがこれに問題を抱えていない理由がわかりません。
このプロセス全体は信じられないほど負担がかかりました。私は非常に近づいているので、最終的に SO に答えを求めています.
編集:サブプロセスをビューで直接実行しようとしましたが、同じエラーが返されました。これは、シェルとサーバーの両方が必ずしも同じ環境から実行されているとは限らないことを意味していると思いますか?
FIXED : 解決し、火花による答えが私を導いてくれました。サーバー上の 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 変数に明示的に追加すると、すべて問題なく動作しました。