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
.