Skip to content

4D5A90/quickstart-node-ts

Repository files navigation

Autoscan

OCR local pour l'extraction automatique des données des cartes grises françaises.

Utilise PaddleOCR (via ONNX) pour une reconnaissance de texte performante sans dépendance cloud.

Prérequis

  • Node.js 20+
  • pnpm 9+

Installation

git clone <repo-url>
cd autoscan
pnpm install

Utilisation

CLI

# Installation globale
pnpm build
pnpm link --global

# Utilisation
autoscan carte-grise.jpg
autoscan carte-grise.pdf --debug
autoscan *.jpg --json > results.json

Options CLI

autoscan <fichier> [options]

Options:
  -d, --debug       Mode debug (logs détaillés)
  -j, --json        Sortie JSON uniquement (pour scripting)
  -h, --help        Affiche l'aide

Exemples

# Traitement simple
autoscan ma-carte-grise.jpg

# Mode debug
autoscan document.pdf --debug

# Sortie JSON (pour intégration)
autoscan carte.jpg --json
# {
#   "immatriculation": { "value": "AB-123-CD", "confidence": 0.95 },
#   "vin": { "value": "VF1234567890ABCDE", "confidence": 0.88 },
#   ...
# }

# Traitement par lot
autoscan image1.jpg image2.png image3.pdf

# Pipeline avec jq
autoscan carte.jpg --json | jq '.immatriculation.value'
# "AB-123-CD"

Développement

# Exécuter sans build
pnpm cli carte-grise.jpg

# Mode dev (index.ts)
pnpm dev

API programmatique

import { processCarteGrise } from "autoscan/pipeline";

const result = await processCarteGrise("/chemin/vers/carte-grise.jpg", {
  debug: false,
});

console.log(result.data);
// {
//   immatriculation: { value: "AB-123-CD", confidence: 0.95, source: "mrz_extraction" },
//   vin: { value: "VF1234567890ABCDE", confidence: 0.88, source: "detection_match" },
//   marque: { value: "RENAULT", confidence: 0.95, source: "D1_pattern" },
//   modele: { value: "CLIO", confidence: 0.90, source: "mrz_line2" },
//   dateImmatriculation: { value: "15/03/2020", confidence: 0.92, source: "B_field" },
//   numeroFormule: { value: "2020AA12345", confidence: 0.87, source: "detection_match" }
// }

Formats supportés

Format Support
JPEG
PNG
PDF ✅ (converti en image automatiquement)

Champs extraits

Champ Description Pattern
immatriculation Numéro d'immatriculation AA-123-BB ou ancien format
vin Vehicle Identification Number 17 caractères alphanumériques
marque Marque du véhicule Champ D.1
modele Modèle du véhicule Champ D.3
dateImmatriculation Date de première immatriculation DD/MM/YYYY
numeroFormule Numéro de formule YYYYXXNNNNN

Options

interface PipelineOptions {
  debug?: boolean;        // Affiche les logs détaillés (défaut: false)
  preprocess?: {
    grayscale?: boolean;  // Conversion en niveaux de gris (défaut: true)
    normalize?: boolean;  // Normalisation du contraste (défaut: true)
    sharpen?: boolean;    // Accentuation des contours (défaut: true)
    resize?: {            // Redimensionnement (défaut: null, auto-resize si >2500px)
      width: number;
      height?: number;
    } | null;
  };
}

Résultat

interface PipelineResult {
  data: {
    immatriculation: ExtractedField | null;
    vin: ExtractedField | null;
    marque: ExtractedField | null;
    modele: ExtractedField | null;
    dateImmatriculation: ExtractedField | null;
    numeroFormule: ExtractedField | null;
  };
  raw?: OCRResult;          // Données OCR brutes (si debug: true)
  processingTimeMs: number; // Temps de traitement en ms
}

interface ExtractedField {
  value: string;      // Valeur extraite
  confidence: number; // Score de confiance (0-1)
  source?: string;    // Méthode d'extraction utilisée
}

Performance

Métrique Valeur
Temps moyen ~3s (CPU)
Mémoire ~300MB
Précision >90% sur images de bonne qualité

Architecture

Input (PDF/Image)
      │
      ▼
┌─────────────────┐
│  PDF → Image    │  (si PDF)
└─────────────────┘
      │
      ▼
┌─────────────────┐
│  Preprocessing  │  Sharp (grayscale, normalize, sharpen)
└─────────────────┘
      │
      ▼
┌─────────────────┐
│  Auto-rotation  │  Teste 0°, 90°, 270°, 180°
└─────────────────┘
      │
      ▼
┌─────────────────┐
│   PaddleOCR     │  Détection + Reconnaissance
└─────────────────┘
      │
      ▼
┌─────────────────┐
│   Extracteurs   │  Regex + Validation + MRZ
└─────────────────┘
      │
      ▼
    Output

Scripts

pnpm dev      # Exécute src/index.ts avec tsx
pnpm build    # Bundle avec esbuild
pnpm start    # Exécute le bundle
pnpm lint     # Vérifie le code avec Biome

Structure du projet

src/
├── cli.ts                # CLI principal
├── index.ts              # Point d'entrée dev
├── config.ts             # Chargement configuration
├── utils.ts              # Utilitaires (PDF, détection format)
├── pipeline/
│   ├── index.ts          # Exports publics
│   ├── pipeline.ts       # Orchestrateur
│   ├── paddle-ocr.ts     # Wrapper PaddleOCR
│   ├── preprocessor.ts   # Preprocessing image
│   └── types.ts          # Types TypeScript
└── extractors/
    ├── base.extractor.ts
    ├── immatriculation.extractor.ts
    ├── vin.extractor.ts
    ├── marque.extractor.ts
    ├── modele.extractor.ts
    ├── date.extractor.ts
    └── numero-formule.extractor.ts

Dépendances principales

  • @gutenye/ocr-node - PaddleOCR pour Node.js (ONNX)
  • sharp - Traitement d'image
  • pdf2pic - Conversion PDF vers image

Limitations

  • Les images très inclinées (>15°) peuvent nécessiter une correction de perspective manuelle
  • La qualité d'extraction dépend de la qualité de l'image source
  • Optimisé pour les cartes grises françaises uniquement

Licence

MIT

About

A quick start boilerplate for Node.js with TypeScript, ESLint. CI/CD ready with GitHub Actions (Fly.io)

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors