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

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

Utilise les variables _OCR_...

_OCR_TAILLE_TEXTE_MAX, _OCR_INTERVALLE_CRON, _OCR_NB_DOCS,
_OCR_OPT, _OCR_BIN

File size: 6.2 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        } elseif (defined('_OCR_BIN')) {
20                $bin = _OCR_BIN;
21        } else {
22                // TODO : essayer de trouver tout seul l'exécutable
23                spip_log('Erreur analyse OCR : Il faut specifier l\'exécutable dans le panneau de configuration');
24                $resultat['info'] = _T('ocr:analyser_erreur_executable_introuvable');
25                $resultat['erreur'] = true;
26                return $resultat;
27        }
28        $opt = $config['ocr_opt'] ? $config['ocr_opt'] : (defined('_OCR_OPT') ? _OCR_OPT : '');
29
30        // Ne retenir que les 50 000 premiers caracteres (ou la valeur choisie)
31        $taille_texte_max = $config['taille_texte_max'] ? $config['taille_texte_max'] : (defined('_OCR_TAILLE_TEXTE_MAX') ? _OCR_TAILLE_TEXTE_MAX : 50000);
32       
33        $document = ocr_document($id_document);
34        spip_log($document, 'ocr');
35
36        $fichier = $document['fichier'];
37
38        if (!$fichier) {
39                $resultat['info'] = _T('ocr:analyser_erreur_document_inexistant');
40                $resultat['erreur'] = true;
41                return $resultat;
42        }
43       
44        $dest = $document['cible_url'].$document['basename'];
45       
46        $cmd = $bin.$options.' '.$fichier.' '.$dest.' '.$opt;
47        spip_log('Commande d\'analyse OCR : "'.$cmd.'"', 'ocr');
48        exec($cmd, $output, $status_code);
49        $erreur = ocr_texte_erreur($status_code);
50
51        if ($erreur) {
52                spip_log('Erreur : '.$erreur, 'ocr');
53                $resultat['info'] = $erreur;
54                $resultat['erreur'] = true;
55                sql_updateq("spip_documents", array('ocr_analyse' => 'err'), "id_document=".intval($id_document));
56        } else  {
57                // on ouvre et on lit le .txt
58                // TODO : comment connaitre l'encoding du fichier ?
59                $nouveaufichier = $dest.'.txt';
60                if (file_exists($nouveaufichier) && is_readable($nouveaufichier)) {
61                        $texte = file_get_contents($nouveaufichier);
62                        unlink($nouveaufichier);
63                        $texte = substr($texte, 0, $taille_texte_max);
64                        if ($dry_run) {
65                                $resultat['info'] = $texte;
66                        } else {
67                                // On teste si le document est une image générée par doc2img (mode='doc2img' + présente dans spip_documents_liens, liée avec un objet 'document')
68                                $resultat_sql = sql_fetsel("L1.page, L2.id_objet AS id_document_original","spip_documents as L1 LEFT JOIN spip_documents_liens as L2 ON L1.id_document=L2.id_document","L2.id_document=".intval($id_document).' AND L2.objet="document" AND L1.mode="doc2img"');
69                                if ($resultat_sql) {
70                                        $page = $resultat_sql['page'];
71                                        $id_document_original = $resultat_sql['id_document_original'];
72                                        // Si oui, on colle le texte dans le champ "ocr" du document original (on ne teste pas s'il y a plusieurs documents, ça ne devrait pas)
73                                        // Dans ce cas, le champ "ocr" est un tableau JSON des pages du document
74                                        spip_log('Modification du champ "ocr" du document '.$id_document_original.' (page '.$page.') - c\'est le document original qui avait été converti par doc2img' , 'ocr');
75                                        $ocr_original = sql_getfetsel("ocr","spip_documents","id_document=".intval($id_document_original));
76                                        // Décoder le JSON ou initialiser
77                                        $ocr_array = $ocr_original ? json_decode($ocr_original, true) : array();
78                                        // Ajouter la page
79                                        $ocr_array[$page] = $texte;
80                                        // Coder le JSON
81                                        include_spip('ocr_options');
82                                        $ocr_json = json_encode_utf8($ocr_array);
83                                        // Insérer dans la base
84                                        sql_updateq("spip_documents", array('ocr' => $ocr_json), "id_document=".intval($id_document_original));
85                                        // Indiquer que l'image doc2img a été analysée
86                                        sql_updateq("spip_documents", array('ocr_analyse' => 'oui'), "id_document=".intval($id_document));
87                                } else {
88                                        // sinon, on modifie le champ "ocr" de l'image
89                                        spip_log('Modification du champ "ocr" du document '.$id_document, 'ocr');
90                                        sql_updateq("spip_documents", array('ocr' => $texte, 'ocr_analyse' => 'oui'), "id_document=".intval($id_document));
91                                }
92                        }
93                        $resultat['success'] = true;
94                } else {
95                        $resultat['info'] = _T('ocr:analyser_erreur_fichier_resultat');
96                        $resultat['erreur'] = true;
97                        sql_updateq("spip_documents", array('ocr_analyse' => 'err'), "id_document=".intval($id_document));
98                }
99        }
100       
101        return $resultat;
102}
103
104/**
105 * Fonction pour convertir le status_code de tesseract en texte d'erreur
106 *
107 *  Calcul un tableau :
108 *  - avec informations sur le documents (nom, repertoire, nature)
109 *  - determine les informations des documents finaux (nom, respertoire, extension)
110 *
111 * @param $status_code status code retourné par la commande tesseract
112 * @return $erreur vide si pas d'erreur ou texte d'erreur selon le status code
113 */
114function ocr_texte_erreur($status_code) {
115        switch ($status_code) {
116                case 0:
117                        $erreur = '';
118                        break;
119                case 1:
120                case 2:
121                case 3:
122                        $erreur = _T('ocr:analyser_erreur_'.$status_code);
123                        break;
124                default:
125                        $erreur = _T('ocr:analyser_erreur_autre');
126        }
127        return $erreur;
128}
129
130/**
131 * Fonction pour connaitre les infos fichiers du document
132 *
133 *  Génère un table avec :
134 *  - des informations sur le document (nom, extension, repertoire)
135 *  - des informations pour le document à générer (nom, repertoire)
136 *
137 * @param $id_document identifiant du document
138 * @return $document : liste de données caractérisant le document
139 */
140function ocr_document($id_document) {
141
142    //on recupere l'url du document
143    $fichier = sql_fetsel(
144        'fichier,extension',
145        'spip_documents',
146        'id_document='.intval($id_document)
147    );
148
149    //chemin relatif du fichier
150    include_spip('inc/documents');
151    $fichier_reel = get_spip_doc($fichier['fichier']);
152
153    //url relative du repertoire contenant le fichier , on retire aussi le / en fin
154    $document['fichier'] = $fichier_reel;
155
156    //information sur le nom du fichier
157    $document['extension'] = $fichier['extension'];
158    $document['name'] = basename($fichier_reel);
159    $document['basename'] = basename($document['name'], '.png');
160
161    // url relative du repertoire cible
162    if(!is_dir(_DIR_VAR."cache-ocr")) {
163                //creation du repertoire cible
164        sous_repertoire(_DIR_VAR,"cache-ocr");
165        }
166        $document['cible_url'] = _DIR_VAR."cache-ocr".'/';
167
168    return $document;
169}
Note: See TracBrowser for help on using the repository browser.