diff --git a/backend/routes/routesToucan.js b/backend/routes/routesToucan.js
index 236a5671e4e2b8f7a6b9cc646bc5e879e75ec016..b818b107696749075495dca13116e2b2fab54690 100644
--- a/backend/routes/routesToucan.js
+++ b/backend/routes/routesToucan.js
@@ -3,13 +3,27 @@ var fs = require("fs");
 var path = require("path");
 var { celebrate } = require("celebrate");
 var mongoose = require("mongoose");
-var { newToucan, validId, validGet, validTitle } = require("../utils/schema");
+var { newToucan, validId, validGet, validTitle, validURL} = require("../utils/schema");
 var env = require("../.env");
 var isLogged = require("../utils/authentification");
 var upload = require("../utils/fileSaver");
 var Toucan = require("../models/modelToucan");
 var router = express.Router();
 
+/* const urltoucans = Toucan.aggregate([
+    {$addFields: {titlelc: {$split: [{$toLower:"$title"}, " "]}}}, 
+    {$addFields:{year:{$dateToString: {format: "%Y", date: "$date"}}}}, 
+    {$addFields:
+        {titlelcnospace:  
+            {$reduce: 
+                {input: "$titlelc",initialValue: "",
+                in: { $concat : ["$$value", "$$this"]}}} }}, 
+    {$addFields:
+        {urlId:
+            {$concat:["$titlelcnospace","-","$year"]}}}, 
+    {$unset:["titlelc","year","titlelcnospace"]}
+]); */
+
 router.route("/toucans")
 /**
      * Une route qui renvoie un json avec tous les toucans, si limit est défini et vaut n, on renvoie les n derniers toucans
@@ -124,20 +138,30 @@ router.route("/img/:id")
         }
     });
 
-router.route("/pdf/:title")
-    .get(celebrate({params: validTitle}), function(req,res) {
-        Toucan.findOne({title: req.params.title}, (err,data) => {
-            if (err) {
-                res.end(500);
-                return;
-            } else if (!data) {
-                res.status(404).send("Toucan non trouvé");
-                return;
-            }
-            const id = data._id;
-            res.sendFile(path.resolve(env.savedExtensions[1].path,id+".pdf"));
-        }
-        );});
 
+router.get('/pdf/:year/:title', (req, res) => {
+    var title = req.params.title;
+    var year = parseInt(req.params.year);
+    var nextyear = year + 1;
+    var title = new RegExp((title.split("-")).join("."));
+    console.log(title);
+
+    Toucan.find(
+        {
+            title : { $regex: title, $options : 'i' },
+            date : {
+            $gte: new Date(year+"-01-01T00:00:00.000Z"),
+            $lt: new Date(nextyear+"-01-01T00:00:00.000Z"),
+            } 
+        })
+        .exec(function (err, toucan) {
+            if (err) {res.send(err);} 
+            else {
+            const id = toucan[0]._id;
+            res.sendFile(path.resolve(env.savedExtensions[1].path,id+".pdf"));
+            }
+            });
+});
 
+    
 module.exports = router;
\ No newline at end of file
diff --git a/backend/utils/schema.js b/backend/utils/schema.js
index d383da96420737f0a82ef7f7aac77ab615cb07eb..3e3d135a57237f17d5ba8dbba4fb385fa1e94b21 100644
--- a/backend/utils/schema.js
+++ b/backend/utils/schema.js
@@ -13,11 +13,19 @@ var validTitle = Joi.object({
         .regex(/^[a-zA-Z0-9áàâäãåçéèêëíìîïñóòôöõúùûüýÿæœÁÀÂÄÃÅÇÉÈÊËÍÌÎÏÑÓÒÔÖÕÚÙÛÜÝŸÆŒ._\s'-]{1,60}$/) //Autorise la plupart des acents
         .required(),
 });
+
 var validId = Joi.object({id: Joi.string().hex().length(24).required()});
+
 var validGet = Joi.object({
     limit: Joi.number().integer(),
     before: Joi.date().timestamp(),
     after: Joi.date().timestamp()
 });
 
-module.exports = { newToucan, validTitle, validId, validGet };
\ No newline at end of file
+var validURL = Joi.object({
+    urlID: Joi.string()
+        .regex(/^[a-z0-9áàâäãåçéèêëíìîïñóòôöõúùûüýÿæœ._'-]{1,60}\d{4}$/) //
+        .required()
+        });
+
+module.exports = { newToucan, validTitle, validId, validURL, validGet };
\ No newline at end of file
diff --git a/front/src/view/AllToucanPage/AllToucanPage.js b/front/src/view/AllToucanPage/AllToucanPage.js
index 6e56796c2873d44defe4f556120048e151d17d3b..05d8101a2412bf39df98f8cb14ebc9517f92cab5 100644
--- a/front/src/view/AllToucanPage/AllToucanPage.js
+++ b/front/src/view/AllToucanPage/AllToucanPage.js
@@ -7,6 +7,14 @@ import ToucanCard from './ToucanCard'
 const date = new Date()
 const beginYear = 1900 + (date.getMonth() < 7 ? date.getYear()-1 : date.getYear());
 
+function formToucanUrlId(toucan){
+	const urlId = (new Date(toucan.date)).getFullYear()+
+	"/"+
+	toucan.title.toLowerCase().replace(/\s/g, "-");
+	console.log(urlId);
+	return urlId;
+}
+
 function AllToucan(props){
 	const [toucans,setToucans] = useState([]);
 	const [before,setBefore] = useState((new Date(beginYear+1,6,31)).getTime());
@@ -47,9 +55,10 @@ function AllToucan(props){
 				/>
 				<Card.Group centered >
 				{toucans.map( toucan => {
+					console.log(formToucanUrlId(toucan))
 					return <ToucanCard
 					image={`${props.backURL}/toucan/img/${toucan["_id"]}`}
-					link={`${props.backURL}/toucan/pdf/${toucan.title}`}
+					link={`${props.backURL}/toucan/pdf/${formToucanUrlId(toucan)}`}
 					header={toucan.title}
 					toucanId={toucan._id}
 					isAdmin={props.isAdmin}