---
title: "Production de PDF avec Django"
version: 2.0
locale: fr
source: https://docs.djangoproject.com/fr/2.0/howto/outputting-pdf/
canonical: https://djangodocs.dev/fr/2.0/howto/outputting-pdf/
---
# Production de PDF avec Django

Ce document explique comment produire des fichiers PDF dynamiquement en utilisant des vues Django. C’est possible grâce à l’excellente bibliothèque Python libre [ReportLab](https://www.reportlab.com/opensource/).

L’avantage de générer des fichiers PDF dynamiquement est que vous pouvez créer des PDF personnalisés pour différents besoins, par exemple en fonction des utilisateurs ou de certaines parties de contenu.

Par exemple, Django était utilisé chez [kusports.com](http://www.kusports.com/) pour générer des tableaux de tournois NCAA personnalisés et prêts pour l’impression, sous forme de fichiers PDF, pour les personnes participant au concours « March Madness ».

## Installation de ReportLab

La bibliothèque ReportLab est [disponible sur PyPI](https://www.reportlab.com/docs/reportlab-userguide.pdf). Un [manuel d’utilisation](https://pypi.org/project/reportlab/) (un fichier PDF, bien évidemment) est aussi disponible en téléchargement. Vous pouvez installer ReportLab avec `pip`:

```console
$ pip install reportlab
```

Testez votre installation en l’important dans l’interpréteur interactif de Python :

```
>>> import reportlab
```

Si cette commande ne produit aucune erreur, l’installation a réussi.

## Écriture de la vue

L’élément clé dans la génération dynamique de PDF avec Django est que l’API de ReportLab agit sur des objets de type fichier, et les objets [`HttpResponse`](/fr/2.0/ref/request-response/#django.http.HttpResponse) de Django sont justement des objets de type fichier.

Voici un exemple « Hello World » :

```
from django.http import HttpResponse
from reportlab.pdfgen import canvas

def some_view(request):
    # Create the HttpResponse object with the appropriate PDF headers.
    response = HttpResponse(content_type='application/pdf')
    response['Content-Disposition'] = 'attachment; filename="somefilename.pdf"'

    # Create the PDF object, using the response object as its "file."
    p = canvas.Canvas(response)

    # Draw things on the PDF. Here's where the PDF generation happens.
    # See the ReportLab documentation for the full list of functionality.
    p.drawString(100, 100, "Hello world.")

    # Close the PDF object cleanly, and we're done.
    p.showPage()
    p.save()
    return response
```

Le code et les commentaires sont assez explicites, mais certains points méritent un éclaircissement :

- La réponse est initialisée avec un type MIME spécial, `application/pdf`. Ceci indique aux navigateurs que le document est un fichier PDF, et non pas un fichier HTML. Si vous omettiez ce paramètre, les navigateurs interpréteraient probablement le contenu comme du HTML, ce qui résulterait en un affichage cryptique aux allures de code secret.
- L’en-tête `Content-Disposition` de la réponse est aussi défini avec le nom du fichier PDF. Ce nom est totalement arbitraire, donnez-lui le nom que vous voulez. Il sera notamment utilisé par les navigateurs dans la boîte de dialogue « Enregistrer sous ».
- Dans cet exemple, l’en-tête `Content-Disposition` commence par `'attachment; '`. Cela force les navigateurs Web à ouvrir une boîte de dialogue demandant comment gérer le document, même si un comportement par défaut est défini sur la machine. Si vous omettez `'attachment;'`, les navigateurs gèrent directement le fichier PDF en utilisant le programme ou greffon qui aura été configuré pour les liens PDF. Voici à quoi un tel code ressemblerait :

  ```
  response['Content-Disposition'] = 'filename="somefilename.pdf"'
  ```
- Le branchement à l’API ReportLab est facile : il suffit de passer `response` comme premier paramètre à `canvas.Canvas`. La classe `Canvas` s’attend à un objet de type fichier et [`HttpResponse`](/fr/2.0/ref/request-response/#django.http.HttpResponse) joue très bien ce rôle.
- Notez que toute méthode de génération PDF subséquente est appelée sur l’objet PDF (`p` dans ce cas), et non pas sur `response`.
- Finalement, il est important d’appeler `showPage()` et `save()` sur le fichier PDF.

> **Note**
>
> ReportLab n’est pas « thread-safe ». Certains utilisateurs ont signalé des problèmes bizarres lorsque des vues Django de production de PDF sont simultanément appelées par beaucoup de monde.

## PDF complexes

Si vous créez un document PDF complexe avec ReportLab, envisagez l’utilisation de la bibliothèque [`io`](https://docs.python.org/3/library/io.html#module-io) comme espace de stockage temporaire du fichier PDF. Cette bibliothèque fournit une interface d’objet de type fichier particulièrement efficace. Voici l’exemple « Hello World » ci-dessus réécrit en utilisant [`io`](https://docs.python.org/3/library/io.html#module-io):

```
from io import BytesIO
from reportlab.pdfgen import canvas
from django.http import HttpResponse

def some_view(request):
    # Create the HttpResponse object with the appropriate PDF headers.
    response = HttpResponse(content_type='application/pdf')
    response['Content-Disposition'] = 'attachment; filename="somefilename.pdf"'

    buffer = BytesIO()

    # Create the PDF object, using the BytesIO object as its "file."
    p = canvas.Canvas(buffer)

    # Draw things on the PDF. Here's where the PDF generation happens.
    # See the ReportLab documentation for the full list of functionality.
    p.drawString(100, 100, "Hello world.")

    # Close the PDF object cleanly.
    p.showPage()
    p.save()

    # Get the value of the BytesIO buffer and write it to the response.
    pdf = buffer.getvalue()
    buffer.close()
    response.write(pdf)
    return response
```

## Autres formats

Vous constaterez que ces exemples ne contiennent pas beaucoup de code spécifique au format PDF, uniquement les parties utilisant `reportlab`. Vous pouvez donc employer des techniques semblables pour générer tout autre format pour lequel vous trouvez une bibliothèque Python. Consultez également [Production de CSV avec Django](/fr/2.0/howto/outputting-csv/), un autre exemple qui contient certaines techniques utilisables lors de la génération de formats basés sur du texte.

> **See also**
>
> Le site Django Packages présente une [comparaison de paquets](https://djangopackages.org/grids/g/pdf/) qui peuvent aider à produire des fichiers PDF avec Django.
