<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Artisan Numérique</title>
  <link rel="alternate" type="text/html" href="http://artisan.karma-lab.net/node/1159"/>
  <link rel="self" type="application/atom+xml" href="http://artisan.karma-lab.net/node/1159/atom/feed"/>
  <id>http://artisan.karma-lab.net/node/1159/atom/feed</id>
  <updated>2008-08-07T19:17:04+02:00</updated>
  <entry>
    <title>Installer un serveur de numérisation, SANE</title>
    <link rel="alternate" type="text/html" href="http://artisan.karma-lab.net/node/1159" />
    <id>http://artisan.karma-lab.net/node/1159</id>
    <published>2008-08-07T12:35:40+02:00</published>
    <updated>2008-08-07T19:17:04+02:00</updated>
    <author>
      <name>Ulhume</name>
    </author>
    <category term="Matériel" />
    <category term="OK" />
    <category term="Planet Libre" />
    <category term="Tutoriel" />
    <summary type="html"><![CDATA[<p>
  L'objectif ici est d'installer le scanner USB en utilisant les outils du projet SANE. Une procédure très simple en soit avec juste quelques "pièges" qu'il est utile d'éviter pour ne pas perdre de temps.
</p>
    ]]></summary>
    <content type="html"><![CDATA[<p>
  L'objectif ici est d'installer le scanner USB en utilisant les outils du projet SANE. Une procédure très simple en soit avec juste quelques "pièges" qu'il est utile d'éviter pour ne pas perdre de temps.
</p>
<!--break-->

	<a name='chapter_1'></a>
  <h2>Le logiciel SANE</h2>
	

<p>
  Un petit mot sur SANE tout d'abord. Ce projet apporte à un système unix un support unifié de toutes les périphériques d'acquisition d'image. Ce va de la WebCam à la carte TNT en passant bien évidemment par les scanners. Outre ce support, SANE permet de publier un scanner sur votre réseau et ainsi de le rendre utilisable sur d'autre machines. A ce titre SANE est l'équivalent de CUPS mais pour l'acquisition. Le support des WebCam et autre carte TV est en soit anecdotique, il s'agit d'un driver générique qui utilise le système V4L (Vidéo4Linux). Le support des scanners est le vrai métier de SANE. 
</p>
<p>
  A noter enfin que le partage des scanners publiés par SANE ne se limite pas au monde Unix. Vous pouvez les utiliser avec <a class='external' target='_blank' href='http://www.ellert.se/twain-sane/' >Max/OSX</a>, mais aussi sous <a class='external' target='_blank' href='http://sanetwain.ozuzo.net/' >Windows</a>. 
</p>
<p>
  Ce qui suit n'est pas spécifique à un scanner, je prends juste le mien comme exemple pour illustrer la démarche.
</p>


	<a name='chapter_2'></a>
  <h2>Les drivers Epson</h2>
	
<p>
  Pour commence un petit point sur les drivers. Epson fait parti de ces fabriquant à disposer de drivers pour Linux. C'est assez rare pour être salué et c'est d'ailleurs ce qui fait que je n'achète dans ce domaine (numérisation, impression) que du matériel Epson. la RX640 n'échappe pas à la règle et son drivers se trouve sur le site de la société <a class='external' target='_blank' href='http://www.avasys.jp/english' >Avasys</a> qui semble être une filiale dédiée au développement Linux. Il sont fournis AVEC les sources, sous licence GPL, ce qui est encore plus rare (A titre d'information, les pilotes Linux des cartes nVidia ne sont fournit qu'en binaire fermés). Un aspect qui n'est pas négligeable car du coup le pilote Epson pour la RX640 est déjà intégré dans Saned. Il n'y a donc rien à faire de ce côté qu'installer SANE. 
</p>

	<a name='chapter_3'></a>
  <h2>Installation de SANE</h2>
	
<p>
  Comme toujours, nous commençons par une installation de paquets (urpmi ou apt-get sane). Ceci fait, la première chose à vérifier est la présence sur le serveur du scanner (qui doit être branché <img src="http://artisan.karma-lab.net/sites/all/modules/contrib/smileys/packs/crystal/wink2.gif" title="Wink" alt="Wink" class="smiley-content"/>. Pour cela, lancer la commande :
  
  <div class='code-block code-block-traces'>
  <div class='container'>
  <div class='command'><span class='prompt'>root#</span>sane-find-scanner</div><div class='result'>(...)</div><div class='result'>found USB scanner (vendor=0x04b8, product=0x081c) at libusb:003:004</div><div class='result'>(...)</div><div class='command'><span class='prompt'>root#</span><span class='cursor'>&nbsp;</span></div>
  </div>
  
  </div>
</p>
<p>
  Parfait, le scanner est visible. Si ce n'était pas le cas, tentez un <kbd>lsusb</kbd> pour vérifier s'il est connu du module USB de Linux. Maintenant, nous allons déterminer si SANE a bien un driver pour notre scanner. Pour cela, lancez la commande :
  
  <div class='code-block code-block-traces'>
  <div class='container'>
  <div class='command'><span class='prompt'>root#</span>scanimage -L</div><div class='result'>device `epkowa:libusb:003:004' is a Epson Stylus Photo Rx640/RX650 flatbed scanner</div><div class='command'><span class='prompt'>root#</span><span class='cursor'>&nbsp;</span></div>
  </div>
  
  </div>
</p>
<p>
  (Re)parfait. Comme je le disais plus haut, le driver Epson GPL (alias epkowa) est déjà intégré dans Sane. A ce stade le scanner est reconnu en local. Nous allons maintenant publier cette périphérique sur le réseau.
</p>


	<a name='chapter_4'></a>
  <h2>Publication sur le réseau</h2>
	
<p>
  Première chose à faire, vérifier que le port de SANE, 6566, est présente dans la liste des ports connus par votre serveur. Pour cela, éditer le fichier <kbd>/etc/services</kbd> et rechercher la chaîne <kbd>6566</kbd>. Si cette ligne existe, vérifiez qu'elle correspond à ce qui suit, sinon, ajoutez là :
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  sane <span class="nu0">6566</span><span class="sy0">/</span>tcp saned <span class="co0"># SANE network scanner daemon</span>
  </div>
  
  </div>
</p>
<p>
  Le démon <kbd>saned</kbd> n'est pas lancé en permanence sur le serveur. Ce serait idiot de prendre de la mémoire pour un service qui ne sert pas tout le temps. A la place, est utilisé le démon <a class='external' target='_blank' href='//node/88' >xinetd</a>. Ce dernier va seulement se placer en écoute du port de SANE et le lancer lorsque quelqu'un va chercher à s'y connecter. 
</p>
<p>
  Il faut donc éditer le fichier qui a du être crée à l'installation de SANE, <kbd>/etc/xinetd.d/sane</kbd> et vérifier qu'il correspond à cela :
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  &nbsp; &nbsp; <span class="co0"># default: off</span><br />
<span class="co0"># description: The sane server accepts requests \</span><br />
<span class="co0"># for network access to a local scanner via the \</span><br />
<span class="co0"># network.</span><br />
service sane<br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; disable = no<br />
&nbsp; &nbsp; &nbsp; &nbsp; port &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;= <span class="nu0">6566</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; socket_type &nbsp; &nbsp; = stream<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">wait</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;= no<br />
&nbsp; &nbsp; &nbsp; &nbsp; <a target="blank" href="http://pwet.fr/man/linux/commandes/groups"><span class="kw2">groups</span></a> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;= <a target="blank" href="http://pwet.fr/man/linux/commandes/yes"><span class="kw2">yes</span></a><br />
&nbsp; &nbsp; &nbsp; &nbsp; user &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;= saned<br />
&nbsp; &nbsp; &nbsp; &nbsp; group &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; = saned<br />
&nbsp; &nbsp; &nbsp; &nbsp; server &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;= <span class="sy0">/</span>usr<span class="sy0">/</span>sbin<span class="sy0">/</span>saned<br />
<span class="br0">&#125;</span>
  </div>
  
  </div>
</p>
<p>
  Le point à valider est que la première ligne soit bien <kbd>service sane</kbd> et non pas <kbd>service sane-port</kbd> comme ce fût le cas pour moi. Sans cela, xinetd n'arrive pas à retrouver le nom du service et désactive sane. 
</p>
<p>
  Une fois ceci validé, relancez <kbd>xinetd</kbd> via un <kbd>service xinetd restart</kbd> et vérifiez que le port est bien en écoute par la commande suivante :
<traces type="sh">
  ##netstat -anlp | grep 6566
  tcp        0      0 0.0.0.0:6566                0.0.0.0:*                   LISTEN      7580/xinetd
</traces
</p>
<p>
  A ce stade le scanner est publié, vous pouvez donc aller sur une autre machine pour vérifier son bon fonctionnement. 
</p>

	<a name='chapter_5'></a>
  <h2>Paramétrage du poste client</h2>
	
<p>
  Sur le poste client, SANE doit aussi être installé. Ceci fait, il n'est nécessaire que de modifier le fichier <kbd>/etc/sane.d/net.conf</kbd> pour y ajouter le nom de la machine à laquelle est connecté votre scanner. Imaginons qu'elle s'appelle <kbd>serveur_scanner</kbd>, vous devez donc avoir dans <kbd>/etc/sane.d/net.conf</kbd> la ligne :
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  serveur_scanner
  </div>
  
  </div>
</p>
<p>
  Une fois le fichier sauvé, il suffit de vérifier que le scanner est bien visible en réutilisant la commande <kbd>scanimage</kbd>
  <traces type="sh">
    ##scanimage -L
    device `net:serveur_scanner:epkowa:libusb:003:004' is a Epson Stylus Photo Rx640/RX650 flatbed scanner
  </traces
</p>
<p>
  Le scanner est donc bien visible et prêt à être utilisé, par exemple via la commande scanimage elle-même :
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  scanimage --mode color --resolution <span class="nu0">150</span> -d net:serveur_scanner:epkowa:libusb:<span class="nu0">003</span>:<span class="nu0">004</span> <span class="sy0">&gt;</span> mon_image
  </div>
  
  </div>
</p>
<p>
  Et voilà. 
</p>


	<a name='chapter_6'></a>
  <h2>Petit script de scan</h2>
	
<p>
   Pour terminer, voyons comment utiliser <kbd>scanimage</kbd> pour automatiser des numérisations nombreuses (genre un acte de propriété de 50 pages, au hasard <img src="http://artisan.karma-lab.net/sites/all/modules/contrib/smileys/packs/crystal/wink2.gif" title="Wink" alt="Wink" class="smiley-content"/> 
   
  <div class='code-block code-block-fragment'>
  <div class='container'>
  <span class="co0">#! /bin/sh</span><br />
<span class="co0"># paramétres </span><br />
<span class="re2">target_name=</span><span class="st0">&quot;$1&quot;</span> &nbsp;<span class="co0"># Nom du fichier final</span><br />
<span class="re2">page_count=</span><span class="st0">&quot;$2&quot;</span> <span class="co0"># optionnel, le nombre de feuilles à numériser</span><br />
<br />
<span class="co0"># on supprime le dossier temporaire de numérisation, on le recrée et on s'y place</span><br />
<span class="kw1">if</span> <span class="br0">&#91;</span> -d scans <span class="br0">&#93;</span> ; <span class="kw1">then</span><br />
&nbsp; <a target="blank" href="http://pwet.fr/man/linux/commandes/rm"><span class="kw2">rm</span></a> -rf scans<br />
<span class="kw1">fi</span><br />
<a target="blank" href="http://pwet.fr/man/linux/commandes/mkdir"><span class="kw2">mkdir</span></a> scans<br />
<span class="kw3">cd</span> scans<br />
<br />
<span class="co0"># utilisation de scanimage pour déterminer l'adresse de notre scanner</span><br />
<span class="re2">scanner_usb_id=</span>$<span class="br0">&#40;</span> scanimage -L <span class="sy0">|</span> <a target="blank" href="http://pwet.fr/man/linux/commandes/grep"><span class="kw2">grep</span></a> epkowa <span class="sy0">|</span> <a target="blank" href="http://pwet.fr/man/linux/commandes/cut"><span class="kw2">cut</span></a> -d <span class="st0">&quot;<span class="es0">\`</span>&quot;</span> -f2 <span class="sy0">|</span> <a target="blank" href="http://pwet.fr/man/linux/commandes/cut"><span class="kw2">cut</span></a> -d<span class="st0">&quot;'&quot;</span> -f1<span class="br0">&#41;</span><br />
<br />
<span class="co0"># options de numérisation par défaut</span><br />
<span class="re2">scanimage_options=</span><span class="st0">&quot;--mode color --resolution 150 -d $scanner_usb_id&quot;</span><br />
<br />
<span class="co0"># Choix entre 1 et plusieurs pages. </span><br />
<span class="kw1">if</span> <span class="br0">&#91;</span> <span class="sy0">!</span> -z <span class="re1">$page_count</span> <span class="br0">&#93;</span> ; <span class="kw1">then</span><br />
&nbsp; <span class="kw3">echo</span> <span class="st0">&quot;Génération des fichiers sur le modèle $TIME_STAMP&quot;</span><br />
&nbsp; scanimage <span class="re1">$scanimage_options</span> --<span class="re2">batch=</span><span class="st0">&quot;$target_name %d&quot;</span> &nbsp;--batch-count <span class="re1">$page_count</span> --batch-prompt<br />
<span class="kw1">else</span><br />
&nbsp; scanimage <span class="re1">$scanimage_options</span> <span class="sy0">&gt;</span> <span class="re1">$target_name</span><br />
<span class="kw1">fi</span><br />
<br />
<span class="co0"># conversion de toutes les images en JPEG</span><br />
<span class="kw1">for</span> <a target="blank" href="http://pwet.fr/man/linux/commandes/file"><span class="kw2">file</span></a> <span class="kw1">in</span> <span class="sy0">*</span> ; <span class="kw1">do</span> <br />
&nbsp; <span class="kw3">echo</span> <span class="st0">&quot;Conversion de $file en jpg&quot;</span><br />
&nbsp; convert -quality <span class="nu0">80</span> <span class="st0">&quot;$file&quot;</span> <span class="st0">&quot;$file.jpg&quot;</span><br />
&nbsp; <a target="blank" href="http://pwet.fr/man/linux/commandes/rm"><span class="kw2">rm</span></a> -rf <span class="st0">&quot;$file&quot;</span><br />
<span class="kw1">done</span><br />
<br />
<span class="co0"># Si nous avons plus d'une page, on converti les JPEG en un seul document PDF</span><br />
<span class="kw1">if</span> <span class="br0">&#91;</span> <span class="sy0">!</span> -z <span class="re1">$page_count</span> <span class="br0">&#93;</span> ; <span class="kw1">then</span><br />
&nbsp; &nbsp;convert <span class="sy0">*</span> <span class="st0">&quot;../$target_name.pdf&quot;</span><br />
<span class="kw1">else</span><br />
&nbsp; &nbsp;<a target="blank" href="http://pwet.fr/man/linux/commandes/mv"><span class="kw2">mv</span></a> -f <span class="sy0">*</span> ..<br />
<span class="kw1">fi</span><br />
&nbsp; &nbsp;<span class="kw3">cd</span> ..<br />
<br />
<span class="co0"># ménage</span><br />
<a target="blank" href="http://pwet.fr/man/linux/commandes/rm"><span class="kw2">rm</span></a> -rf scans
  </div>
  
  </div>
</p>
<p>
  Il a l'air de rien ce script mais il est très très pratique. Lancé avec un nom de fichier en paramètre, il va scanner et générer le fichier JPEG correspondant.
</p>
<p>
  Et si vous indiquez en plus du nom de fichier, un nombre de pages à scanner, il fabriquera cette fois un PDF de toutes les pages scannées. 
</p>


	<a name='chapter_7'></a>
  <h2>Conclusion</h2>
	
<p>
  SANE est un projet mature qui fonctionne merveilleusement bien. Si vous n'avez pas envie de jouer à la ligne de commande, il existe de très nombreux frontaux graphiques qui le prennent en charge. Citons Kooka sous KDE,  XSane ou le tout jeune projet <a class='external' target='_blank' href='http://live.gnome.org/GnomeScan' >GnomeScan</a>.
</p>    ]]></content>
  </entry>
</feed>
