web-dev-qa-db-ja.com

Dashで記述されたWebサイトを静的PDF(Python)として表示するにはどうすればよいですか?

ダッシュで作成したサイトを静的PDFにエクスポートしたい。これが私のサイトのコードです(3つの列がある単なるグラフです)。

import dash
import dash_core_components as dcc
import dash_html_components as html
import pdfkit
from flask import Flask, render_template, make_response

app = dash.Dash()
app.layout = html.Div(
                className="three columns",
                children=html.Div([
                    dcc.Graph(
                        id='right-top-graph',
                        figure={
                            'data': [{
                                'x': [1, 2, 3],
                                'y': [3, 1, 2],
                                'type': 'bar'
                            }],
                            'layout': {
                                'height': 400,
                                'margin': {'l': 10, 'b': 20, 't': 0, 'r': 0}
                            }
                        }
                    ),


                ])
            )

app.css.append_css({
    'external_url': 'https://codepen.io/chriddyp/pen/bWLwgP.css'
})

if __name__ == '__main__':
    app.run_server(debug=True)

このコードをスクリプトに追加してpdfkitを使用しようとしましたが、機能しませんでした(render_template()が1つの位置引数を取るが、2つが指定されていることを示すエラーを受け取りました)。

rendered = render_template('pdf_template.html',app)
pdf = pdfkit.from_string(rendered, False)
response = make_response(pdf)
response.headers['Content-Type'] = 'application/pdf'
response.headers['Content-Disposition'] = 'attachment; filename=output.pdf'

ダッシュサイトをPDFに変換する方法について誰かが知っていますか?

前もって感謝します。

8
semiflex

使用しているブラウザの印刷機能(通常はcontrol + p)を使用して、次のように保存できますPDF探しているものが静的な場合PDF =ファイル。

より拡張された機能が必要な場合は、ダッシュ examples の1つにあるようなprint to PDFボタンを追加できます。 jsファイルを使用してブラウザーの印刷機能を呼び出します。詳細は 詳細 を参照してください。このように、CSSを使用してPDF出力の外観を定義することもできます。

pythonファイルを使用して直接PDFを生成する場合の問題は、ダッシュがレイアウトツリーのJSON表現を作成するだけであり、それがブラウザー自体にアセンブルされることです more を参照してください。

2
Sam

pdfkit は次のように使用できます。

import pdfkit
pdfkit.from_url('http://local.dash.site', 'out.pdf')

投稿したものとの大きな違いは、ローカルWebサーバーを使用してページをレンダリングできることです。

別の方法として、 https://wkhtmltopdf.org/ を使用することもできます。これはpdfkitの下のlibです。

2
AlphaTested

次のリンクの指示に従ってPDFを作成できます。 http://flask.pocoo.org/snippets/68/

render_templateは1つの位置引数のみを受け入れ、残りはkeyword引数でなければなりません。

1
Lea

render_templateは、位置引数を1つだけ受け取ります。以下をお試しいただけますか?

options = {
        'margin-top': '0.15in',
        'margin-right': '0.15in',
        'margin-bottom': '0.2in',
        'margin-left': '0.15in',
        'encoding': "UTF-8",
 }
css = 'path to your .css file'
html = render_template('a_html.html')
pdf = pdfkit.from_string(html, False, options=options, css=css)
1
Jessi

次の方法でスクリプトを実行してみましたか(ダッシュサイトがレンダリングされる場所にスクリプトのpdf作成部分を貼り付けたところです)。

import dash
import dash_core_components as dcc
import dash_html_components as html
import pdfkit
from flask import Flask, render_template, make_response

app = dash.Dash()
app.layout = html.Div(
                className="three columns",
                children=html.Div([
                    dcc.Graph(
                        id='right-top-graph',
                        figure={
                            'data': [{
                                'x': [1, 2, 3],
                                'y': [3, 1, 2],
                                'type': 'bar'
                            }],
                            'layout': {
                                'height': 400,
                                'margin': {'l': 10, 'b': 20, 't': 0, 'r': 0}
                            }
                        }
                    ),


                ])
            )

app.css.append_css({
    'external_url': 'https://codepen.io/chriddyp/pen/bWLwgP.css'
})

rendered = render_template('pdf_template.html',app)
pdf = pdfkit.from_string(rendered, False)
response = make_response(pdf)
response.headers['Content-Type'] = 'application/pdf'
response.headers['Content-Disposition'] = 'attachment; filename=output.pdf'



if __name__ == '__main__':
    app.run_server(debug=True)
0
Mansel