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 :
- Sélectionner une ou plusieurs images (JPG, PNG, PSD, SVG, etc.)
- Les convertir automatiquement en un seul fichier PDF
- 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
-
Lancez le serveur :
python manage.py runserver -
Ouvrez http://127.0.0.1:8000/ dans votre navigateur.
-
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 |
|---|---|
|
|
Activez l’environnement virtuel ( |
|
|
Vérifiez que le dossier |
|
|
Créez le dossier |
|
Erreur de conversion PSD/SVG |
Vérifiez que |
|
Le CSS ne s’affiche pas |
Assurez-vous que |
Améliorations possibles
Pour aller plus loin, vous pourriez :
-
Ajouter un aperçu des images avant conversion (avec JavaScript).
-
Permettre de réorganiser les images avant de générer le PDF.
-
Ajouter des options (qualité, taille de page, orientation).
-
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.