Common Use Cases

Example Application

Here is a simple hello world application that uses Flask-WeasyPrint:

from flask import Flask, render_template, url_for
from flask_weasyprint import HTML, render_pdf

app = Flask(__name__)

@app.route('/hello/', defaults={'name': 'World'})
@app.route('/hello/<name>/')
def hello_html(name):
    return render_template('hello.html', name=name)

@app.route('/hello_<name>.pdf')
def hello_pdf(name):
    # Make a PDF from another view
    return render_pdf(url_for('hello_html', name=name))

# Alternatively, if the PDF does not have a matching HTML page:

@app.route('/hello_<name>.pdf')
def hello_pdf(name):
    # Make a PDF straight from HTML in a string.
    html = render_template('hello.html', name=name)
    return render_pdf(HTML(string=html))

templates/hello.html:

<!doctype html>
<title>Hello</title>
<link rel=stylesheet href="{{ url_for('static', filename='style.css') }}" />

<p>Hello, {{ name }}!</p>
<nav><a href="{{ url_for('hello_pdf', name=name) }}">Get as PDF</a></nav>

static/style.css:

body { font: 2em Fontin, serif }
nav { font-size: .7em }

@page { size: A5; margin: 1cm }
@media print {
    nav { display: none }
}

flask_weasyprint.render_pdf() helps making a flask.Response with the correct MIME type. You can give it an URL or an HTML object.

In the HTML you can use flask.url_for() or relative URLs. Flask-WeasyPrint will do the right thing to fetch resources and make hyperlinks absolute in the PDF output.

In CSS, @page and @media print can be used to have print-specific styles. Here the “Get as PDF” link is not displayed in the PDF itself, although it still exists in the HTML.

Testing Application

A custom application has been created to test Flask-WeasyPrint. It includes separate code for the common Flask application and the Flask-WeasyPrint specific part.

You can find it in Flask-WeasyPrint’s repository.