Life is Really Short, Have Your Life!!

ござ先輩の主に技術的なメモ

Python3.xでPDFを作成してFlaskで出力する

やっぱりwkhtmltopdfを使うのが一番簡単。reportlabとか重すぎる。Linuxで使う場合は日本語対応フォントのインストールをお忘れなく。

wkhtmltopdf

で、wkhtmltopdfのPythonラッパーライブラリがある。


pdfkit 0.5.0 : Python Package Index

$ pip3 install pdfkit

Githubはこちら


JazzCore/python-pdfkit · GitHub

Flaskで使うとこんな感じ

    pdf_title = "日本語ファイル名どんと来い"
    #適当に20件ユーザー取得
    users = User.query.limit(20).all()
    import pdfkit
    
    #Blueprintを使っているのでcuurent_appで取得する
    template = current_app.jinja_env.get_template('pdf/user.html')
    #Falseはファイルを作成しないでストリームにするフラグ
    pdf_buf = pdfkit.from_string(template.render(users=users), False)

    response = make_response(pdf_buf)
    dispostion = "attachment; filename*=UTF-8''"
    #日本語をUrlエンコード
    dispostion += urllib.parse.quote(pdf_title + '.pdf')
    response.headers['Content-Disposition'] = dispostion
    response.mimetype = 'application/pdf'

    return response

ちゃんと文字コードを与えれば日本語ファイル名も文字化けしないよん。