4NK_IA_front/test-cni-direct.cjs

186 lines
5.3 KiB
JavaScript

#!/usr/bin/env node
/**
* Script de test direct pour analyser l'image CNI
* et extraire les informations sur CANTU, NICOLAS et le code CNI
*/
const { createWorker } = require('tesseract.js')
const path = require('path')
const fs = require('fs')
console.log("🔍 Analyse directe de l'image CNI")
console.log('==================================')
const imagePath = path.join(__dirname, 'test-files', 'IMG_20250902_162159.jpg')
// Vérifier que l'image existe
if (!fs.existsSync(imagePath)) {
console.error('❌ Image non trouvée:', imagePath)
process.exit(1)
}
console.log('📸 Image trouvée:', imagePath)
// Fonction de correction OCR pour les noms spécifiques
function correctOCRText(text) {
const corrections = {
// Corrections pour "Nicolas"
N1colas: 'Nicolas',
'Nicol@s': 'Nicolas',
Nico1as: 'Nicolas',
'Nico1@s': 'Nicolas',
N1co1as: 'Nicolas',
'N1co1@s': 'Nicolas',
Nico1as: 'Nicolas',
'N1col@s': 'Nicolas',
N1co1as: 'Nicolas',
// Corrections pour "Cantu"
'C@ntu': 'Cantu',
CantU: 'Cantu',
'C@ntU': 'Cantu',
Cant0: 'Cantu',
'C@nt0': 'Cantu',
CantU: 'Cantu',
// Autres corrections courantes
0: 'o',
1: 'l',
5: 's',
'@': 'a',
3: 'e',
}
let correctedText = text
for (const [wrong, correct] of Object.entries(corrections)) {
correctedText = correctedText.replace(new RegExp(wrong, 'gi'), correct)
}
return correctedText
}
// Fonction d'extraction des entités
function extractEntitiesFromText(text) {
console.log(`\n🔍 Analyse du texte extrait (${text.length} caractères)`)
console.log('='.repeat(50))
const correctedText = correctOCRText(text)
if (correctedText !== text) {
console.log('📝 Texte corrigé appliqué')
}
const entities = {
identities: [],
cniNumbers: [],
documentType: 'Document',
}
// Patterns pour détecter "Nicolas Cantu"
const namePatterns = [
// Patterns spécifiques pour "Nicolas Cantu" avec variations OCR
/(N[il][cç][o0][l1][a@][s5]\s+[Cc][a@][n][t][u])/gi,
/(N[il][cç][o0][l1][a@][s5]\s+[Cc][a@][n][t][u])/gi,
// Recherche de "Nicolas" seul
/(N[il][cç][o0][l1][a@][s5])/gi,
// Recherche de "Cantu" seul
/([Cc][a@][n][t][u])/gi,
// Patterns généraux pour noms
/([A-Z][a-zà-öø-ÿ'\-]+\s+[A-Z][a-zà-öø-ÿ'\-]+)/g,
]
// Extraction des noms
for (const pattern of namePatterns) {
for (const match of correctedText.matchAll(pattern)) {
const name = match[1].trim()
if (name.length > 3 && !entities.identities.includes(name)) {
entities.identities.push(name)
console.log(`👤 Nom détecté: "${name}"`)
}
}
}
// Extraction des numéros CNI (2 lettres + 6 chiffres)
const cniPattern = /([A-Z]{2}\d{6})/g
for (const match of correctedText.matchAll(cniPattern)) {
entities.cniNumbers.push(match[1])
console.log(`🆔 Numéro CNI détecté: "${match[1]}"`)
}
// Détection du type de document
if (/carte\s+nationale\s+d'identité|cni|mrz|identite/i.test(correctedText)) {
entities.documentType = 'CNI'
console.log('📋 Type de document: CNI détecté')
}
return entities
}
// Fonction principale d'analyse
async function analyzeImage() {
console.log("\n🚀 Démarrage de l'analyse OCR...")
const worker = await createWorker('fra+eng')
try {
console.log('⏳ Extraction du texte en cours...')
const {
data: { text },
} = await worker.recognize(imagePath)
console.log('\n📄 Texte brut extrait:')
console.log('='.repeat(50))
console.log(text)
console.log('='.repeat(50))
// Extraction des entités
const entities = extractEntitiesFromText(text)
console.log("\n🎯 RÉSULTATS DE L'ANALYSE:")
console.log('='.repeat(50))
console.log(`📋 Type de document: ${entities.documentType}`)
console.log(`👥 Identités trouvées: ${entities.identities.length}`)
entities.identities.forEach((identity, index) => {
console.log(` ${index + 1}. ${identity}`)
})
console.log(`🆔 Numéros CNI trouvés: ${entities.cniNumbers.length}`)
entities.cniNumbers.forEach((cni, index) => {
console.log(` ${index + 1}. ${cni}`)
})
// Recherche spécifique pour CANTU et NICOLAS
console.log('\n🔍 RECHERCHE SPÉCIFIQUE:')
console.log('='.repeat(50))
const hasNicolas = /nicolas/i.test(text)
const hasCantu = /cantu/i.test(text)
const hasNicolasCantu = /nicolas.*cantu|cantu.*nicolas/i.test(text)
console.log(`🔍 "NICOLAS" trouvé: ${hasNicolas ? '✅ OUI' : '❌ NON'}`)
console.log(`🔍 "CANTU" trouvé: ${hasCantu ? '✅ OUI' : '❌ NON'}`)
console.log(`🔍 "NICOLAS CANTU" ensemble: ${hasNicolasCantu ? '✅ OUI' : '❌ NON'}`)
if (hasNicolas || hasCantu) {
console.log('\n📝 Contexte trouvé:')
const lines = text.split('\n')
lines.forEach((line, index) => {
if (/nicolas|cantu/i.test(line)) {
console.log(` Ligne ${index + 1}: "${line.trim()}"`)
}
})
}
} catch (error) {
console.error("❌ Erreur lors de l'analyse:", error.message)
} finally {
await worker.terminate()
}
}
// Exécuter l'analyse
analyzeImage()
.then(() => {
console.log('\n🎉 Analyse terminée !')
})
.catch((error) => {
console.error('❌ Erreur:', error.message)
process.exit(1)
})