Togolese Identity Documents OCR Processor — Extrait et valide les données des pièces d'identité togolaises par OCR.
- Présentation
- Fonctionnalités
- Documents supportés
- Prérequis système
- Installation
- Utilisation
- Architecture du package
- Tests
- Dépendances
- Licence
tg-document-reader est une bibliothèque PHP qui utilise Tesseract OCR pour lire automatiquement les informations sur les pièces d'identité togolaises :
- Carte Nationale d'Identité (CNI)
- Passeport (avec décodage MRZ format TD3)
- Permis de conduire
La bibliothèque extrait, structure et valide l'ensemble des champs présents sur chaque document.
- Extraction OCR via Tesseract (langue française)
- Architecture pilotée par driver : chaque type de document a son propre parseur
- Décodage MRZ : support des formats TD1 (CNI, 3 lignes) et TD3 (passeport, 2 lignes)
- Validation MRZ selon la norme ICAO 9303 (clés de contrôle)
- Croisement des données recto/verso (CNI, permis)
- Dictionnaire des localités togolaises intégré
- Drapeaux de validation individuels par champ (
ValueStat) - Détection d'expiration du document
- Détection automatique du type de document via OCR
| Document | Faces | MRZ | Formats image supportés |
|---|---|---|---|
| CNI | Recto + Verso | TD1 (3 lignes, I<...) |
JPEG, PNG, PDF |
| Passeport | Recto uniquement | TD3 (2 lignes, P<...) |
JPEG, PNG, PDF |
| Permis de conduire | Recto + Verso | Aucun | JPEG, PNG, PDF |
| Logiciel | Rôle | Installation |
|---|---|---|
| PHP >= 8.1 | Langage d'exécution | php.net |
| Composer | Gestionnaire de dépendances PHP | getcomposer.org |
| Tesseract OCR | Moteur OCR | GitHub UB-Mannheim (Windows), sudo apt install tesseract-ocr (Linux), brew install tesseract (macOS) |
| Données linguistiques françaises | Reconnaissance du français | Inclus dans tessdata/fra.traineddata |
| Ghostscript | Conversion PDF → image (optionnel) | ghostscript.com |
| Extension PHP GD ou Imagick | Manipulation d'images | Incluse par défaut (GD) |
composer require devsyril/tg-document-reader
composer install<?php
require_once 'vendor/autoload.php';
use TgDocumentProcessor\Features\DocumentProcessorFactory;
use TgDocumentProcessor\Models\DocumentType;
// Configurer Tesseract
$tesseractPath = 'C:\Program Files\Tesseract-OCR\tesseract.exe'; // Windows
// $tesseractPath = '/usr/bin/tesseract'; // Linux / macOS
// Créer la factory (l'ImageReader est créé automatiquement)
$factory = new DocumentProcessorFactory();
// Créer un processeur pour le type de document souhaité
$processor = $factory->create(DocumentType::CNI);use TgDocumentProcessor\Tools\ImageReader;
// Avec ImageReader personnalisé
$imageReader = new ImageReader($tesseractPath, 'fra', __DIR__ . '/tessdata');
$factory = new DocumentProcessorFactory($imageReader);
$processor = $factory->create(DocumentType::CNI);
// Depuis deux images (recto + verso)
$result = $processor->process('recto.jpeg', 'verso.jpeg');
// Depuis un PDF
$result = $processor->process('carte_identite.pdf');
// Depuis une seule image contenant les deux faces
$result = $processor->process('recto_verso.jpeg');
echo $result->get('card_number')->value;
echo $result->get('last_name')->value;
echo $result->get('first_name')->value;
echo $result->get('birth_date')->value;
echo $result->get('birth_place')->value;
echo $result->get('blood_type')->value;
echo $result->get('expiry_date')->value; Champs CNI : card_number, last_name, first_name, birth_date, sex, birth_place, birth_prefecture, profession, issue_date, expiry_date, police_office_number, size, blood_type, address, tel, particular_sign, document_number, father_first_name, father_last_name, mother_first_name, mother_last_name, person_to_contact_name, person_to_contact_address, person_to_contact_tel, country.
$imageReader = new ImageReader($tesseractPath, 'fra', __DIR__ . '/tessdata');
$factory = new DocumentProcessorFactory($imageReader);
$processor = $factory->create(DocumentType::DRIVER_LICENSE);
// Depuis deux images (recto + verso)
$result = $processor->process('permis_recto.jpeg', 'permis_verso.jpeg');
// Depuis un PDF
$result = $processor->process('permis.pdf');
echo $result->get('license_number')->value;
echo $result->get('last_name')->value;
echo $result->get('first_name')->value;
echo $result->get('birth_date')->value;
echo $result->get('categories')->value;
echo $result->get('expiry_date')->value; Champs permis : last_name, first_name, birth_date, sex, birth_place, issue_date, expiry_date, license_number, categories, genre, blood_type, nationality, address, restrictions, cni_or_passport_number.
$imageReader = new ImageReader($tesseractPath, 'fra', __DIR__ . '/tessdata');
$factory = new DocumentProcessorFactory($imageReader);
$processor = $factory->create(DocumentType::PASSPORT);
// Depuis une seule image (pas de verso)
$result = $processor->process('passeport.png');
// Depuis un PDF
$result = $processor->process('passeport.pdf');
echo $result->get('passport_number')->value;
echo $result->get('last_name')->value;
echo $result->get('first_name')->value;
echo $result->get('birth_date')->value;
echo $result->get('expiry_date')->value;
echo $result->get('issuing_country')->value;
echo $result->get('nationality')->value; Champs passeport (MRZ) : passport_number, last_name, first_name, birth_date, sex, expiry_date, issuing_country, nationality, personal_number.
Champs passeport (texte visible) : full_name_visible, given_names_visible, birth_date_visible, birth_place_visible, issue_date_visible, expiry_date_visible, profession_visible, authority_visible.
$imageReader = new ImageReader($tesseractPath, 'fra', __DIR__ . '/tessdata');
$factory = new DocumentProcessorFactory($imageReader);
// La factory analyse l'image et choisit le bon driver automatiquement
$processor = $factory->autoDetect('document.jpeg');
$result = $processor->process('document.jpeg');
echo $result->type->name; // CNI, PASSPORT ou DRIVER_LICENSEChaque champ est un objet ValueStat contenant :
value(?string) — la valeur extraitestat(?bool) — le statut de validation (true= valide,false= invalide,null= non vérifié)
$result = $processor->process('recto.jpeg', 'verso.jpeg');
// Accès direct à un champ
$cardNumber = $result->get('card_number');
echo $cardNumber->value;
echo $cardNumber->stat;
// Raccourci pour la valeur seule
echo $result->getValue('last_name');
// Indicateurs globaux
echo $result->isExpired ? 'Expiré' : 'Valide';
echo $result->isValid ? 'MRZ OK' : 'MRZ invalide';tg_document_reader/
├── composer.json
├── phpunit.xml
├── README.md
├── data/
│ ├── cni/ # Images de test CNI
│ ├── driver-licence/ # Images de test permis
│ ├── passport/ # Images de test passeport
│ └── Local.txt # Dictionnaire des localités togolaises
├── tessdata/
│ └── fra.traineddata # Données linguistiques françaises Tesseract
├── src/
│ ├── Contracts/
│ │ ├── DocumentProcessorInterface.php # Contrat générique pour tout driver
│ │ ├── ImageReaderInterface.php
│ │ └── PdfConverterInterface.php
│ ├── Dictionnaries/
│ │ └── Dics.php # Dictionnaires et constantes
│ ├── Drivers/
│ │ ├── Cni/ # Driver CNI
│ │ │ ├── CniProcessor.php
│ │ │ ├── Models/
│ │ │ ├── Parsers/
│ │ │ └── Validators/
│ │ ├── DriverLicense/ # Driver permis de conduire
│ │ │ ├── LicenseProcessor.php
│ │ │ ├── Models/
│ │ │ ├── Parsers/
│ │ │ └── Validators/
│ │ └── Passport/ # Driver passeport
│ │ ├── PassportProcessor.php
│ │ ├── Models/
│ │ ├── Parsers/
│ │ └── Validators/
│ ├── Features/
│ │ └── DocumentProcessorFactory.php # Factory/Registry
│ ├── Models/
│ │ ├── DocumentResult.php # Résultat générique
│ │ ├── DocumentType.php # Enum des types supportés
│ │ └── ValueStat.php # Conteneur valeur + statut
│ └── Tools/
│ ├── FileManager.php
│ ├── ImageReader.php # Wrapper Tesseract OCR
│ ├── MrzParser.php # Utilitaires MRZ (ICAO 9303)
│ └── PdfConverter.php # Convertisseur PDF → image
├── tests/
│ ├── fixtures/
│ │ ├── recto_ocr.txt # OCR attendu CNI recto
│ │ ├── verso_ocr.txt # OCR attendu CNI verso
│ │ ├── recto.jpeg
│ │ └── verso.jpeg
│ ├── Integration/
│ │ ├── CniFixturesTest.php
│ │ └── CniPipelineTest.php
│ └── Unit/ # Tests unitaires par driver
└── vendor/
┌─────────────────────────────┐
│ DocumentProcessorFactory │
│ (Features) │
└──────────┬──────────────────┘
│
┌────────────────────┼────────────────────┐
▼ ▼ ▼
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ CniProcessor │ │LicenseProces.│ │PassportProce.│
│ (Drivers/Cni) │ │(Drivers/Lic.)│ │(Drivers/Pass)│
└───────┬───────┘ └───────┬───────┘ └───────┬───────┘
│ │ │
▼ ▼ ▼
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ ImageReader │ │ ImageReader │ │ ImageReader │
│ PdfConverter │ │ PdfConverter │ │ PdfConverter │
└──────────────┘ └──────────────┘ └──────────────┘
│ │ │
└────────────────────┼────────────────────┘
▼
┌─────────────────────┐
│ DocumentResult │
│ (Modèle commun) │
└─────────────────────┘
Chaque driver :
- Reçoit les chemins d'images (1 ou 2 selon le type)
- Exécute l'OCR via
ImageReader - Parse les lignes texte avec son parseur dédié
- Valide les données avec son validateur dédié
- Retourne un
DocumentResultnormalisé
# Lancer tous les tests
composer test
# Ou directement avec PHPUnit
vendor/bin/phpunit| Dossier | Contenu | Description |
|---|---|---|
tests/Unit/ |
Cni*Test, License*Test, Passport*Test, MrzParserTest, DicsTest, DocumentProcessorFactoryTest |
Tests unitaires par driver |
tests/Integration/ |
CniFixturesTest, CniPipelineTest |
Tests d'intégration avec données OCR réelles |
48 tests au total, couvrant :
- Parsing recto/verso CNI
- Validation MRZ TD1 (CNI)
- Parsing permis de conduire recto + verso
- Parsing passeport avec MRZ TD3
- Détection automatique du type de document
- Utilitaires MRZ (clés de contrôle ICAO 9303)
| Package | Version | Rôle |
|---|---|---|
php |
>=8.1 |
Langage d'exécution |
thiagoalessio/tesseract_ocr |
^2.13 |
Wrapper PHP pour Tesseract OCR |
spatie/pdf-to-image |
^3.0 |
Conversion PDF → image |
intervention/image |
^3.0 |
Manipulation d'images |
ramsey/uuid |
^4.7 |
Génération d'UUID |
| Package | Version | Rôle |
|---|---|---|
phpunit/phpunit |
^11.0 |
Framework de tests unitaires |
Ce projet est distribué sous licence MIT.