Chapitre 6. Imprimer

Table des matières
6.1. Activer le démon d'impression
6.2. Configurer /etc/printcap
6.3. Configurer Ghostscript
6.4. Commandes de gestion d'imprimantes
6.5. Imprimer en réseau

Ce chapitre décrit une configuration d'impression simplifiée qui utilise une imprimante HP Deskjet 690C connectée au premier port parallèle comme exemple. Tout d'abord, le système sera configuré pour imprimer des documents texte puis la configuration sera étendue vers l'impression de fichiers PostScript à l'aide du programme Ghostscript.

6.1. Activer le démon d'impression

Une fois l'installation achevée, il n'est pas encore possible d'imprimer car le démon d'impression, lpd, n'est pas activé. Pour l'activer, il faut changer une ligne du fichier /etc/rc.conf. Passer de:

lpd=NO    

à

lpd=YES    

La modification sera effective au prochain démarrage mais vous pouvez quand même lancer le démon à la main:

# lpd -s    

Pour vérifier que lpd est bien actif, tapez:

# ps ax | grep lpd
  179 ??  Is     0:00.01 lpd     

Si vous n'obtenez rien en réponse, c'est que le démon n'est pas actif.

Avant de configurer /etc/printcap, mieux vaut effectuer un test d'imprimante pour vérifier que les connexions sont correctes. Par exemple:

# lptest 20 10 > /dev/lpt0    

Pour voir ce qui est envoyé à l'imprimante, relancez la même commande mais sans la redirection:

# lptest 20 10    

Le problème le plus fréquent est que les colonnes imprimées ne sont pas bien allignées mais forment des escaliers. C'est parce qu'il arrive que l'imprimante soit configurée pour passer à la ligne chaque fois qu'elle reçoit les caractères " CR"  (retour chariot, ASCII 13) et " LF"  (saut de ligne, ASCII 10). NetBSD n'envoie que le caractère " LF" . Vous pouvez corriger le problème:

Note : Dans l'exemple précédent, le gestionnaire lpd n'est pas invoqué puisque l'affichage du programme est directement envoyé sur l'imprimante (/dev/lpt0) sans passer par le disque dur.

6.2. Configurer /etc/printcap

Cette section explique comment configurer l'imprimante exemple pour imprimer des documents texte.

L'imprimante doir avoir une entrée dans le fichier /etc/printcap qui doit contenir son identifiant (son nom) et sa description. L'identifiant lp est le nom par défaut utilisé par de nombreux programmes.

Exemple 6-1. /etc/printcap

lp|local printer|HP DeskJet 690C:\
        :lp=/dev/lpa0:sd=/var/spool/lpd/lp:lf=/var/log/lpd-errs:\
        :sh:pl#66:pw#80:if=/usr/local/libexec/lpfilter:      

La forme et les options du fichiers sont décrites dans la page de manuel printcap(5). Veuillez noter qu'un filtre (input filter) a été mis en place (avec l'option if) pour prendre en compte le problème d'escaliers.

if=/usr/local/libexec/lpfilter    

Pilotes d'impression et imprimantes HP : l'Exemple 6-1 utilise le périférique lpa# (pilote " polled" ) au lieu de lpd# (pilote standard à interruptions). L'utilisation des interruptions peut causer des problèmes de communication avec certaines imprimantes, dont la HP Deskjet 690C: l'impression est très lente, une page Postscript peut mettre des heures à sortir. Le problème se résoud en utilisant le pilot lpa. Il est aussi possible de compiler un noyau dans lequel lpd est " polled" .

L'entrée printcap de l'imprimante précise aussi le répertoire d'enregistrement (spool) (qui doit être créé). Celui-ci sera utilisé par le démon lpd pour accumuler les données à imprimer.

# cd /var/spool/lpd
# mkdir lp
# chown daemon:daemon lp
# chmod 770 lp
    

Il nous manque encore une information: le filtre lpfilter qui doit être écrit. La seule chose que celui-ci doit faire est de configurer l'imprimante pour éliminer le problème d'escaliers avant d'envoyer le texte à imprimer. L'imprimante utilisée dans notre exemple utilise la chaine d'initialisation "Esc &k2G".

Exemple 6-2. /usr/local/libexec/lpfilter

#!/bin/sh
# Treat LF as CR+LF
printf "\033&k2G" && cat && exit 0
exit 2    
# cd /usr/local/libexec
# chmod 755 lpfilter*
    

Note : Un autre filtre peut être utilisé:

:if=/usr/libexec/lpr/lpf:	
Ce filtre est plus complexe que le précédent. Il a été écrit pour traiter les sorties de nroff afin de gérer les soulignés et les sur-impressions, étendre les caractères tabulation et convertir les LF en CR+LF. Les sources de ce programme de filtrage se trouvent dans /usr/src/usr.sbin/lpr/filters/lpf.c.

La commande lptest peut à nouveau être lancée puis il sera temps d'utiliser la gestion d'enregistrements de lpd.

# lptest 20 10 | lpr -h    

Le programme lpr imprime du texte à l'aide du gestionnaire. L'option -h désactive l'impression de la page de garde (pas vraiment nécéssaire à cause de l'option sh dans /etc/printcap).

Il existe de nombreuses méthodes et outils pour résoudre le problème d'escaliers, par exemple un programme en C. La solution présentée a l'avantage d'être vraiment simple.

6.3. Configurer Ghostscript

