Reconnaissance de caractères avec TWAPI et Office

 

GS (20130718) Depuis Office 2003, il existe une bibliothèqe du nom de MODI (Microsoft Office Document Imaging ) avec laquelle on peut réaliser de la reconnaissance de caractères (OCR - Optical Character Recognition) et extraire le texte d'un document sous forme d'image. Ainsi, en moins de 10 ligne de Tcl vous obtenez votre texte.

J'ai dit 10 lignes ! Alors allons y :

L'image de test sera un morceau du texte de la page d'accueil du Wiki Francophone wfr.tcl.tk au format BMP :

Et voici le code :

 package require twapi
 set doc [twapi::comobj MODI.Document]
 $doc Create "tcltkwfr.bmp"
 $doc OCR 12
 set img [[$doc Images] Item 0]
 set ly [$img Layout]
 set page [$ly Text]
 $doc Close

Dans la variable page, on récupère ce texte brut sans formatage :

 C’est quoi TcllTk?

 Faire simple et bien telle est la devise de Tcl, un langage de programmation puissant et facile à apprendre, défini en seulement onze règles. Combiné avec 1k, il permet de créer rapidement des applications graphiques pour Windows, Linux, MacOSX et de nombreuses autres plate-formes.

 Qu’est-ce qu’un Wiki?

 Un wiki est un site collaboratif : tout le monde peut y ajouter des pages ou éditer les pages existantes en utilisant une syntaxe très simple à apprendre.

 Par où commencer?

 Si vous souhaitez débuter avec TcLTk, consultez en premier lieu la FAQ.

 Pour obtenir des informations sur TcI/Tk, vous pouvez rechercher rinformation souhaitée ou consulter les dernières modifications.

 Pour connaître le fonctionnement de ce wikit, consultez l’Aide.

 L’ensemble des participants au wiki tcl francophone vous souhaite une bonne visite sur ses pages.

 Ce site est dédié à la mémoire de Maurice “ulis Bredelet qui fut run de ses principaux contributeurs.

Quelques commentaires à propos de ce petit bout de code

 set doc [twapi::comobj MODI.Document]

Crée un instance de l'objet MODI.Document.

 $doc Create "tcltk.bmp"

Attribut un fichier image à l'instance document. Les formats d'images supportés sont le TIFF, le TIFF multi-page et BMP.

 $doc OCR

Appel de la méthode OCR. Cette méthode dispose de 3 paramètres optionnels :

$doc OCR <LangId> <OCROrientImage> <OCRStraightenImage>

LangId : la langue du document. 20 languages sont reconnues. L'OCR utilise par défaut les paramètres régionaux. Tchèque = 5, Danois = 6, Anglais = 9, Finlandais = 11, Français = 12, Allemand = 7, Grec = 8, Italien = 16, Espagnol= 10, Russe = 25.

OCROrientImage : une valeur booléenne qui spécifie si l'OCR détermine tout seul l'orientation de la page. La valeur par défaut est true.

OCRStraightenImage : une valeur booléenne qui spécifie si l'OCR tente de remettre la page droite par rapport à la verticale. La valeur par défaut est true.

 set img [[$doc Images] Item 0]

Chaque page du document est un objet image. On récupère la seule et unique page (Item 0). Si il y a plus d'une page, il faut faire une boucle sur toutes les images et utiliser le format TIFF. Le nombre d'images (de pages) est : set n [$doc Images] Count].

 set ly [$img Layout]

