初めに
※以下の記事の続きです。未読の場合は先に目を通してください。
【Django】ページをPDF出力する【Python】
前回、Djangoで作成されたWebアプリケーションのページの最も簡単なpdf出力をまとめました。
今回はpdfkitで指定できるオプションを検証します。
環境
名称 | バージョン |
---|---|
Python | 3.10.4 |
Django | 4.0.6 |
pdfkit | 1.0.0 |
書式指定
pdfkitのオプションは辞書型のオブジェクトで設定できます。
そして引数の「options」を指定してオブジェクトを渡します。
前回のpdf出力関数にオプション設定部分を追記しました。
def to_pdf(request):
url = 'http://127.0.0.1:8000/test_app/'
options = {
'page-size': 'A4',
'margin-top': '50',
'margin-right': '50',
'margin-left': '50',
'margin-bottom': '50',
'zoom': '1.0',
'encoding': "UTF-8"
}
pdfkit.from_url(url, 'sample.pdf', options=options)
return redirect('test_app:index')
各設定箇所はキー名で直感的にわかると思うので説明は割愛し、実際に設定が効いているかpdfを出力し確認します。
前回出力時よりmarginが取られているのが確認できました。
cookie
pdfkitのオプションで「cookie」のキーでセッションID等のcookieでやりとりされる値を受け渡しできます。
pdfkit.from_urlは第一引数で指定されたurlにGETでアクセスするので、セッションIDが受け渡されている確認として、
pdf出力ボタンを押下時の自分のセッションIDと、pdfkitがページをpdf出力するリクエストのセッションIDを出力してみます。
その前に、セッションIDを渡さない状態で一度各々のセッションIDを出力します。
pdf出力関数のpdfkit呼び出し前に自分のセッションIDの出力を追記し、pdf出力対象のページにも同様に出力部分を追記します。
def to_pdf(request):
url = 'http://127.0.0.1:8000/test_app/'
options = {
'page-size': 'A4',
'margin-top': '0',
'margin-right': '0',
'margin-left': '0',
'margin-bottom': '0',
'zoom': '1.0',
'encoding': "UTF-8",
}
print('自分のsessionid: ' + str(request.session.session_key)) #セッションID出力部分
pdfkit.from_url(url, 'sample.pdf', options=options)
return redirect('test_app:index')
出力結果は以下のようになりました。
ではpdfkitのオプションの「cookie」にセッションIDを設定します。
def to_pdf(request):
url = 'http://127.0.0.1:8000/test_app/'
cookie_list = request.COOKIES
options = {
'page-size': 'A4',
'margin-top': '0',
'margin-right': '0',
'margin-left': '0',
'margin-bottom': '0',
'zoom': '1.0',
'encoding': "UTF-8",
'cookie': [
('sessionid', cookie_list['sessionid']),
]
}
print('自分のsessionid: ' + str(request.session.session_key))
pdfkit.from_url(url, 'sample.pdf', options=options)
return redirect('test_app:index')
出力結果は以下のようになりました。
pdfkitのリクエストが「cookie」に指定したセッションIDを持っていることを確認できました。
まとめ
今回はpdfkitの「options」での細かい設定の方法を検証しました。
セッションIDの受け渡しは自分とpdfkitでセッションを利用した値受け渡しに繋がってくるので、それはまた別の記事にまとめます。