Page suivantePage précédenteTable des matières

8. Les filtres

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:

Ceci est la premiere ligne.
 Celle-ci est la deuxieme.
 Voici la troisieme.

Et alors l'impression d'un fichier PostScript... Vous obtenez le listing complet du code PostScript avec les même effets d'escalier. Une horreur.

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 if (input filter) et of (output filter) dans le fichier printcap. Pour l'instant nous avons besoin de if.

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.

Commençons par écrire un script que vous appellerez filtre et qui ajoute des retours chariot avant chaque caractère fin de ligne. Ceci élimine l'effet d'escalier.

 #!/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";

Dans /etc/printcap, l'entrée est modifiée en conséquence:

lp|dj|deskjet:\
 :sd=/var/spool/lpd/dj:\
 :mx#0:\
 :lp=/dev/lp0:\
 :if=/var/spool/lpd/dj/filtre:\
 :sh:

Essayez d'écrire le filtre en shell qui sera plus efficace que de charger perl. Bon allez, je vous aide un peu:

 #!/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

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 C-q C-m, alors que sous vi, entrez C-v C-m. Le test de $1 permet d'invalider l'insertion du retour-chariot par la commande lpr -l A savoir que lpr génère des paramètres qui sont passés au filtre. Par défaut il passe -w0. Si l'option -l est donnée, il passe -c. Ce script est traditionnellement nommé /usr/lib/lpf. Si vous avez plusieurs scripts de la sorte, une bonne idée consiste à les mettre tous dans un sous-répertoire, par exemple /usr/lib/lpd.

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 echo -ne pour envoyer cette séquence:

 #!/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&k2G
 cat
 echo -ne \\f

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 tsx-11.mit.edu:/pub/linux/sources/usr.bin/magic-filter-x.y.tar.gz.


Page suivantePage précédenteTable des matières