如何将以Dash编写的网站显示为静态PDF(Python)?

时间:2018-10-15 15:40:26

标签: python flask plotly plotly-dash

我想将用破折号制作的网站导出为静态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添加到脚本中来使用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有任何想法吗?

谢谢。

5 个答案:

答案 0 :(得分:2)

您可以通过以下方式使用pdfkit

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

与您发布的内容最大的不同是,您可以使用本地Web服务器来呈现页面。

您也可以使用https://wkhtmltopdf.org/ 这是pdfkit下的lib。

答案 1 :(得分:1)

您是否尝试过以以下方式运行脚本(我刚刚将脚本的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)

答案 2 :(得分:1)

您可以使用任何浏览器的打印功能(通常是control + p),如果您要查找的是静态PDF文件,则可以将其保存为PDF。

如果您想要更多增强的功能,则可以将打印添加到PDF 按钮,如破折号examples之一。它使用js文件调用浏览器打印功能,请参见more detail。这样,您还可以使用CSS定义PDF输出的外观

使用python文件直接生成pdf的问题是,破折号仅创建布局树的JSON表示,然后将其组装在浏览器中,请参见more

答案 3 :(得分:1)

您可以使用以下链接中的说明来创建pdf: http://flask.pocoo.org/snippets/68/

render_template仅接受一个位置参数,其余参数必须为关键字参数。

答案 4 :(得分:1)

render_template仅接受一个位置参数。 您可以在下面尝试吗?

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)