folder_open Python

Créer un site de conversion d’images en PDF avec Django et Python : Tutoriel complet

Mayeul SAMBA

Mayeul SAMBA

Expert Formateur

calendar_today
Créer un site de conversion d’images en PDF avec Django et Python : Tutoriel complet

Introduction

Vous en avez marre de convertir manuellement vos images en PDF ? Dans ce tutoriel, nous allons créer un site web simple avec Django (Python) qui permet de :

  1. Sélectionner une ou plusieurs images (JPG, PNG, PSD, SVG, etc.)
  2. Les convertir automatiquement en un seul fichier PDF
  3. Télécharger le résultat en un clic

Ce projet est idéal pour les débutants en Django qui veulent comprendre :

  • La création d’un projet Django

  • La gestion des fichiers uploadés

  • L’utilisation de bibliothèques comme Pillow (PIL) et img2pdf

  • La configuration des URLs, vues et templates


Prérequis

Avant de commencer, assurez-vous d’avoir :

  • Python 3.8+ installé (Télécharger Python)

  • Un éditeur de code (VS Code, PyCharm, etc.)

  • Un terminal (PowerShell, CMD, ou Terminal Linux/Mac)



Étape 1 : Configuration de l’environnement

1-Créer un dossier pour le projet

Ouvrez VS Code (ou votre éditeur préféré) et créez un nouveau dossier :

mkdir image_to_pdf
cd image_to_pdf

2-Créer un environnement virtuel

Pour isoler les dépendances du projet :

python -m venv venv
  • Windows : Activez l’environnement avec :

    .\venv\Scripts\activate
  • Mac/Linux :

    source venv/bin/activate

 Vérifiez que l’environnement est activé : vous devriez voir (venv) dans votre terminal.

3-Installer Django

pip install django

4-Créer un projet Django

django-admin startproject website
cd website

5-Lancer le serveur de développement

python manage.py runserver
  • Ouvrez http://127.0.0.1:8000/ dans votre navigateur.

  • Vous devriez voir la page d’accueil par défaut de Django.

 Erreur courante : Si vous voyez un message sur les migrations, exécutez :

python manage.py migrate

Étape 2 : Créer une application Django

1-Générer une nouvelle application

python manage.py startapp convert

2-Enregistrer l’application

Ouvrez website/settings.py et ajoutez 'convert' dans la liste INSTALLED_APPS :

INSTALLED_APPS = [
    ...,
    'convert',
]

Étape 3 : Installer les bibliothèques nécessaires

Pour convertir les images en PDF, nous utiliserons :

  • Pillow (PIL) : Pour manipuler les images (redimensionnement, formats, etc.)

  • img2pdf : Pour convertir les images en PDF

  • psd-tools : Pour gérer les fichiers PSD (Photoshop)

  • cairosvg : Pour gérer les fichiers SVG

Installez-les avec :

pip install pillow img2pdf psd-tools cairosvg

Étape 4 : Configurer les modèles (Models)

Dans convert/models.py, créez un modèle pour gérer les uploads d’images :

from django.db import models

class UploadedImage(models.Model):
    image = models.ImageField(upload_to='images/')

    def __str__(self):
        return self.image.name

Configurer les médias

Dans website/settings.py, ajoutez :

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

Puis, dans website/urls.py, ajoutez :

from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    ...,
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

Étape 5 : Créer les vues (Views)

Dans convert/views.py, nous allons définir la logique de conversion :

from django.shortcuts import render
from django.http import FileResponse
from PIL import Image
import img2pdf
from io import BytesIO
from psd_tools import PSD
from cairosvg import svg2png
import os

def convert_to_pdf(request):
    if request.method == 'POST':
        files = request.FILES.getlist('images')  # Récupère plusieurs fichiers
        if not files:
            return render(request, 'convert/convert.html', {'error': 'Aucun fichier sélectionné'})

        pdf_buffer = BytesIO()  # Buffer pour stocker le PDF
        images = []

        for file in files:
            try:
                # Gestion des différents formats
                if file.name.lower().endswith('.psd'):
                    # Conversion PSD -> PIL Image
                    psd = PSD.from_stream(file)
                    img = psd.composite()
                    img = img.convert('RGB')  # Assure le mode RGB
                elif file.name.lower().endswith('.svg'):
                    # Conversion SVG -> PNG (via cairosvg)
                    svg_data = file.read()
                    png_data = svg2png(bytestring=svg_data)
                    img = Image.open(BytesIO(png_data))
                else:
                    # Formats standards (JPG, PNG, etc.)
                    img = Image.open(file)
                    if img.mode != 'RGB':
                        img = img.convert('RGB')

                images.append(img)

            except Exception as e:
                return render(request, 'convert/convert.html', {'error': f'Erreur avec {file.name}: {str(e)}'})

        if images:
            # Conversion des images en PDF
            pdf_buffer.write(img2pdf.convert([img for img in images]))
            pdf_buffer.seek(0)

            # Retourne le PDF en téléchargement
            return FileResponse(
                pdf_buffer,
                as_attachment=True,
                filename='converted.pdf',
                content_type='application/pdf'
            )

    return render(request, 'convert/convert.html')

