¿Cómo vincular archivos de hojas de estilo a pdfkit en la aplicación Flask?

Estoy intentando crear pdf desde la página html usando pdfkit dentro de la aplicación Flask , pero tengo problemas para cargar los archivos estáticos (hojas de estilo) cuando uso pdfkit .

He tratado de dar un ejemplo mínimo. Tengo esta estructura de archivos

 App |_ static | |- style.css |_ templates | |- base.html |_ pdfs | |- file.pdf |_ application.py 

Dentro de application.py :

 import flask import pdfkit app = flask.Flask(__name__) @app.route('/') def index(): page = flask.render_template('base.html') pdfkit.from_string(page, 'pdfs/file.pdf') return page @app.route('/download', methods=['POST']) def download(): if flask.request.method == 'POST': flask.send_from_directory( directory='pdfs', filename='file.pdf', as_attachment=True) else: flask.redirect(flaks.url_for('index')) if __name__ == '__main__': app.run() 

La hoja de estilo solo agrega un fondo rojo a los elementos td:

 td { background-color: red; } 

Y finalmente la base.html :

        Test App    
    Firstname
    Jill
    Eve

    Lo siento por las cargas de código, pero en realidad es bastante básico. Todo lo que quiero es tener el botón, que una vez que se hace clic, descarga un archivo pdf (este pdf es un archivo html convertido a pdf).

    Funciona, pero la salida de la consola es la siguiente:

     Loading pages (1/6) Warning: Failed to load file:///static/style.css (ignore) Counting pages (2/6) Resolving links (4/6) Loading headers and footers (5/6) Printing pages (6/6) Done 

    El problema

    pdfkit , que básicamente invoca a wkhtmltopdf , no puede encontrar los archivos de la hoja de estilo dentro de static carpeta static . La aplicación, en la que tengo este problema es más robusta, usa boostrap, etc. y tener la salida del PDF mal formateada es muy indeseable.

    Suponiendo que su aplicación tenga el archivo config.py, puede agregar este valor de configuración.

     ABS_PATH_STATIC_FOLDER = "var/www/.." #here is an absolute path to static dir 

    Luego especifique el archivo css por:

     css = os.path.join(app.config['ABS_PATH_STATIC_FOLDER'], 'pdfstyle.css') 

    Esto funcionará si el archivo css se coloca en una carpeta estática o en cualquier otra carpeta

    Luego pasa el css a la función de cadena de pdfkit

     pdfkit.from_string(page, 'pdfs/file.pdf', css=css) 

    Único archivo CSS

     css = 'example.css' pdfkit.from_file('file.html', css=css) 

    Múltiples archivos CSS

     css = ['example.css', 'example2.css'] pdfkit.from_file('file.html', css=css) 

    En tu caso prueba esto:

     css = "static/style.css" page = flask.render_template('base.html') pdfkit.from_string(page, 'pdfs/file.pdf', css=css) return page 

    Su código da como resultado un enlace que wkhtmltopdf intenta abrir como un archivo normal:

     {{ url_for('static', filename='style.css') }} 

    se convierte en

     /static/style.css 

    que wkhtmltopdf buscará en

     file://static/style.css 

    En su lugar, agregue el _external=True para señalarlo hacia el archivo en el servidor:

     {{ url_for('static', filename='style.css', _external=True) }} 

    resultados en (algo así como)

     http://localhost:5000/static/style.css