Configurer une imprimante Vincent Defert - 1 Avr. 1999

Introduction

On peut utiliser une imprimante de 2 façons sous Unix: en lui envoyant directement les caractères ASCII à imprimer (rare de nos jours: trop limité), ou en lui envoyant des descriptions de pages en PostScript (procédure normale: offre une totale liberté).

Les imprimantes comprenant directement le langage PostScript n'étant pas très courantes et fort chères, il est possible de convertir les données à imprimer dans le langage d'impression natif d'une imprimante ordinaire par l'intermédiaire d'un programme appelé "filtre d'impression".

Pour pouvoir utiliser une imprimante, il faut donc: la déclarer au système (c'est à dire renseigner le fichier /etc/printcap) et éventuellement mettre en place un filtre d'impression. Ces opérations sont très simples et ne nécessitent pas de connaissances spéciales.

Pour aller rapidement à l'essentiel, des exemples correspondant aux cas les plus courants sont donnés à la fin de ce document.

Le fichier /etc/printcap

Ce fichier permet de nommer l'imprimante et d'indiquer certaines informations essentielles, notamment la localisation (port local au autre machine), le répertoire de spool et le filtre d'impression.

Le répertoire de spool est l'endroit où sont mis en attente les travaux d'impression. L'usage veut qu'on les crée sous /var/spool/lpd et qu'on leur donne le même nom que l'imprimante. Ainsi, si vous ajoutez une imprimante appelée laser1 à printcap, vous indiquerez comme répertoire de spool /var/spool/lpd/laser1 et vous devrez faire un "mkdir /var/spool/lpd/laser1" pour le créer.

Vous trouverez une description détaillée des champs de printcap dans sa page de manuel en cas de besoin, mais les informations principales seront expliquées dans les exemples en fin de document.

Le filtre d'impression

Les filtres d'impressions peuvent être regroupés en quelques familles de base dont les seules différences sont dans les paramètres spécifiques à l'imprimante utilisée, mais pas dans la démarche. J'ai donc créé un petit script permettant de traiter très facilement les cas les plus courants. Il vous suffit de l'enregistrer dans le fichier /usr/local/bin/unifilter puis de faire un chmod 755 /usr/local/bin/unifilter.

#!/bin/sh

# unifilter (Universal Printer Filter) generalizes some good ideas found 
# in smbprint to ease printer configuration.
# Written by Vincent Defert (vdefert@bigfoot.com) - 19981210

eval acct_file=\${$#}
spool_dir=`dirname $acct_file` 
config_file=$spool_dir/.config
eval `cat $config_file`

if [ "$smbuser" = "" ]; then
  smbuser=$smbserver
fi

if [ "$smboptions" = "" ]; then
  smboptions="print -"
else
  smboptions="$smboptions;print -"
fi

if [ "$gspaper" = "" ]; then
  gspaper="a4"
fi

if [ "$gsres" = "" ]; then
  gsres="300x300"
fi

if [ "$prtype" = "smb" ]; then
  if [ "$prmode" = "ps" ]; then
    gs -q -dNOPAUSE -dSAFER -sOutputFile=- \
      -sDEVICE=$gsdevice -r$gsres -sPAPERSIZE=$gspaper $gsoptions - | \
      smbclient //$smbserver/$smbshare $smbpassword -U $smbuser -N -P -c "$smboptions"
  else
      smbclient //$smbserver/$smbshare $smbpassword -U $smbuser -N -P -c "$smboptions"
  fi
else
  if [ "$prmode" = "ps" ]; then
    gs -q -dNOPAUSE -dSAFER -sOutputFile=- \
      -sDEVICE=$gsdevice -r$gsres -sPAPERSIZE=$gspaper $gsoptions -
  else
    cat
  fi
fi

Configuration du filtre

Le filtre universel donné ici utilise un fichier de description .config placé dans le répertoire de spool de l'imprimante. Son contenu se présente sous la forme de lignes du type NomDeVariable=Valeur. Les variables utilisées sont décrites ci-après.

Les options commençant par "pr" sont obligatoires et communes à tous les cas. Celles qui commencent par "gs" ne sont utilisées que quand on émule une imprimante PostScript et celles commençant par "smb" dans le cas d'une imprimante connectée à un serveur sous Windows 95 ou NT.

Utilisation et tests

On utilise la commande lpr pour envoyer des données à l'imprimante. Par exemple, les 2 commandes suivantes font la même chose, à savoir envoyer le fichier /usr/doc/ghostscript/examples/tiger.ps sur l'imprimante "stylus820".

lpr -P stylus820 /usr/doc/ghostscript/examples/tiger.ps
cat /usr/doc/ghostscript/examples/tiger.ps | lpr -P stylus820

La 2ème forme est intéressante car elle illustre la technique utilisée par les logiciels pour imprimer, alors que la première correspond à ce qu'un utilisateur taperait.

Si on omet "-P stylus820", lpr utilise par défaut "lp" comme nom d'imprimante. "lp" est l'abbréviation de "line printer" et correspond à l'utilisation qui a longtemps été faite des imprimantes: sortir des kilomètres de listing. Cette valeur par défaut a longtemps été pratique et elle est restée, même si aujourd'hui ce n'est quasiment plus le cas.

Si vous imprimez plusieurs documents, vous pouvez savoir où ils en sont à l'aide de la commande lpq, qui affiche la liste des documents en attente. La commande lprm permet de supprimer un "print job" (travail d'impression) de la file d'attente. La commande lpc peut également être utile (voir man page).

Pour tester votre installation, il vous suffit d'envoyer un fichier PostScript à l'imprimante comme indiqué plus haut. Si elle est en mode raw, un simple "ls -l / | lpr -P nom_imprimante" fera l'affaire.

Les problèmes les plus courants sont des fautes de frappe dans /etc/printcap ou dans le fichier de configuration du filtre, l'oubli de la création du répertoire de spool ou l'oubli de la déclaration de la machine cliente dans le fichier /etc/hosts.lpd du serveur (cas d'une imprimante connectée à une autre machine Unix, voir exemple).

Exemples concrets

Epson Stylus 820 connectée sur le port LPT1

Ces paramètres indiquent qu'on utilise une imprimante connectée à une machine Unix et qu'on doit utiliser GhostScript avec le driver de la Stylus 800 (st800). La résolution est de 360 par 360. Le format de papier utilisé est A4 (valeur par défaut).

Epson Stylus 820 connectée sur la machine "moumoune"

Canon LBP8-III connectée sur le serveur Windows NT "pupuce"

Même principe que plus haut, mais on a cette fois en plus les options nécessaires à l'utilisation de smbclient. "printer" est un nom d'utilisateur créé spécialement sur "pupuce" pour gérer les accès aux imprimantes et "printerpwd" est son mot de passe. Cette solution me semble préférable à l'utilisation d'un compte d'utilisateur normal pour des questions de sécurité (on contrôle ainsi totalement ce qui est permis à un utilisateur dont on trouve le mot de passe en clair dans un fichier texte...).

Canon LBP8-III connectée sur "pupuce", mode "raw"

On utilise ici l'imprimante en mode raw, donc sans "interprétation" des données envoyées à l'imprimante. Or, sous Windows, on doit envoyer 2 caractères spéciaux (CR et LF) pour passer à la ligne suivante, alors que sous Unix un seul suffit (LF). On utilise donc la commande "translate" de smbclient pour qu'il s'occupe de ce détail.

Résumé des commandes de gestion des impressions

Ce résumé, comme son nom l'indique, ne décrit que les options les plus couramment utilisées des commandes relatives aux impressions, son but étant de vous permettre d'être opérationnel plus rapidement. Reportez-vous à leurs pages de manuel pour plus d'informations.

La commande lpc

Elle permet de contrôler l'état des imprimantes (en service / suspendue) et des files d'attentes (en service / bloquée).

Fonction Impression File d'attente Observations
Contrôle de l'impression
start lp Autorisée    
stop lp Arrêtée   Après la fin du travail en cours
abort lp Arrêtée   Interruption immédiate
Contrôle de la file d'attente
enable lp   Active  
disable lp   Bloquée  
Contrôle de l'impression et de la file d'attente
up lp Autorisée Active  
down lp Arrêtée Bloquée  
Fonctions de maintenance
restart lp     Relance lpd en cas de "décès" accidentel
clean lp     Détruit les fichiers invalides
status lp     Affiche l'état des imprimantes

Remarque : lp doit être remplacé par le nom de l'imprimante ou par all pour agir sur toutes les imprimantes d'un coup.

La commande lpq

Elle permet de lister les travaux de la file d'attente d'une imprimante. Son utilisation est triviale :

lpq -Pstylus820

Lorsque root utilise cette commande, il voit les travaux de tous les autres utilisateurs, alors qu'un utilisateur ordinaire ne verra que ceux qu'il a envoyé.

La commande lprm

Elle permet de supprimer des travaux de la file d'attente, soit un à un avec la forme suivante :

lprm -Plp n° du job indiqué par lpq

soit en supprimant tous les travaux lancés par l'utilisateur sous le nom duquel on est connecté (attention : si on est connecté en root, on supprime aussi les travaux de tous les autres utilisateurs !) en remplaçant le n° de job par un tiret ("-").

Que faire en cas de bourrage ?

En cas de problème d'impression, la première chose à faire est d'interrompre l'impression du travail en cours :

lpc abort lp

Ensuite, il faut éteindre l'imprimante et la rallumer pour vider son tampon interne, puis supprimer le travail en cours de la file d'attente afin de pouvoir le renvoyer en totalité :

lprm -Plp n° du job ou -

Enfin, il faut autoriser à nouveau l'impression :

lpc start lp