Extraire le texte d'un fichier .docx dans n8n (sans aucune API)
Publié le 15 novembre 2024
"On me donne des CV en Word, j'ai zero acces API, zero privilege root, et pourtant j'ai besoin du contenu brut -- pour hier." Voici une solution utilisant les capacites natives de n8n et des snippets JavaScript.
Pourquoi se donner cette peine?
- Un fichier .docx est tout simplement une archive ZIP renommee
- Le contenu lisible par un humain se trouve dans word/document.xml
- L'instance n8n a des permissions restreintes qui empechent toute installation externe ou commande shell
Le workflow en un coup d'oeil
Download -> Rename_to_zip -> Decompress -> Pick_document_xml -> Extract XML -> Scrape Text
1 - Recuperer le fichier
Utilisez un noeud standard SFTP Download ou HTTP GET ; les donnees binaires apparaissent sous binary.data.
2 - Deguiser le .docx en .zip
Le noeud Compression de n8n ne reconnait que les formats ZIP. Les metadonnees doivent etre modifiees au prealable.
Code Rename_to_zip :
const bin = items[0].binary.data; bin.fileName = bin.fileName.replace(/\.docx$/i, '.zip'); bin.fileExtension = 'zip'; bin.mimeType = 'application/zip'; return items;
3 - Decompresser l'archive
Utilisez Compression -> Decompress avec Input Binary Field(s) regle sur data.
4 - Recuperer document.xml et ignorer le reste
Code Pick_document_xml :
const result = []; for (const file of Object.values(items[0].binary)) { if (file.fileName === 'document.xml') { result.push({ binary: { data: file } }); break; } } return result;
5 - Transformer le XML en JSON
Utilisez Extract From File avec File Format regle sur XML et Binary Property regle sur data.
6 - Extraire les paragraphes et les nettoyer
Code Scrape_Text :
const xml = items[0].json.data.toString('utf8'); const paraRegex = /<w:p[^>]*?>([\s\S]*?)<\/w:p>/g; const wTRegex = /<w:t[^>]*?>(.*?)<\/w:t>/g; const paragraphs = []; let pMatch; while ((pMatch = paraRegex.exec(xml))) { const inner = pMatch[1]; const parts = []; let tMatch; while ((tMatch = wTRegex.exec(inner))) { parts.push(tMatch[1]); } const txt = parts.join('').replace(/\s+/g, ' ').trim(); if (txt) paragraphs.push(txt); } return [{ json: { paragraphs, text: paragraphs.join('\n\n') } }];
Sortie typique
La sortie est un objet JSON avec un tableau paragraphs et un champ text joignant tous les paragraphes avec des doubles sauts de ligne.
Pourquoi ca fonctionne et continue de fonctionner
- Zero dependance externe -- ideal pour les environnements verrouilles
- Code copier-coller pour n'importe quel workflow
- Texte propre et compact, adapte a GPT, Elasticsearch, SQL ou tout autre systeme
Pour conclure
Extraire le texte d'un fichier Word sans librairie externe est realisable grace a trois micro-scripts et six noeuds natifs, fournissant des resultats fiables pour les workflows d'extraction de texte automatisee.