web-dev-qa-db-fra.com

Comment afficher un site Web écrit dans Dash comme un statique PDF (Python)?

Je souhaite exporter le site que j'ai créé en tiret dans un PDF statique. Voici le code de mon site (c'est juste un graphique à 3 colonnes):

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)

J'ai essayé d'utiliser pdfkit en ajoutant ce code à mon script, mais cela n'a pas fonctionné (a reçu une erreur me disant que render_template () prend 1 argument positionnel mais 2 ont été donnés):

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'

Quelqu'un a-t-il une idée de la façon de convertir mon site de tableau de bord en PDF?

Merci d'avance.

8
semiflex

Vous pouvez utiliser la fonction d'impression du navigateur que vous utilisez (généralement control + p) et l'enregistrer sous PDF si tout ce que vous recherchez est le statique PDF = fichier.

Si vous voulez plus de fonctionnalités améliorées, vous pouvez ajouter un bouton d'impression au PDF comme celui dans l'un des tirets exemples . Il utilise un fichier js pour appeler la fonctionnalité d'impression du navigateur, voir plus de détails . De cette façon, vous pouvez également utiliser CSS pour définir l'apparence de la sortie PDF

Le problème avec l'utilisation du fichier python pour générer directement le pdf est que le tableau de bord crée uniquement une représentation JSON de l'arborescence de mise en page qui est ensuite assemblée dans le navigateur lui-même, voir plus .

2
Sam

Vous pouvez utiliser pdfkit de la manière suivante:

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

La grande différence avec ce que vous avez publié est que vous pouvez utiliser le serveur Web local pour afficher la page.

Comme alternative, vous pouvez également utiliser https://wkhtmltopdf.org/ Ceci est la bibliothèque sous pdfkit.

2
AlphaTested

Vous pouvez utiliser les instructions du lien suivant pour créer un pdf: http://flask.pocoo.org/snippets/68/

render_template n'accepte qu'un seul argument positionnel, le reste doit être mot-clé arguments.

1
Lea

render_template ne prend qu'un seul argument positionnel. Pouvez-vous essayer ci-dessous?

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

Avez-vous essayé d'exécuter votre script de la manière suivante (je viens de coller la partie de création de pdf de votre script dans l'endroit où le site du tableau de bord est rendu):

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