<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écédentes, tout marche c'est formidable, mais en règle géné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ême effets d'escalier. Une horreur.</P> <P></P> <P></P> <P>Il faut donc quelque chose de plus et c'est le rôle des filtres. Les plus observateurs d'entre vous auront peut-être remarqué l'existence des paramè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écutable qui lit les données sur son entrée standard et sort le résultat sur sa sortie standard.</P> <P></P> <P></P> <P>Commençons par écrire un script que vous appellerez <CODE>filtre</CODE> et qui ajoute des retours chariot avant chaque caractère fin de ligne. Ceci é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(<STDIN>){chop $_; print "$_\r\n";}; # Vous pouvez aussi vouloir terminer avec une fin de page: print "\f"; </PRE> </CODE></BLOCKQUOTE> </P> <P>Dans <CODE>/etc/printcap</CODE>, l'entrée est modifiée en consé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'é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 [ "$1" = -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 'ˆM' symbolise le caractère retour-chariot et non pas un `ˆ' suivi d'un 'M'. Dans emacs, pour saisir ce caractère, entrez la sé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énère des paramètres qui sont passés au filtre. Par défaut il passe <CODE>-w0</CODE>. Si l'option <CODE>-l</CODE> est donnée, il passe <CODE>-c</CODE>. Ce script est traditionnellement nommé <CODE>/usr/lib/lpf</CODE>. Si vous avez plusieurs scripts de la sorte, une bonne idée consiste à les mettre tous dans un sous-ré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âce à une séquence d'échappement. Voici un exemple de filtre utilisant la commande <CODE>echo -ne</CODE> pour envoyer cette sé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;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ît le fichier d'entrée et le convertit au bon format pour votre imprimante. Un tel filtre est appelé filtre magique. Ne vous embêtez pas à les écrire vous-même, il en existe sûrement déjà 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écédent</A> <P> Table des matières de <A HREF="Printing-HOWTO.html#toc8">ce chapitre</A>, <A HREF="Printing-HOWTO.html#toc">Table des matières</A> générale</P> <P> <A HREF="Printing-HOWTO.html">Début</A> du document, <A HREF="#0"> Début de ce chapitre</A></P> </BODY> </HTML>