Maintenant que les fonctions de base de l'imprimante fonctionnent, nous pouvons ajouter les fichiers gérant le PostScript. L'imprimante individuelle de notre exemple ne comprend pas, nativement, le PostScript. Un programme doit être utilisé pour convertir ce type de fichiers en une suite de commandes compréhensibles par l'imprimante. Le programme Ghostscript, issu de la collection de paquetages, en est capable (voir le Chapitre 8). Cette section explique comment configurer Ghostscript pour pouvoir imprimer des fichiers PostScript sur une imprimante HP Deskjet 690C.

Un second identifiant d'imprimante doit être mis en place dans /etc/printcap: il utilisera un filtre différent qui fera appel à Ghostscript pour effectuer l'impression. De cette manière, les documents texte seront imprimés avec l'imprimante lp et les documents PostScript avec ps: les deux noms utilisent la même imprimante physique mais avec des filtres différents.

Le même résultat peut être obtenu en utilisant des configurations différentes. Par exemple une unique entrée qui fait appel à un filtre capable de déterminer automatiquement le format du fichier et de lancer le programme correspondant. Cette approche est simple mais nécéssite un filtre complexe. Si cela vous plait, vous pouvez vous intéresser au programme magicfilter de la collection de paquetages: il fait cela et bien d'autres choses automatiquement.

Le nouveau fichier /etc/printcap a cette allure:

Exemple 6-3. /etc/printcap

lp|local printer|HP DeskJet 690C:\
        :lp=/dev/lpa0:sd=/var/spool/lpd/lp:lf=/var/log/lpd-errs:\
        :sh:pl#66:pw#80:if=/usr/local/libexec/lpfilter:

ps|Ghostscript driver:\
        :lp=/dev/lpa0:sd=/var/spool/lpd/ps:lf=/var/log/lpd-errs:\
        :mx#0:sh:if=/usr/local/libexec/lpfilter-ps:      

L'option mx#0 est très importante dans le cas de fichiers PostScript puisqu'elle élimine les restrictions de taille des fichiers à imprimer. Les fichiers PS ont tendance à être assez gros. L'option if pointe sur un nouveau filtre et il y a un autre répertoire d'enregistrement.

La dernière étape consiste à créer le répertoire d'enregistrement et le programme de filtrage.

# cd /var/spool/lpd
# mkdir ps
# chown daemon:daemon ps
# chmod 770 ps
    

Le programme de filtrage PostScript est beaucoup plus complexe que celui pour le texte. Le fichier à imprimer est envoyé à l'interpréteur qui, à son tour, envoie une série de commandes dans le langage de l'imprimante. Nous avons transformé une imprimante couleur bon marché en un périférique capable de traiter du PostScript, grâce au système d'exploitation NetBSD et à de puissants paquetages libres. Les options utilisées pour configurer Ghostscript sont décrites dans la documentation qui l'accompagne: cdj550 est le périférique utilisé pour piloter les imprimantes HP.

Exemple 6-4. /usr/local/libexec/lpfilter-ps

#!/bin/sh
# Treat LF as CR+LF
printf "\033&k2G" || exit 2
# Print the postscript file
/usr/pkg/bin/gs -dSAFER -dBATCH -dQUIET -dNOPAUSE -q -sDEVICE=cdj550 \
-sOutputFile=- -sPAPERSIZE=a4 - && exit 0
exit 2      

En résumé: deux noms d'imprimantes ont été créés sur le système. Ils gèrent la même imprimante physique mais utilisent des options, des filtres et des répertoires d'enregistrement différents. Les fichiers texte et les fichiers PostScript peuvent être imprimés. Pour ces derniers, le paquetage Ghostscript doit être installé.

6.4. Commandes de gestion d'imprimantes

Cette section fait la liste des commandes BSD les plus utiles pour gérer les imprimantes et les impressions. En plus des commandes lpr et lpd déjà mentionnées, nous avons:

lpq

examine la file d'attente d'impression.

lprm

efface des impressions de la file d'attente.

lpc

vérifie le système d'impression, active ou désactive une imprimante ou une fonction d'imprimante.

6.5. Imprimer en réseau

Il est possible de configurer le système d'impression afin qu'il puisse communiquer avec une imprimante connectée à un autre ordinateur. Disons, par exemple, que nous travaillons sur wotan et que nous voulons imprimer sur l'imprimante connectée à loge. Le fichier /etc/printcap de loge est celui de l'Exemple 6-3. Depuis wotan, il est possible d'envoyer des fichiers postscript puisque loge possède Ghostscript.

La première étape est de demander à loge d'accepter les impressions venant de wotan. Cela se fait en insérant une ligne contenant wotan dans le fichier /etc/hosts.lpd de loge. Le format de ce fichier est très simple: chaque ligne contient le nom de l'hôte à autoriser.

Ensuite, le fichier /etc/printcap de wotan doit être configuré pour envoyer les impressions sur loge. Par exemple:

lp|line printer on loge:\
	:lp=:sd=/var/spool/lpd/lp:lf=/var/log/lp-errs:\
	:rm=loge:rp=lp

ps|Ghostscript driver on loge:\
	:lp=:sd=/var/spool/lpd/lp:lf=/var/log/lp-errs:\
	:mx#0:\
	:rm=loge:rp=ps    

Il existe quatre différences entre cette configuration et celle de l'Exemple 6-3.

  1. La définition de "lp" est vide.

  2. L'entrée "rm" définit le nom de l'hôte sur lequel est connectée l'imprimante.

  3. L'entrée "rp" définit le nom de l'imprimante connectée.

  4. Il n'est pas nécessaire de définir de filtres puisque ceux de loge seront utilisés.

Maintenant, les impression "lp" et "ps" de wotan seront automatiquement envoyées sur l'imprimante connectée à loge.