Scanner des documents en C# (WPF)

Scanner des documents en C# (WPF)

Dernièrement j’ai eu à travailler sur un ERP qui demander de faire du scan de document et au tout début j’ai cherché plusieurs solutions mais malgré ça je n’en avais trouvé aucune qui était non payante mais au bout d’un moment j’ai fini par tombé sur TWAIN qui se trouve à la base une librairie Native écrite en C qui par la suite a été traduit en librairie Managé .NET assurant la communication entre le logiciel et les appareils numériques (Scanner, appareil photo numérique).

Disponible et utilisable sur des projets type Console, Winform, WPF du .NET 3.5 et plus…

TWAIN prend en charge la plupart des marques tels que HP, Canon, EPSON,Kodak, …

Projet complet de la démo : https://github.com/DanKyungu/NTwainScanProject

Alors comment fonctionne TWAIN ?

La première des choses à faire quand on travaille avec TWAIN est d’initialiser l’objet TWAINSession qui est chargé de contrôler toutes les interactions et configurations entre le logiciel et l’appareil.

Donc afin de rester plus pragmatique, nous allons créer une application qui nous permettra de scanner un document en WPF et dans cette circonstance nous aurons à implémenter le pattern MVVM (Model-View-ViewModel) et utilisant de ses framework MVVMLight de Laurent Bugnion.

  • Alors pour commencer nous allons par créer un nouveau projet WPF
  • Ajouter le Nuget Package « NTwain »
  • Ajouter aussi le Nuget Package « Galasoft MVVM Light »
  • Structurer notre projet de sorte à avoir :
    • Model
    • View
    • ViewModel
      • MainViewModel (ViewModel de la fenetre principal MainWindow)
      • DataSourceVM (Encapsulateur du DataSource de NTwain)

Avant de nous plonger complètement dans le code behind, voici comment se présente notre interface graphique :

Quelques principes de base de Twain

  • Toujours initialiser l’objet TwainSession qui prend en paramètre TWIdentity l’Id de l’instance de notre application donc l’assembly courant.
  • A partir de l’objet TwainSession s’enregistrer sur ses différents évènements tels que :
    • TransferReady : Déclencher lors du début de la capture du document.
    • TransferError : Déclencher lors d’une erreur Durant le processus.
    • DataTransferred : Déclencher à la fin du processus et vous permettant de capturer l’image est de la convertir au format voulue.
    • StateChanged : Déclencher lors du changement d’état de l’objet TwainSession, que nous verrons bientôt dans cette article.

Cette liste des n’est pas exhaustives et donc essayons aussi d’énumérer ses principaux états :

  • 0 (Invalid) : Etat par défaut de l’instance.
  • 1 (DsmUnloaded) : L’état indiquant le démarrage.
  • 2 (DsmLoaded) : Indique que la Library a été chargé avec succès.
  • 3 (DsmOpened) : Indique que l’ouverture de la Library.
  • 4 (SourceOpened) : Indique que l’ouverture de la DataSource (très important car ce n’est qu’après avoir ouvert une DataSource sur la session qu’on peut capture un document et le DataSource représente un périphérique ici un scanner on peut-on en avoir plusieurs).
  • 5 (SourceEnabled) : Indique qu’une DataSource a été activer.
  • 6 (TransferReady) : Indique que les données que sont prêt d’être transférer de la source.
  • 7 (Transferring) : Indique que les données ont été transférer avec succès.

Dernière chose à savoir c’est qu’on peut aussi régler le type de sortie :

  • Native
  • Memory
  • File

Et que vous pouvez aussi paramétrer la résolution, la couleur de sortie,…

Donc voici le constructeur de notre MainWindowViewModel :

Et pour la capture du document, la logique est implémentée dans la command CaptureCommand :

Voici le projet final et son fonctionnement, son code source complet est disponible sur mon GitHub et le projet NTwain sur bitbucket.

https://github.com/DanKyungu/NTwainScanProject

https://twain.org/

https://bitbucket.org/soukoku/ntwain

About Dan Kyungu

Check Also

Test Driven Development (C#)

Salut, Aujourd’hui nous parlerons sur le TDD (Test Driven Development). Le TDD est une méthodologie …

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *