Files
scan-ocr-cheques/examples/php-integration.php
2025-07-09 02:12:06 +02:00

212 lines
6.9 KiB
PHP

<?php
/**
* Exemple d'intégration PHP avec l'API Cheque Scanner
*
* Ce script démontre comment :
* 1. Envoyer une image de chèque à l'API
* 2. Vérifier périodiquement l'état du traitement
* 3. Récupérer les résultats une fois le traitement terminé
*/
// Configuration de l'API
$api_url = 'http://localhost:8000/api/v1'; // URL de l'API
$api_key = 'your-secret-api-key-change-me'; // Clé API (doit correspondre à celle définie dans .env)
/**
* Envoie une image de chèque à l'API et récupère l'ID de la tâche
*
* @param string $imagePath Chemin local vers l'image à envoyer
* @param bool $priority Définir à true pour un traitement prioritaire
* @return string L'identifiant de la tâche créée
* @throws Exception En cas d'erreur
*/
function uploadChequeImage($imagePath, $priority = false) {
global $api_url, $api_key;
// Vérifier que le fichier existe
if (!file_exists($imagePath)) {
throw new Exception("Le fichier n'existe pas: " . $imagePath);
}
// Préparer la requête
$curl = curl_init();
$postFields = [
'file' => new CURLFile($imagePath),
'priority' => $priority ? 'true' : 'false'
];
curl_setopt_array($curl, [
CURLOPT_URL => $api_url . '/upload',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $postFields,
CURLOPT_HTTPHEADER => [
'X-API-Key: ' . $api_key
]
]);
// Exécuter la requête
$response = curl_exec($curl);
$status = curl_getinfo($curl, CURLINFO_HTTP_CODE);
curl_close($curl);
// Vérifier la réponse
if ($status != 202) {
throw new Exception("Erreur lors de l'upload: " . $response);
}
// Décoder la réponse JSON
$result = json_decode($response, true);
if (!isset($result['job_id'])) {
throw new Exception("Réponse invalide de l'API: " . $response);
}
return $result['job_id'];
}
/**
* Vérifie l'état de traitement d'une tâche
*
* @param string $jobId Identifiant de la tâche
* @return array Informations sur l'état de la tâche
* @throws Exception En cas d'erreur
*/
function checkJobStatus($jobId) {
global $api_url, $api_key;
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => $api_url . '/status/' . $jobId,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'X-API-Key: ' . $api_key
]
]);
$response = curl_exec($curl);
$status = curl_getinfo($curl, CURLINFO_HTTP_CODE);
curl_close($curl);
if ($status != 200) {
throw new Exception("Erreur lors de la vérification du statut: " . $response);
}
return json_decode($response, true);
}
/**
* Récupère les résultats d'une tâche terminée
*
* @param string $jobId Identifiant de la tâche
* @return array Résultats de l'extraction
* @throws Exception En cas d'erreur
*/
function getJobResult($jobId) {
global $api_url, $api_key;
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => $api_url . '/result/' . $jobId,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'X-API-Key: ' . $api_key
]
]);
$response = curl_exec($curl);
$status = curl_getinfo($curl, CURLINFO_HTTP_CODE);
curl_close($curl);
if ($status != 200) {
throw new Exception("Erreur lors de la récupération des résultats: " . $response);
}
return json_decode($response, true);
}
/**
* Attend que le traitement d'une tâche soit terminé
*
* @param string $jobId Identifiant de la tâche
* @param int $maxWaitTime Temps d'attente maximum en secondes
* @param int $pollInterval Intervalle de vérification en secondes
* @return array État final de la tâche
* @throws Exception Si le temps d'attente est dépassé ou en cas d'erreur
*/
function waitForJobCompletion($jobId, $maxWaitTime = 300, $pollInterval = 2) {
$startTime = time();
$status = ['status' => 'pending'];
while (($status['status'] == 'pending' || $status['status'] == 'processing') &&
(time() - $startTime < $maxWaitTime)) {
// Attendre avant de vérifier à nouveau
sleep($pollInterval);
// Vérifier l'état
$status = checkJobStatus($jobId);
// Afficher la progression
if (isset($status['progress'])) {
echo "Progression: " . $status['progress'] . "% - " . $status['message'] . "\n";
} else {
echo "État: " . $status['status'] . " - " . $status['message'] . "\n";
}
}
if ($status['status'] != 'completed' && $status['status'] != 'failed') {
throw new Exception("Délai d'attente dépassé pour la tâche " . $jobId);
}
return $status;
}
// Exemple d'utilisation
try {
// Chemin de l'image à traiter
$imagePath = '/home/alex/Téléchargements/pymupdf/test_qheque-PXL_2025.jpg';
echo "=== EXTRACTION D'INFORMATIONS DE CHÈQUE ===\n";
// 1. Envoyer l'image
echo "Envoi de l'image: " . $imagePath . "\n";
$jobId = uploadChequeImage($imagePath, true); // true pour un traitement prioritaire
echo "Image envoyée, ID de la tâche: " . $jobId . "\n\n";
// 2. Attendre la fin du traitement
echo "Attente du traitement...\n";
$finalStatus = waitForJobCompletion($jobId);
// 3. Si le traitement est terminé avec succès, récupérer les résultats
if ($finalStatus['status'] == 'completed') {
echo "\nTraitement terminé avec succès!\n";
// Récupérer les résultats détaillés
$results = getJobResult($jobId);
echo "\n=== RÉSULTATS DE L'EXTRACTION ===\n";
if (isset($results['result'])) {
echo "Montant: " . ($results['result']['montant'] ?? 'Non détecté') . "\n";
echo "Date: " . ($results['result']['date'] ?? 'Non détectée') . "\n";
echo "Bénéficiaire: " . ($results['result']['beneficiaire'] ?? 'Non détecté') . "\n";
echo "Numéro de chèque: " . ($results['result']['numero_cheque'] ?? 'Non détecté') . "\n";
echo "Qualité de l'extraction: " . ($results['result']['qualite_extraction'] ?? 'Inconnue') . "\n";
if (isset($results['result']['image_zones'])) {
echo "Image avec zones identifiées: " . $results['result']['image_zones'] . "\n";
}
}
echo "\nMéthode utilisée: " . $results['methode'] . "\n";
if (isset($results['texte_brut']) && !empty($results['texte_brut'])) {
echo "\n=== TEXTE BRUT EXTRAIT ===\n";
echo $results['texte_brut'] . "\n";
}
} else {
echo "\nÉchec du traitement: " . ($results['erreur'] ?? 'Erreur inconnue') . "\n";
}
} catch (Exception $e) {
echo "ERREUR: " . $e->getMessage() . "\n";
}