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

Posted

技术标签:

【中文标题】如何将用 Dash 编写的网站显示为静态 PDF (Python)?【英文标题】:How do I display a website written in Dash as a static PDF (Python)? 【发布时间】:2019-03-20 02:09:24 【问题描述】:

我想将我在 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,但它不起作用(收到一个错误,告诉我 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 吗?

提前致谢。

【问题讨论】:

render_template 只接受一个位置参数。 【参考方案1】:

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

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

使用 python 文件直接生成 pdf 的问题在于,dash 仅创建布局树的 JSON 表示,然后在浏览器本身中组装,请参阅more。

【讨论】:

【参考方案2】:

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

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

与您发布的最大区别在于您可以使用本地 Web 服务器来呈现页面。

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

【讨论】:

我收到回溯错误和以下消息:“信息:找不到给定模式的文件。”它似乎正在搜索 wkhtmltopdf 可执行文件。会调查这是哪里。【参考方案3】:

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

render_template 只接受一个位置参数,其余的必须是 keyword 参数。

【讨论】:

【参考方案4】:

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)

【讨论】:

我得到一个属性错误:AttributeError: 'NoneType' object has no attribute 'app'【参考方案5】:

您是否尝试过按以下方式运行脚本(我刚刚将脚本的 pdf 创建部分粘贴到了 dash 站点的呈现位置):

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)

【讨论】:

是的,我试过了。我收到以下错误:render_template() 接受 1 个位置参数,但给出了 2 个。我认为这不是正确的方法,因为我发现的 pdf 渲染器仅适用于 html 对象,并且我目前有一个破折号对象

以上是关于如何将用 Dash 编写的网站显示为静态 PDF (Python)?的主要内容,如果未能解决你的问题,请参考以下文章

如何将用Google表格编写的脚本迁移到VBA中的MS Excel宏?

如何在下载时将单个选定的 PDF 文件合并为一个 PDF?

dash.js 无法一个接一个地播放多个视频

如何将用 python 编写的函数编译为 JavaScript (emscripten)?

60行Python代码编写数据库查询应用

数据可视化Dash图形界面工具——我桥AI三月Python文章Top10之二(附原链接及英文,文末可下载PDF)