source: spip-zone/_plugins_/ocr/trunk/inc/ocr_analyser.php @ 75069

Last change on this file since 75069 was 75069, checked in by lesage.sylvain@…, 8 years ago

Option "dry_run" pour les tests sans modification de la base de donnees

File size: 3.9 KB
Line 
1<?php
2
3if (!defined('_ECRIRE_INC_VERSION')) return;
4
5/**
6 * Fonction autonome analysant un document donné en paramètre
7 *
8 *  Ensemble des actions necessaires à l'analyse OCR d'une image
9 *
10 * @param int $id_document identifiant du document à convertir
11 */
12function ocr_analyser($id_document, $dry_run=false) {
13        spip_log('Analyse OCR du document '.$id_document, 'ocr');
14
15        include_spip('inc/config');
16        $config = lire_config('ocr',array());
17        if ($config['ocr_bin']) {
18                $bin = $config['ocr_bin'];
19        } else {
20                // TODO : essayer de trouver tout seul l'exécutable
21                spip_log('Erreur analyse OCR : Il faut specifier l\'exécutable dans le panneau de configuration');
22                $resultat['erreur'] = _T('ocr:analyser_erreur_executable_introuvable');
23                return $resultat;
24        }
25        $opt = $config['ocr_opt'] ? $config['ocr_opt'] : '';
26
27        $resultat = array('texte'=>'','erreur'=>'');
28        $document = ocr_document($id_document);
29        spip_log($document, 'ocr');
30
31        $fichier = $document['fichier'];
32
33        if (!$fichier) {
34                $resultat['erreur'] = _T('ocr:analyser_erreur_document_inexistant');
35                return $resultat;
36        }
37       
38        $dest = $document['cible_url'].$document['basename'];
39       
40        $cmd = $bin.$options.' '.$fichier.' '.$dest.' '.$opt;
41        spip_log('Commande d\'analyse OCR : "'.$cmd.'"', 'ocr');
42        exec($cmd, $output, $status_code);
43       
44        $resultat['texte'] = '';
45        $resultat['erreur'] = ocr_texte_erreur($status_code);
46
47        if ($resultat['erreur']) {
48                spip_log('Erreur : '.$resultat['erreur'], 'ocr');
49        } else  {
50                // on ouvre et on lit le .txt
51                // TODO : comment connaitre l'encoding du fichier ?
52                $nouveaufichier = $dest.'.txt';
53                if (file_exists($nouveaufichier) && is_readable($nouveaufichier)) {
54                        $texte = file_get_contents($nouveaufichier);
55                        unlink($nouveaufichier);
56                        $resultat['texte'] = $texte;
57                } else {
58                        $resultat['erreur'] = _T('ocr:analyser_erreur_fichier_resultat');
59                }
60        }
61       
62        if (!$dry_run) {
63                // on modifie le champ "ocr" du document dans la base
64                spip_log('Modification du champ "ocr" du document id_document='.$id_document.' dans la base', 'ocr');
65        }
66       
67        return $resultat;
68}
69
70/**
71 * Fonction pour convertir le status_code de tesseract en texte d'erreur
72 *
73 *  Calcul un tableau :
74 *  - avec informations sur le documents (nom, repertoire, nature)
75 *  - determine les informations des documents finaux (nom, respertoire, extension)
76 *
77 * @param $status_code status code retourné par la commande tesseract
78 * @return $erreur vide si pas d'erreur ou texte d'erreur selon le status code
79 */
80function ocr_texte_erreur($status_code) {
81        switch ($status_code) {
82                case 0:
83                        $erreur = '';
84                        break;
85                case 1:
86                case 2:
87                case 3:
88                        $erreur = _T('ocr:analyser_erreur_'.$status_code);
89                        break;
90                default:
91                        $erreur = _T('ocr:analyser_erreur_autre');
92        }
93        return $erreur;
94}
95
96/**
97 * Fonction pour connaitre les infos fichiers du document
98 *
99 *  Génère un table avec :
100 *  - des informations sur le document (nom, extension, repertoire)
101 *  - des informations pour le document à générer (nom, repertoire)
102 *
103 * @param $id_document identifiant du document
104 * @return $document : liste de données caractérisant le document
105 */
106function ocr_document($id_document) {
107
108    //on recupere l'url du document
109    $fichier = sql_fetsel(
110        'fichier,extension',
111        'spip_documents',
112        'id_document='.$id_document
113    );
114
115    //chemin relatif du fichier
116    include_spip('inc/documents');
117    $fichier_reel = get_spip_doc($fichier['fichier']);
118
119    //url relative du repertoire contenant le fichier , on retire aussi le / en fin
120    $document['fichier'] = $fichier_reel;
121
122    //information sur le nom du fichier
123    $document['extension'] = $fichier['extension'];
124    $document['name'] = basename($fichier_reel);
125    $document['basename'] = basename($document['name'], '.png');
126
127    // url relative du repertoire cible
128    if(!is_dir(_DIR_VAR."cache-ocr")) {
129                //creation du repertoire cible
130        sous_repertoire(_DIR_VAR,"cache-ocr");
131        }
132        $document['cible_url'] = _DIR_VAR."cache-ocr".'/';
133
134    return $document;
135}
Note: See TracBrowser for help on using the repository browser.