Как отобразить веб-сайт, написанный на Dash, в виде статического PDF (Python)? - PullRequest
0 голосов
/ 15 октября 2018

Я хочу экспортировать созданный мною сайт в статический 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?

Заранее спасибо.

Ответы [ 5 ]

0 голосов
/ 24 октября 2018

Вы можете использовать pdfkit следующим образом:

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

Большое отличие от того, что вы опубликовали, заключается в том, что вы можете использовать локальный веб-сервер для отображения страницы.

В качестве альтернативы вы также можете использовать https://wkhtmltopdf.org/ Это библиотека под pdfkit.

0 голосов
/ 24 октября 2018

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)
0 голосов
/ 18 октября 2018

Вы можете использовать функцию печати любого браузера, который вы используете (обычно control + p) и сохранить его в формате PDF, если все, что вам нужно, - это статический файл PDF.

Если вам нужна более расширенная функциональность, вы можете добавить кнопку print в PDF , например, одну из черточек examples .Он использует файл js для вызова функции печати браузера, см. подробнее .Таким образом, вы также можете использовать CSS для определения того, как будет выглядеть вывод PDF

Проблема с использованием файла python для генерации pdf напрямую заключается в том, что dash создает только JSON-представление дерева макетов, которое затем собирается вСам браузер, см. Подробнее .

0 голосов
/ 20 октября 2018

Вы можете использовать указания из следующей ссылки для создания pdf: http://flask.pocoo.org/snippets/68/

render_template принимает только один позиционный аргумент, остальные должны быть ключевое слово аргументы.

0 голосов
/ 15 октября 2018

Вы пытались запустить ваш скрипт следующим образом (я только что вставил часть создания вашего 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)
...