On récupère l'agencement de la page. Arrivé à ce stade nous n'avons toujours pas de texte car la propriété Text est dans des objets imbriqués. Pour faire court, la hiérarchie des objets ressemble à ceci : [Document [Images [Layout [Text]]]

 set page [$ly Text]

Pour finir on récupère le texte dans le Layout.

Il est ensuite très aisé de manipuler le texte avec Tcl.

Cependant si vous souhaitez aller plus loin, on peut utiliser les propriétés de l'accesseur Words du Layout pour obtenir des statistiques du texte :

 set word [$ly Words]
 set nbword [$word Count]
 for {set i 0} {$i < $nbword} {incr i} {
    set s [$word Item $i]
    set t [$s Text]
    set Id [$s Id]
    set LineId [$s LineId]
    set RegionId [$s RegionId]
    set FontId [$s FontId]
    set RecognitionConfidence [$s RecognitionConfidence]
    puts "Id : $Id LineId : $LineId Text : $t \t\t RegionId : $RegionId FontId : $FontId RecognitionConfidence : $RecognitionConfidence"
 }

Et voici le résultat :

 Id : 0 LineId : 0 Text : C’est 		 RegionId : 0 FontId : 1 RecognitionConfidence : 198
 Id : 1 LineId : 0 Text : quoi 		 RegionId : 0 FontId : 1 RecognitionConfidence : 223
 Id : 2 LineId : 0 Text : TcllTk? 		 RegionId : 0 FontId : 1 RecognitionConfidence : 148
 Id : 3 LineId : 0 Text : Faire 		 RegionId : 1 FontId : 2 RecognitionConfidence : 226
 Id : 4 LineId : 0 Text : simple 		 RegionId : 1 FontId : 2 RecognitionConfidence : 224
 Id : 5 LineId : 0 Text : et 		 RegionId : 1 FontId : 2 RecognitionConfidence : 224
 Id : 6 LineId : 0 Text : bien 		 RegionId : 1 FontId : 2 RecognitionConfidence : 224
 Id : 7 LineId : 0 Text : telle 		 RegionId : 1 FontId : 1 RecognitionConfidence : 224
 Id : 8 LineId : 0 Text : est 		 RegionId : 1 FontId : 1 RecognitionConfidence : 224
 Id : 9 LineId : 0 Text : la 		 RegionId : 1 FontId : 1 RecognitionConfidence : 224
 Id : 10 LineId : 0 Text : devise 		 RegionId : 1 FontId : 1 RecognitionConfidence : 224
 Id : 11 LineId : 0 Text : de 		 RegionId : 1 FontId : 1 RecognitionConfidence : 224
 Id : 12 LineId : 0 Text : Tcl, 		 RegionId : 1 FontId : 1 RecognitionConfidence : 83
 Id : 13 LineId : 0 Text : un 		 RegionId : 1 FontId : 1 RecognitionConfidence : 224
 Id : 14 LineId : 0 Text : langage 		 RegionId : 1 FontId : 1 RecognitionConfidence : 224
 Id : 15 LineId : 0 Text : de 		 RegionId : 1 FontId : 1 RecognitionConfidence : 225
 Id : 16 LineId : 0 Text : programmation 		 RegionId : 1 FontId : 1 RecognitionConfidence : 224
 Id : 17 LineId : 0 Text : puissant 		 RegionId : 1 FontId : 1 RecognitionConfidence : 223
 Id : 18 LineId : 0 Text : et 		 RegionId : 1 FontId : 1 RecognitionConfidence : 225
 Id : 19 LineId : 0 Text : facile 		 RegionId : 1 FontId : 1 RecognitionConfidence : 224
 Id : 20 LineId : 0 Text : à 		 RegionId : 1 FontId : 1 RecognitionConfidence : 231
 Id : 21 LineId : 0 Text : apprendre, 		 RegionId : 1 FontId : 1 RecognitionConfidence : 151
 Id : 22 LineId : 0 Text : défini 		 RegionId : 2 FontId : 1 RecognitionConfidence : 222
 Id : 23 LineId : 0 Text : en 		 RegionId : 2 FontId : 1 RecognitionConfidence : 225
 Id : 24 LineId : 0 Text : seulement 		 RegionId : 2 FontId : 1 RecognitionConfidence : 225
 Id : 25 LineId : 0 Text : onze 		 RegionId : 2 FontId : 1 RecognitionConfidence : 224
 Id : 26 LineId : 0 Text : règles. 		 RegionId : 2 FontId : 1 RecognitionConfidence : 204
 Id : 27 LineId : 0 Text : Combiné 		 RegionId : 2 FontId : 1 RecognitionConfidence : 224
 Id : 28 LineId : 0 Text : avec 		 RegionId : 2 FontId : 1 RecognitionConfidence : 225
 Id : 29 LineId : 0 Text : 1k, 		 RegionId : 2 FontId : 1 RecognitionConfidence : 200
 Id : 30 LineId : 0 Text : il 		 RegionId : 2 FontId : 1 RecognitionConfidence : 228
 Id : 31 LineId : 0 Text : permet 		 RegionId : 2 FontId : 1 RecognitionConfidence : 225
 Id : 32 LineId : 0 Text : de 		 RegionId : 2 FontId : 1 RecognitionConfidence : 225
 Id : 33 LineId : 0 Text : créer 		 RegionId : 2 FontId : 1 RecognitionConfidence : 224
 Id : 34 LineId : 0 Text : rapidement 		 RegionId : 2 FontId : 1 RecognitionConfidence : 225
 Id : 35 LineId : 0 Text : des 		 RegionId : 2 FontId : 1 RecognitionConfidence : 226
 Id : 36 LineId : 0 Text : applications 		 RegionId : 2 FontId : 1 RecognitionConfidence : 224
 Id : 37 LineId : 0 Text : graphiques 		 RegionId : 2 FontId : 1 RecognitionConfidence : 224
 Id : 38 LineId : 0 Text : pour 		 RegionId : 3 FontId : 1 RecognitionConfidence : 230
 Id : 39 LineId : 0 Text : Windows, 		 RegionId : 3 FontId : 1 RecognitionConfidence : 208
 Id : 40 LineId : 0 Text : Linux, 		 RegionId : 3 FontId : 1 RecognitionConfidence : 148
 Id : 41 LineId : 0 Text : MacOSX 		 RegionId : 3 FontId : 1 RecognitionConfidence : 217
 Id : 42 LineId : 0 Text : et 		 RegionId : 3 FontId : 1 RecognitionConfidence : 225
 Id : 43 LineId : 0 Text : de 		 RegionId : 3 FontId : 1 RecognitionConfidence : 225
 Id : 44 LineId : 0 Text : nombreuses 		 RegionId : 3 FontId : 1 RecognitionConfidence : 225
 Id : 45 LineId : 0 Text : autres 		 RegionId : 3 FontId : 1 RecognitionConfidence : 224
 Id : 46 LineId : 0 Text : plate-formes. 		 RegionId : 3 FontId : 1 RecognitionConfidence : 175
 Id : 47 LineId : 0 Text : Qu’est-ce 		 RegionId : 4 FontId : 1 RecognitionConfidence : 173
 Id : 48 LineId : 0 Text : qu’un 		 RegionId : 4 FontId : 1 RecognitionConfidence : 182
 Id : 49 LineId : 0 Text : Wiki? 		 RegionId : 4 FontId : 1 RecognitionConfidence : 215
 Id : 50 LineId : 0 Text : Un 		 RegionId : 5 FontId : 1 RecognitionConfidence : 223
 Id : 51 LineId : 0 Text : wiki 		 RegionId : 5 FontId : 1 RecognitionConfidence : 216
 Id : 52 LineId : 0 Text : est 		 RegionId : 5 FontId : 1 RecognitionConfidence : 226
 Id : 53 LineId : 0 Text : un 		 RegionId : 5 FontId : 1 RecognitionConfidence : 225
 Id : 54 LineId : 0 Text : site 		 RegionId : 5 FontId : 1 RecognitionConfidence : 224
 Id : 55 LineId : 0 Text : collaboratif 		 RegionId : 5 FontId : 1 RecognitionConfidence : 208
 Id : 56 LineId : 0 Text : : 		 RegionId : 5 FontId : 1 RecognitionConfidence : 117
 Id : 57 LineId : 0 Text : tout 		 RegionId : 5 FontId : 1 RecognitionConfidence : 225
 Id : 58 LineId : 0 Text : le 		 RegionId : 5 FontId : 1 RecognitionConfidence : 226
 Id : 59 LineId : 0 Text : monde 		 RegionId : 5 FontId : 1 RecognitionConfidence : 225
 Id : 60 LineId : 0 Text : peut 		 RegionId : 5 FontId : 1 RecognitionConfidence : 225
 Id : 61 LineId : 0 Text : y 		 RegionId : 5 FontId : 1 RecognitionConfidence : 224
 Id : 62 LineId : 0 Text : ajouter 		 RegionId : 5 FontId : 1 RecognitionConfidence : 223
 Id : 63 LineId : 0 Text : des 		 RegionId : 5 FontId : 1 RecognitionConfidence : 225
 Id : 64 LineId : 0 Text : pages 		 RegionId : 5 FontId : 1 RecognitionConfidence : 225
 Id : 65 LineId : 0 Text : ou 		 RegionId : 5 FontId : 1 RecognitionConfidence : 225
 Id : 66 LineId : 0 Text : éditer 		 RegionId : 5 FontId : 1 RecognitionConfidence : 225
 Id : 67 LineId : 0 Text : les 		 RegionId : 5 FontId : 1 RecognitionConfidence : 225
 Id : 68 LineId : 0 Text : pages 		 RegionId : 5 FontId : 1 RecognitionConfidence : 226
 Id : 69 LineId : 0 Text : existantes 		 RegionId : 5 FontId : 1 RecognitionConfidence : 225
 Id : 70 LineId : 0 Text : en 		 RegionId : 5 FontId : 1 RecognitionConfidence : 225
 Id : 71 LineId : 0 Text : utilisant 		 RegionId : 6 FontId : 1 RecognitionConfidence : 223
 Id : 72 LineId : 0 Text : une 		 RegionId : 6 FontId : 1 RecognitionConfidence : 224
 Id : 73 LineId : 0 Text : syntaxe 		 RegionId : 6 FontId : 1 RecognitionConfidence : 224
 Id : 74 LineId : 0 Text : très 		 RegionId : 6 FontId : 1 RecognitionConfidence : 225
 Id : 75 LineId : 0 Text : simple 		 RegionId : 6 FontId : 1 RecognitionConfidence : 225
 Id : 76 LineId : 0 Text : à 		 RegionId : 6 FontId : 1 RecognitionConfidence : 226
 Id : 77 LineId : 0 Text : apprendre. 		 RegionId : 6 FontId : 1 RecognitionConfidence : 180
 Id : 78 LineId : 0 Text : Par 		 RegionId : 7 FontId : 1 RecognitionConfidence : 223
 Id : 79 LineId : 0 Text : où 		 RegionId : 7 FontId : 1 RecognitionConfidence : 223
 Id : 80 LineId : 0 Text : commencer? 		 RegionId : 7 FontId : 1 RecognitionConfidence : 222
 Id : 81 LineId : 0 Text : Si 		 RegionId : 8 FontId : 1 RecognitionConfidence : 224
 Id : 82 LineId : 0 Text : vous 		 RegionId : 8 FontId : 1 RecognitionConfidence : 224
 Id : 83 LineId : 0 Text : souhaitez 		 RegionId : 8 FontId : 1 RecognitionConfidence : 225
 Id : 84 LineId : 0 Text : débuter 		 RegionId : 8 FontId : 1 RecognitionConfidence : 225
 Id : 85 LineId : 0 Text : avec 		 RegionId : 8 FontId : 1 RecognitionConfidence : 225
 Id : 86 LineId : 0 Text : TcLTk, 		 RegionId : 8 FontId : 1 RecognitionConfidence : 0
 Id : 87 LineId : 0 Text : consultez 		 RegionId : 8 FontId : 1 RecognitionConfidence : 214
 Id : 88 LineId : 0 Text : en 		 RegionId : 8 FontId : 1 RecognitionConfidence : 226
 Id : 89 LineId : 0 Text : premier 		 RegionId : 8 FontId : 1 RecognitionConfidence : 224
 Id : 90 LineId : 0 Text : lieu 		 RegionId : 8 FontId : 1 RecognitionConfidence : 225
 Id : 91 LineId : 0 Text : la 		 RegionId : 8 FontId : 1 RecognitionConfidence : 226
 Id : 92 LineId : 0 Text : FAQ. 		 RegionId : 8 FontId : 1 RecognitionConfidence : 136
 Id : 93 LineId : 0 Text : Pour 		 RegionId : 9 FontId : 1 RecognitionConfidence : 224
 Id : 94 LineId : 0 Text : obtenir 		 RegionId : 9 FontId : 1 RecognitionConfidence : 225
 Id : 95 LineId : 0 Text : des 		 RegionId : 9 FontId : 1 RecognitionConfidence : 225
 Id : 96 LineId : 0 Text : informations 		 RegionId : 9 FontId : 1 RecognitionConfidence : 224
 Id : 97 LineId : 0 Text : sur 		 RegionId : 9 FontId : 1 RecognitionConfidence : 225
 Id : 98 LineId : 0 Text : TcI/Tk, 		 RegionId : 9 FontId : 1 RecognitionConfidence : 33
 Id : 99 LineId : 0 Text : vous 		 RegionId : 9 FontId : 1 RecognitionConfidence : 225
 Id : 100 LineId : 0 Text : pouvez 		 RegionId : 9 FontId : 1 RecognitionConfidence : 225
 Id : 101 LineId : 0 Text : rechercher 		 RegionId : 9 FontId : 1 RecognitionConfidence : 225
 Id : 102 LineId : 0 Text : rinformation 		 RegionId : 9 FontId : 1 RecognitionConfidence : 204
 Id : 103 LineId : 0 Text : souhaitée 		 RegionId : 9 FontId : 1 RecognitionConfidence : 224
 Id : 104 LineId : 0 Text : ou 		 RegionId : 9 FontId : 1 RecognitionConfidence : 225
 Id : 105 LineId : 0 Text : consulter 		 RegionId : 9 FontId : 1 RecognitionConfidence : 222
 Id : 106 LineId : 0 Text : les 		 RegionId : 9 FontId : 1 RecognitionConfidence : 225
 Id : 107 LineId : 0 Text : dernières 		 RegionId : 10 FontId : 1 RecognitionConfidence : 224
 Id : 108 LineId : 0 Text : modifications. 		 RegionId : 10 FontId : 1 RecognitionConfidence : 193
 Id : 109 LineId : 0 Text : Pour 		 RegionId : 11 FontId : 1 RecognitionConfidence : 225
 Id : 110 LineId : 0 Text : connaître 		 RegionId : 11 FontId : 1 RecognitionConfidence : 225
 Id : 111 LineId : 0 Text : le 		 RegionId : 11 FontId : 1 RecognitionConfidence : 225
 Id : 112 LineId : 0 Text : fonctionnement 		 RegionId : 11 FontId : 1 RecognitionConfidence : 224
 Id : 113 LineId : 0 Text : de 		 RegionId : 11 FontId : 1 RecognitionConfidence : 225
 Id : 114 LineId : 0 Text : ce 		 RegionId : 11 FontId : 1 RecognitionConfidence : 225
 Id : 115 LineId : 0 Text : wikit, 		 RegionId : 11 FontId : 1 RecognitionConfidence : 102
 Id : 116 LineId : 0 Text : consultez 		 RegionId : 11 FontId : 1 RecognitionConfidence : 216
 Id : 117 LineId : 0 Text : l’Aide. 		 RegionId : 11 FontId : 1 RecognitionConfidence : 171
 Id : 118 LineId : 0 Text : L’ensemble 		 RegionId : 12 FontId : 1 RecognitionConfidence : 188
 Id : 119 LineId : 0 Text : des 		 RegionId : 12 FontId : 1 RecognitionConfidence : 225
 Id : 120 LineId : 0 Text : participants 		 RegionId : 12 FontId : 1 RecognitionConfidence : 227
 Id : 121 LineId : 0 Text : au 		 RegionId : 12 FontId : 1 RecognitionConfidence : 225
 Id : 122 LineId : 0 Text : wiki 		 RegionId : 12 FontId : 1 RecognitionConfidence : 216
 Id : 123 LineId : 0 Text : tcl 		 RegionId : 12 FontId : 1 RecognitionConfidence : 214
 Id : 124 LineId : 0 Text : francophone 		 RegionId : 12 FontId : 1 RecognitionConfidence : 223
 Id : 125 LineId : 0 Text : vous 		 RegionId : 12 FontId : 1 RecognitionConfidence : 225
 Id : 126 LineId : 0 Text : souhaite 		 RegionId : 12 FontId : 1 RecognitionConfidence : 225
 Id : 127 LineId : 0 Text : une 		 RegionId : 12 FontId : 1 RecognitionConfidence : 225
 Id : 128 LineId : 0 Text : bonne 		 RegionId : 12 FontId : 1 RecognitionConfidence : 230
 Id : 129 LineId : 0 Text : visite 		 RegionId : 12 FontId : 1 RecognitionConfidence : 225
 Id : 130 LineId : 0 Text : sur 		 RegionId : 12 FontId : 1 RecognitionConfidence : 225
 Id : 131 LineId : 0 Text : ses 		 RegionId : 12 FontId : 1 RecognitionConfidence : 225
 Id : 132 LineId : 0 Text : pages. 		 RegionId : 12 FontId : 1 RecognitionConfidence : 205
 Id : 133 LineId : 0 Text : Ce 		 RegionId : 13 FontId : 1 RecognitionConfidence : 225
 Id : 134 LineId : 0 Text : site 		 RegionId : 13 FontId : 1 RecognitionConfidence : 225
 Id : 135 LineId : 0 Text : est 		 RegionId : 13 FontId : 1 RecognitionConfidence : 225
 Id : 136 LineId : 0 Text : dédié 		 RegionId : 13 FontId : 1 RecognitionConfidence : 225
 Id : 137 LineId : 0 Text : à 		 RegionId : 13 FontId : 1 RecognitionConfidence : 228
 Id : 138 LineId : 0 Text : la 		 RegionId : 13 FontId : 1 RecognitionConfidence : 225
 Id : 139 LineId : 0 Text : mémoire 		 RegionId : 13 FontId : 1 RecognitionConfidence : 225
 Id : 140 LineId : 0 Text : de 		 RegionId : 13 FontId : 1 RecognitionConfidence : 226
 Id : 141 LineId : 0 Text : Maurice 		 RegionId : 13 FontId : 1 RecognitionConfidence : 217
 Id : 142 LineId : 0 Text : “ulis 		 RegionId : 13 FontId : 1 RecognitionConfidence : 0
 Id : 143 LineId : 0 Text : Bredelet 		 RegionId : 13 FontId : 1 RecognitionConfidence : 213
 Id : 144 LineId : 0 Text : qui 		 RegionId : 13 FontId : 1 RecognitionConfidence : 225
 Id : 145 LineId : 0 Text : fut 		 RegionId : 13 FontId : 1 RecognitionConfidence : 225
 Id : 146 LineId : 0 Text : run 		 RegionId : 13 FontId : 1 RecognitionConfidence : 218
 Id : 147 LineId : 0 Text : de 		 RegionId : 13 FontId : 1 RecognitionConfidence : 225
 Id : 148 LineId : 0 Text : ses 		 RegionId : 13 FontId : 1 RecognitionConfidence : 225
 Id : 149 LineId : 0 Text : principaux 		 RegionId : 13 FontId : 1 RecognitionConfidence : 230
 Id : 150 LineId : 0 Text : contributeurs. 	RegionId : 13 FontId : 1 RecognitionConfidence : 127

Remarque : Si vous faites des tests avec divers langages, vous noterez que l'OCR a un taux de réussite plus élevé en anglais.

References :

- http://msdn.microsoft.com/en-us/library/aa202819%28v=office.11%29.aspx

- http://www.documentsnap.com/using-microsoft-office-document-imaging-to-ocr-for-free/