3

wkhtmltopdf を使用して PDF ファイルを作成していますが、適切に返す方法がわからないため、メディア フォルダーに書き込み、作成したばかりのファイルにリダイレクトする必要がありました。

編集: Ian のアドバイスは、STDOUT に書き込むことです。そのため、wkhtmltopdf コマンドを変更してそれを実行しましたが、そのコンテンツを返す方法がわかりません。

私はこの方法で subprocess.Popen を使用しようとしています:

r = HttpResponse(Popen(command_args), mimetype='application/pdf')
r['Content-Disposition'] = 'filename=recibos.pdf'
return r

しかし、私は良い結果を得ていません よろしくお願いします。

4

4 に答える 4

4

次のようにサブコマンドを開く必要があります。

popen = Popen(command_args, stdout=PIPE, stderr=PIPE)
body_contents = popen.stdout().read()
popen.terminate()
popen.wait()
r = HttpResponse(body_contents, mimetype='application/pdf')

注意すべき点:

  1. popen したコマンドが STDERR に書き込むと、デッドロックする可能性があります。これは、Popen オブジェクトで communicate() 関数を使用することで解決できます。
  2. 最終的にこれを試して、terminate() と wait() が常に確実に行われるようにする必要があります。
  3. これにより、PDF 全体が Python プロセスのメモリに読み込まれます。コマンドから送信ソケットにバイトをストリーミングすることができます。
于 2011-02-21T17:52:52.747 に答える
1

PHP で .PDF 応答を生成しただけなので、決定的なことはできませんが、基本的な考え方は同じです。

1) 他のタイプのページを返す場合と同様に、pdf ファイルをファイル システムではなく STDOUT に書き込みます。

2) 正しい MIME タイプとヘッダーで送信します。これらはおそらく次のとおりです。

Content-Disposition: インライン; filename="MyReportFile.pdf" コンテンツ タイプ: application/pdf

必要な動作を得るには、Chache-Control および Expires ヘッダーも確認する必要がある場合があります。

于 2011-02-15T23:06:17.887 に答える
0

PDFをDjango HttpResponseとして返したいだけの場合:

from django.http import HttpResponse

def printTestPdf(request):
  return printPdf('/path/to/theFile.pdf')

def printPdf(path):
  with open(path, "rb") as f:
    data = f.read()
  return HttpResponse(data, mimetype='application/pdf')
于 2011-11-25T17:25:22.813 に答える
0

どうやって返してほしいですか?

それらを添付ファイルとして使用する場合は、次を試すことができます。

fname = #something here to give dynamic file names from your variables
response = HttpResponse(mimetype='application/pdf')
response['Content-Disposition'] = 'attachment; filename='+fname
return response

ブラウザーで pdf を開く方法についての答えがあればよかったのですが、これは少し前に行ったプロジェクトのスニペットであり、詳細の一部を忘れてしまいました。

于 2011-02-22T20:44:31.777 に答える