Étape 6 : Configurer les URLs

1-Dans convert/urls.py (créez le fichier si inexistant) :

from django.urls import path
from . import views

urlpatterns = [
    path('', views.convert_to_pdf, name='convert'),
]

2- Dans website/urls.py :

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('convert.urls')),  # Page d'accueil = convertisseur
]

Étape 7 : Créer le template HTML

1-Structure des dossiers

Créez les dossiers suivants dans convert/ :

convert/
??? templates/
?   ??? convert/
?       ??? convert.html
??? static/
    ??? css/
    ?   ??? style.css
    ??? images/
        ??? (vos images si besoin)

2- Fichier convert/templates/convert/convert.html :

<!DOCTYPE html>
<html lang="fr">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Convertisseur d'images en PDF</title>
    <link rel="stylesheet" href="{% static 'css/style.css' %}">
</head>
<body>
    <div class="container">
        <h1>Convertisseur d'images en PDF</h1>
        <p>Sélectionnez une ou plusieurs images pour les convertir en PDF.</p>

        {% if error %}
            <div class="error">{{ error }}</div>
        {% endif %}

        <form method="post" enctype="multipart/form-data">
            {% csrf_token %}
            <input type="file" name="images" multiple accept="image/*,.psd,.svg">
            <button type="submit">Convertir et télécharger</button>
        </form>
    </div>
</body>
</html>

3- Fichier convert/static/css/style.css (optionnel) :

body {
    font-family: Arial, sans-serif;
    max-width: 800px;
    margin: 0 auto;
    padding: 20px;
    text-align: center;
}

.container {
    background: #f9f9f9;
    padding: 20px;
    border-radius: 8px;
    box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
}

input[type="file"] {
    margin: 20px 0;
    padding: 10px;
    border: 1px solid #ddd;
    border-radius: 4px;
}

button {
    background: #4CAF50;
    color: white;
    padding: 10px 20px;
    border: none;
    border-radius: 4px;
    cursor: pointer;
}

button:hover {
    background: #45a049;
}

.error {
    color: red;
    margin: 10px 0;
}


Étape 8 : Tester le site

  1. Lancez le serveur :

     python manage.py runserver
  2. Ouvrez http://127.0.0.1:8000/ dans votre navigateur.

  3. Testez :

    • Sélectionnez une ou plusieurs images (JPG, PNG, PSD, SVG).

    • Cliquez sur "Convertir et télécharger".

    • Le PDF généré sera téléchargé automatiquement.

Résultat attendu :

  • Un fichier PDF contenant toutes les images sélectionnées, dans l’ordre de téléchargement.


Dépannage des erreurs courantes

Problème

Solution

ModuleNotFoundError: No module named 'django'

Activez l’environnement virtuel (source venv/bin/activate ou .\\venv\\Scripts\\activate).

TemplateDoesNotExist

Vérifiez que le dossier templates/convert/ existe et contient convert.html.

No such file or directory: 'media/images/...'

Créez le dossier media/ à la racine du projet.

Erreur de conversion PSD/SVG

Vérifiez que psd-tools et cairosvg sont bien installés (pip install psd-tools cairosvg).

Le CSS ne s’affiche pas

Assurez-vous que {% load static %} est en haut du template et que STATIC_URL est configuré.


Améliorations possibles

Pour aller plus loin, vous pourriez :

  1. Ajouter un aperçu des images avant conversion (avec JavaScript).

  2. Permettre de réorganiser les images avant de générer le PDF.

  3. Ajouter des options (qualité, taille de page, orientation).

  4. Déployer le site sur PythonAnywhere ou Heroku.


Conclusion

Félicitations ! Vous venez de créer un site web fonctionnel pour convertir des images en PDF avec Django et Python. Ce projet vous a permis de :

  • Comprendre la structure d’un projet Django.

  • Gérer des uploads de fichiers.

  • Utiliser des bibliothèques externes pour manipuler des images.

  • Créer une interface utilisateur simple mais efficace.

Partagez ce tutoriel si vous l’avez trouvé utile, et n’hésitez pas à poser vos questions en commentaires !

Abonnez-vous à Afro Tech Formation pour plus de tutoriels comme celui-ci !

Code source complet : Lien vers GitHub.

Cet article vous a plu ?

Partagez ce savoir avec votre réseau

forum Commentaires 0

lock

Rejoignez la conversation

Connectez-vous pour partager vos expériences et échanger avec la communauté.

login Se connecter pour commenter
chat_bubble_outline

Aucun commentaire pour le moment

Soyez le premier à partager votre avis et lancez la discussion !

Prêt à propulser votre carrière ?

Rejoignez Mayeul SAMBA et des milliers d'étudiants sur la plateforme tech de référence en Afrique.