Sophie

Sophie

distrib > Mandriva > 9.0 > i586 > by-pkgid > 0d5cd12c82d627a82c59047e1ba7b8a9 > files > 1126

howto-html-fr-9.0-0.2mdk.noarch.rpm

<HTML>
<HEAD>
<TITLE>Les filtres</TITLE>
</HEAD>
<BODY>
<H1>8. <A NAME="s8"></A>Les filtres</H1>
<P>
<A HREF="Printing-HOWTO.html#toc8">Contenu de cette section</A></P>

<P></P>
<P>Si  avec  les  explications pr&eacute;c&eacute;dentes,  tout  marche  c'est
formidable, mais en r&egrave;gle g&eacute;n&eacute;ral, cela ne suffit pas.
Regardez   ci-dessous ce que l'on  obtient   sur  la  DeskJet 500,  lorsque
j'envoie un fichier texte:</P>
<P>
<BLOCKQUOTE><CODE>
<PRE>
Ceci est la premiere ligne.
                           Celle-ci est la deuxieme.
                                                    Voici la troisieme.
</PRE>
</CODE></BLOCKQUOTE>
</P>
<P>Et alors l'impression    d'un fichier <I>PostScript</I>...   Vous obtenez  le
listing complet    du  code <I>PostScript</I>  avec    les  m&ecirc;me effets
d'escalier. Une horreur.</P>
<P></P>
<P></P>
<P>Il faut donc quelque chose de plus et c'est  le r&ocirc;le des filtres. Les
plus observateurs   d'entre  vous  auront  peut-&ecirc;tre  remarqu&eacute;
l'existence des param&egrave;tres <CODE>if</CODE> (input filter) et <CODE>of</CODE>
(output filter) dans le fichier printcap.  Pour l'instant nous avons besoin
de <CODE>if</CODE>.</P>
<P></P>
<P></P>
<P>Un filtre  est    un  simple  programme  ex&eacute;cutable  qui    lit  les
donn&eacute;es  sur son entr&eacute;e  standard  et sort le r&eacute;sultat
sur sa sortie standard.</P>
<P></P>
<P></P>
<P>Commen&ccedil;ons par  &eacute;crire   un    script que vous     appellerez
<CODE>filtre</CODE> et qui ajoute des retours chariot avant chaque caract&egrave;re
fin de ligne.  Ceci &eacute;limine l'effet d'escalier.</P>
<P>
<BLOCKQUOTE><CODE>
<PRE>
     #!/usr/local/bin/perl
     # La ligne ci-dessous doit contenir le chemin complet vers perl
     # Ce script doit etre executable: chmod 755 filtre
     while(&lt;STDIN&gt;){chop $_; print &quot;$_\r\n&quot;;};
     # Vous pouvez aussi vouloir terminer avec une fin de page: print &quot;\f&quot;;
</PRE>
</CODE></BLOCKQUOTE>
</P>
<P>Dans   <CODE>/etc/printcap</CODE>,   l'entr&eacute;e  est  modifi&eacute;e   en
cons&eacute;quence:</P>
<P>
<BLOCKQUOTE><CODE>
<PRE>
lp|dj|deskjet:\
             :sd=/var/spool/lpd/dj:\
             :mx#0:\
             :lp=/dev/lp0:\
             :if=/var/spool/lpd/dj/filtre:\
             :sh:
</PRE>
</CODE></BLOCKQUOTE>
</P>
<P>Essayez  d'&eacute;crire le filtre en shell  qui sera  plus efficace que de
charger <CODE>perl</CODE>. Bon allez, je vous aide un peu:</P>
<P>
<BLOCKQUOTE><CODE>
<PRE>
     #!/bin/sh
     if [ &quot;$1&quot; = -c ]; then
       cat
     else
       sed -e s/$/^M/
     fi
     # echo -ne suppose que /bin/sh correspond a bash
     echo -ne \\f
</PRE>
</CODE></BLOCKQUOTE>
</P>
<P>Notez que  '&circ;M' symbolise le caract&egrave;re  retour-chariot et non pas un
`&circ;' suivi d'un 'M'. Dans emacs, pour saisir  ce caract&egrave;re, entrez la
s&eacute;quence <CODE>C-q  C-m</CODE>,    alors que  sous  vi, entrez   <CODE>C-v
C-m</CODE>.   Le    test  de $1   permet    d'invalider l'insertion du
retour-chariot par la commande  <CODE>lpr  -l</CODE> A savoir que  <CODE>lpr</CODE>
g&eacute;n&egrave;re  des  param&egrave;tres qui   sont  pass&eacute;s   au
filtre. Par d&eacute;faut  il passe <CODE>-w0</CODE>.   Si l'option <CODE>-l</CODE>
est donn&eacute;e, il  passe <CODE>-c</CODE>.  Ce script est traditionnellement
nomm&eacute; <CODE>/usr/lib/lpf</CODE>.  Si vous avez  plusieurs scripts de  la
sorte, une  bonne id&eacute;e consiste  &agrave;  les  mettre tous dans  un
sous-r&eacute;pertoire, par exemple <CODE>/usr/lib/lpd</CODE>.</P>
<P></P>
<P></P>
<P>Il se peut aussi que votre imprimante puisse passer dans un mode permettant
l'ajout  de  retour-chariots  gr&acirc;ce    &agrave; une   s&eacute;quence
d'&eacute;chappement. Voici   un  exemple de filtre  utilisant  la commande
<CODE>echo -ne</CODE> pour envoyer cette s&eacute;quence:</P>
<P>
<BLOCKQUOTE><CODE>
<PRE>
     #!/bin/sh
     # Filtre pour imprimantes HP, permettant de traiter LF comme CRLF
     # La commande echo -ne suppose que /bin/sh correspond a bash
     echo -ne \\033&amp;amp;k2G
     cat
     echo -ne \\f
</PRE>
</CODE></BLOCKQUOTE>
</P>
<P>Vous pouvez compliquer  les filtres  comme bon  vous  semble. Le mieux  est
d'avoir un  filtre qui  reconna&icirc;t le  fichier  d'entr&eacute;e et  le
convertit   au bon format   pour   votre imprimante.   Un  tel filtre   est
appel&eacute;  filtre magique.   Ne  vous emb&ecirc;tez  pas  &agrave;  les
&eacute;crire         vous-m&ecirc;me,  il    en    existe   s&ucirc;rement
d&eacute;j&agrave;  un  qui        vous  convient.    Allez    voir     sur
<CODE>tsx-11.mit.edu:/pub/linux/sources/usr.bin/magic-filter-x.y.tar.gz</CODE>.</P>
<P></P>
<P></P>
<P></P>
<HR>
<P>
Chapitre <A HREF="Printing-HOWTO-9.html">suivant</A>,
Chapitre <A HREF="Printing-HOWTO-7.html">Pr&eacute;c&eacute;dent</A>
<P>
Table des mati&egrave;res de <A HREF="Printing-HOWTO.html#toc8">ce chapitre</A>,
 <A HREF="Printing-HOWTO.html#toc">Table des mati&egrave;res</A> g&eacute;n&eacute;rale</P>
<P>
<A HREF="Printing-HOWTO.html">D&eacute;but</A> du document,
 <A HREF="#0"> D&eacute;but de ce chapitre</A></P>
</BODY>
</HTML>