2

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 変数に明示的に追加すると、すべて問題なく動作しました。

4

2 に答える 2

1

終了ステータス 127

これは、実行しようとしているコマンドが見つからないことを意味します。プロセスの環境のエラーです。

Python で sys.path の内容を見て、それを PATH 環境変数と比較するか、django コンソールで sys.path と比較することをお勧めします。

于 2013-10-17T19:51:17.573 に答える
0

具体的には、これを settings.py に追加します。

WKHTMLTOPDF_ENV = {'FONTCONFIG_PATH': '/etc/fonts'}

于 2015-12-01T08:22:19.807 に答える