{"id":822,"date":"2025-11-14T21:56:35","date_gmt":"2025-11-14T20:56:35","guid":{"rendered":"https:\/\/www.ludovicfavre.ch\/blog\/?p=822"},"modified":"2025-11-15T19:05:38","modified_gmt":"2025-11-15T18:05:38","slug":"detection-du-contenu-de-documents-pdf-avec-n8n-local-et-mistral-sur-infomaniak","status":"publish","type":"post","link":"https:\/\/www.ludovicfavre.ch\/blog\/2025\/11\/detection-du-contenu-de-documents-pdf-avec-n8n-local-et-mistral-sur-infomaniak\/","title":{"rendered":"Classification du contenu de documents pdf avec n8n local et mistral sur Infomaniak"},"content":{"rendered":"\n<p><strong>Contexte<\/strong><br>Afin de classer num\u00e9riquement mes documents, je les scan et je leur donne le pattern suivant: &lt;TYPE&gt;-&lt;PREFIX&gt;-&lt;DATE&gt;-&lt;SUFFIX&gt;.pdf. Le processus manuel s&rsquo;av\u00e8re fastidieux car l&rsquo;affichage pour traitement manuel est lent et il faut parfois ouvrir le document pour trouver les informations.<br><br><strong>L&rsquo;id\u00e9e<\/strong><br>Il y a quelques mois, j&rsquo;avais essay\u00e9 de l&rsquo;OCR via LLM pour automatiser ce traitement, mais les co\u00fbts potentiels pour un usage personnel, ainsi que la protection de mes donn\u00e9es ont stopp\u00e9 net mes ambitions.<br><br>Il y a quelques semaines, j&rsquo;ai eu l&rsquo;id\u00e9e de changer d&rsquo;approche apr\u00e8s avoir valid\u00e9 manuellement deux options: <\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Avec une m\u00e9thode traditionnelle d&rsquo;OCR, il est possible d&rsquo;extraire le contenu text de documents PDF scann\u00e9. <\/li>\n\n\n\n<li>Avec les AI Tools d&rsquo;Infomaniak (<a href=\"https:\/\/ai-tools.infomaniak.com\/\">https:\/\/ai-tools.infomaniak.com\/<\/a>), j&rsquo;ai pu confirmer qu&rsquo;avec un prompt adapt\u00e9, mistral 3 est capable de r\u00e9pondre \u00e0 mon besoin, \u00e0 savoir, donner le nom du fichier souhait\u00e9 \u00e0 partir d&rsquo;un extrait de la premi\u00e8re page du PDF OCRis\u00e9. Ceci \u00e0 un co\u00fbt d\u00e9fiant toutes concurrences: apr\u00e8s une centaine de documents trait\u00e9s, j&rsquo;ai une facture de 2 centimes !<\/li>\n<\/ol>\n\n\n\n<p><strong>Automatiser ?<\/strong><\/p>\n\n\n\n<p>Il fallait maintenant assembler ces briques pour un premier traitement simple: renommer automatiquement mes fichiers selon le pattern souhait\u00e9.<\/p>\n\n\n\n<p>Apr\u00e8s avoir effectu\u00e9 quelques recherche, n8n community m&rsquo;a sembl\u00e9 adapt\u00e9 car disponible gratuitement pour utilisation dans une image docker et devrait supporter l&rsquo;appel \u00e0 des LLM respectant l&rsquo;API ChatGPT.<\/p>\n\n\n\n<p>J&rsquo;ai donc commenc\u00e9 \u00e0 faire quelques tests pour v\u00e9rifier qu&rsquo;il \u00e9tait bien possible d&rsquo;appeler un mod\u00e8le chez Infomaniak depuis n8n. Et \u00e7a fonctionne :<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"597\" src=\"https:\/\/www.ludovicfavre.ch\/blog\/wp-content\/uploads\/2025\/11\/EE77BFD0-98F6-4203-94F8-8A5ABF5CA48D-1024x597.png\" alt=\"\" class=\"wp-image-841\" srcset=\"https:\/\/www.ludovicfavre.ch\/blog\/wp-content\/uploads\/2025\/11\/EE77BFD0-98F6-4203-94F8-8A5ABF5CA48D-1024x597.png 1024w, https:\/\/www.ludovicfavre.ch\/blog\/wp-content\/uploads\/2025\/11\/EE77BFD0-98F6-4203-94F8-8A5ABF5CA48D-300x175.png 300w, https:\/\/www.ludovicfavre.ch\/blog\/wp-content\/uploads\/2025\/11\/EE77BFD0-98F6-4203-94F8-8A5ABF5CA48D-768x448.png 768w, https:\/\/www.ludovicfavre.ch\/blog\/wp-content\/uploads\/2025\/11\/EE77BFD0-98F6-4203-94F8-8A5ABF5CA48D.png 1261w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>S&rsquo;en est suivie l&rsquo;exploration de la conception de workflows sur n8n: ce n&rsquo;est pas tr\u00e8s complexe et on trouve \u00e9norm\u00e9ment d&rsquo;exemples et d&rsquo;explications.<\/p>\n\n\n\n<p><br>Ce qui a le plus pos\u00e9 de probl\u00e8mes, c&rsquo;est le traitement de fichiers locaux ainsi que l&rsquo;ex\u00e9cution de mon script python d&rsquo;OCR.<br><br><span style=\"text-decoration: underline;\">1. Script d&rsquo;OCR<\/span><\/p>\n\n\n\n<p>Le script fonctionnant sans probl\u00e8me en local, a pris beaucoup de temps pour \u00eatre fonctionnel sur l&rsquo;image docker n8n. J&rsquo;ai rapidement cr\u00e9\u00e9 une image personnalis\u00e9e avec les librairies requises: pdf2image, pytesseract, spacy&#8230; mais impossible de faire fonctionner mon script. <\/p>\n\n\n\n<p>Apr\u00e8s plusieurs recherches, j&rsquo;ai constat\u00e9 que la fonctionnalit\u00e9 d&rsquo;ex\u00e9cution de code python propos\u00e9e sur n8n ne permettait pas d&rsquo;installer n&rsquo;importe quel module car il repose sur Pyodide: <a href=\"https:\/\/pyodide.org\/en\/stable\/\">https:\/\/pyodide.org\/en\/stable\/<\/a><\/p>\n\n\n\n<p>Restait alors l&rsquo;option d&rsquo;ex\u00e9cuter directement le script python via un noeud &lsquo;Execute Command&rsquo;:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"564\" src=\"https:\/\/www.ludovicfavre.ch\/blog\/wp-content\/uploads\/2025\/11\/image-2-1024x564.png\" alt=\"\" class=\"wp-image-843\" srcset=\"https:\/\/www.ludovicfavre.ch\/blog\/wp-content\/uploads\/2025\/11\/image-2-1024x564.png 1024w, https:\/\/www.ludovicfavre.ch\/blog\/wp-content\/uploads\/2025\/11\/image-2-300x165.png 300w, https:\/\/www.ludovicfavre.ch\/blog\/wp-content\/uploads\/2025\/11\/image-2-768x423.png 768w, https:\/\/www.ludovicfavre.ch\/blog\/wp-content\/uploads\/2025\/11\/image-2.png 1289w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Une fois cette \u00e9tape r\u00e9gl\u00e9e, l&rsquo;appel au mod\u00e8le mistral 3 chez Infomaniak est une formalit\u00e9:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"578\" src=\"https:\/\/www.ludovicfavre.ch\/blog\/wp-content\/uploads\/2025\/11\/00691C27-3C1E-438F-80BB-76CECA394DA1-1024x578.png\" alt=\"\" class=\"wp-image-842\" srcset=\"https:\/\/www.ludovicfavre.ch\/blog\/wp-content\/uploads\/2025\/11\/00691C27-3C1E-438F-80BB-76CECA394DA1-1024x578.png 1024w, https:\/\/www.ludovicfavre.ch\/blog\/wp-content\/uploads\/2025\/11\/00691C27-3C1E-438F-80BB-76CECA394DA1-300x169.png 300w, https:\/\/www.ludovicfavre.ch\/blog\/wp-content\/uploads\/2025\/11\/00691C27-3C1E-438F-80BB-76CECA394DA1-768x434.png 768w, https:\/\/www.ludovicfavre.ch\/blog\/wp-content\/uploads\/2025\/11\/00691C27-3C1E-438F-80BB-76CECA394DA1.png 1291w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Exemple de r\u00e9sultats du traitement par mistral :<br><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"992\" height=\"445\" src=\"https:\/\/www.ludovicfavre.ch\/blog\/wp-content\/uploads\/2025\/11\/image-4.png\" alt=\"\" class=\"wp-image-845\" srcset=\"https:\/\/www.ludovicfavre.ch\/blog\/wp-content\/uploads\/2025\/11\/image-4.png 992w, https:\/\/www.ludovicfavre.ch\/blog\/wp-content\/uploads\/2025\/11\/image-4-300x135.png 300w, https:\/\/www.ludovicfavre.ch\/blog\/wp-content\/uploads\/2025\/11\/image-4-768x345.png 768w\" sizes=\"auto, (max-width: 992px) 100vw, 992px\" \/><\/figure>\n\n\n\n<p><span style=\"text-decoration: underline;\">2. Fichiers locaux<\/span><br>Le traitement de fichiers locaux s&rsquo;est av\u00e9r\u00e9 plus compliqu\u00e9 qu&rsquo;attendu \u00e0 cause de l&rsquo;environnement Docker sur lequel n8n tourne: l&rsquo;image n8n tourne avec l&rsquo;utilisateur node(1000) qu&rsquo;il faut \u00ab\u00a0r\u00e9pliquer\u00a0\u00bb sur l&rsquo;h\u00f4te o\u00f9 tourne l&rsquo;image.<\/p>\n\n\n\n<p>Le r\u00e9sultat, un workflow manuel (pour l&rsquo;instant) qui scan les fichier \u00e0 traiter, it\u00e8re par lot de 5 pour ocr-iser les pdf et les nommer avec l&rsquo;aide de mistral 3 sur Infomaniak et un rapport fichierSource-&gt;fichierRenomm\u00e9 dans un CSV.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"305\" src=\"https:\/\/www.ludovicfavre.ch\/blog\/wp-content\/uploads\/2025\/11\/image-5-1024x305.png\" alt=\"\" class=\"wp-image-846\" srcset=\"https:\/\/www.ludovicfavre.ch\/blog\/wp-content\/uploads\/2025\/11\/image-5-1024x305.png 1024w, https:\/\/www.ludovicfavre.ch\/blog\/wp-content\/uploads\/2025\/11\/image-5-300x89.png 300w, https:\/\/www.ludovicfavre.ch\/blog\/wp-content\/uploads\/2025\/11\/image-5-768x229.png 768w, https:\/\/www.ludovicfavre.ch\/blog\/wp-content\/uploads\/2025\/11\/image-5.png 1421w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p><strong>Conclusion<\/strong><\/p>\n\n\n\n<p>Si n8n peut \u00eatre moins \u00ab\u00a0user-friendly\u00a0\u00bb que d&rsquo;autres solutions similaires, il propose un grand nombre de \u00ab\u00a0noeuds\u00a0\u00bb et supporte surtout des LLM autres que Claude ou ChatGPT sur OpenAI.<\/p>\n\n\n\n<p>J&rsquo;avais accumul\u00e9 pas mal d&rsquo;id\u00e9es d&rsquo;automatisation par LLM, certaines floues, d&rsquo;autres plus nettes, mais aucune ne r\u00e9pondait vraiment \u00e0 un besoin concret chez moi. Maintenant, j&rsquo;en ai trouv\u00e9 une. <br>Ce workflow va certainement encore \u00e9voluer maintenant que j&rsquo;ai pris en main l&rsquo;outil.<\/p>\n\n\n\n<p>Lien vers l&rsquo;image n8n utilis\u00e9e: <a href=\"https:\/\/github.com\/fludo\/n8n-py-addons\/tree\/main\">https:\/\/github.com\/fludo\/n8n-py-addons\/tree\/main<\/a> \/ <a href=\"https:\/\/hub.docker.com\/repository\/docker\/swissmountain\/n8n-py-addons\/general\">https:\/\/hub.docker.com\/repository\/docker\/swissmountain\/n8n-py-addons\/general<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>ContexteAfin de classer num\u00e9riquement mes documents, je les scan et je leur donne le pattern suivant: &lt;TYPE&gt;-&lt;PREFIX&gt;-&lt;DATE&gt;-&lt;SUFFIX&gt;.pdf. Le processus manuel s&rsquo;av\u00e8re fastidieux car l&rsquo;affichage pour traitement manuel est lent et il faut parfois ouvrir le document pour trouver les informations. &hellip; <a href=\"https:\/\/www.ludovicfavre.ch\/blog\/2025\/11\/detection-du-contenu-de-documents-pdf-avec-n8n-local-et-mistral-sur-infomaniak\/\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[109,108],"tags":[106,105,107],"class_list":["post-822","post","type-post","status-publish","format-standard","hentry","category-ia","category-n8n","tag-ia","tag-infomaniak","tag-llm"],"_links":{"self":[{"href":"https:\/\/www.ludovicfavre.ch\/blog\/wp-json\/wp\/v2\/posts\/822","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.ludovicfavre.ch\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.ludovicfavre.ch\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.ludovicfavre.ch\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.ludovicfavre.ch\/blog\/wp-json\/wp\/v2\/comments?post=822"}],"version-history":[{"count":6,"href":"https:\/\/www.ludovicfavre.ch\/blog\/wp-json\/wp\/v2\/posts\/822\/revisions"}],"predecessor-version":[{"id":852,"href":"https:\/\/www.ludovicfavre.ch\/blog\/wp-json\/wp\/v2\/posts\/822\/revisions\/852"}],"wp:attachment":[{"href":"https:\/\/www.ludovicfavre.ch\/blog\/wp-json\/wp\/v2\/media?parent=822"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.ludovicfavre.ch\/blog\/wp-json\/wp\/v2\/categories?post=822"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.ludovicfavre.ch\/blog\/wp-json\/wp\/v2\/tags?post=822"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}