This is an archive of past FreeBSD releases; it's part of the FreeBSD Documentation Archive.
Cette section décrit les filtres pour des formatages particuliers, les pages d'en-tête, l'impression en réseau, les restrictions et la comptabilisation de l'utilisation des imprimantes.
Bien que LPD prenne en charge le protocole réseau, la gestion de la file d'attente, le contrôle d'accès et d'autres aspects des tâches d'impression, la plupart du travail effectif est confié aux filtres. Les filtres sont des programmes qui communiquent avec l'imprimante et se chargent de leurs caractéristiques et exigences particulières. Lors de la configuration simple, nous avons installé un filtre texte - un filtre très élémentaire qui devrait marcher avec la plupart des imprimantes. (cf. section Installer le filtre texte).
Cependant, pour profiter de la conversion de format, de la comptabilisation des impressions, des particularités de certaines imprimantes, et ainsi de suite, il est utile de comprendre comment fonctionnent les filtres. En dernier ressort, ce sont les filtres qui gèreront ces fonctionnalités. La mauvaise nouvelle est que la plupart du temps, vous devrez vous-même fournir ces filtres. La bonne nouvelle est que beaucoup sont déjà disponibles; quand ce n'est pas le cas, ils sont en général faciles à écrire.
FreeBSD est aussi livré avec un filtre, /usr/libexec/lpr/lpf, qui fonctionne avec nombre d'imprimantes capables d'imprimer du texte. (Il gère les retours arrière, les tabulations et la comptabilité, mais c'est à peu près tout ce qu'il fait.) Il y a aussi plusieurs filtres ou composants de filtres au catalogue des logiciels portés.
Voici ce que vous trouverez dans cette section:
La section Comment fonctionnent les filtres essaie de vous donner une vue d'ensemble du rôle du filtre dans le processus d'impression. Vous devriez lire cette section pour comprendre ce qui se passe ``dans la coulisse'' quand LPD utilise les filtres. Cela peut vous aider à anticiper et remédier aux problèmes que vous rencontrerez au fur et à mesure que vous installerez de plus en plus de filtres sur chacune de vos imprimantes.
LPD s'attend à ce que, par défaut, chaque imprimante soit capable d'imprimer du texte. C'est un problème avec les imprimantes PostScript (ou d'autres imprimantes qui utilisent un langage d'impression), qui ne savent pas imprimer directement du texte. La section Imprimer du texte sur des imprimantes PostScript vous explique comment résoudre ce problème. Je vous recommande de la lire si vous avez une imprimante PostScript.
PostScript est un format de sortie populaire pour beaucoup de programmes. Certaines personnes (moi y-compris) écrivent directement du code PostScript. Mais les imprimantes PostScript sont chères. La section Emuler PostScript sur des imprimantes Non-PostScript vous explique comment vous pouvez ajuster le filtre texte d'une imprimante pour accepter et imprimer des données PostScript sur une imprimante qui n'est pas PostScript. Je vous recommande de le lire si vous n'avez pas d'imprimante PostScript.
La section Filtres de conversion vous donne une méthode pour automatiser la conversion de formats de fichiers particuliers, comme des données graphiques ou issues d'un traitement de texte, vers un format compréhensible pour votre imprimante. Après avoir lu cette section, vous devriez être capable de configurer vos imprimantes pour que les utilisateurs puissent taper lpr -t pour imprimer des données troff, lpr -d pour imprimer des données DVI produit par TeX, ou lpr -v pour imprimer des images point à point, et ainsi de suite. Je conseille la lecture de cette section.
La section Filtres de sortie introduit une possibilité rarement utilisée de LPD: les filtres de sortie. A moins que vous n'imprimiez des pages d'en-tête (voyez la section Pages d'en-tête), vous pouvez probablement sauter cette section.
La section lpf: un filtre texte décrit lpf, un filtre texte assez complet, quoique simple, pour les imprimantes ligne (et les imprimantes laser qui fonctionnent comme des imprimantes ligne) et qui est livré avec FreeBSD. S'il vous faut un moyen simple pour comptabiliser le fonctionnement d'une imprimante en mode texte, ou si vous avez une imprimante qui fume lorsqu'elle aperçoit un retour arrière, vous devriez absolument envisager d'utiliser lpf.
Comme expliqué plus haut, un filtre est un programme exécuté par LPD pour gérer ce qui dépend de l'imprimante dans la communication avec celle-ci.
Quand LPD veut imprimer un fichier appartenant à un travail d'impression, il démarre un programme de filtre. Il affecte à l'entrée standard du filtre le fichier à imprimer, à sa sortie standard l'imprimante et à son fichier d'erreur standard le fichier de trace (défini par la fonctionnalité lf de /etc/printcap, ou /dev/console par défaut).
Quel filtre LPD utilise et avec quels arguments dépend du contenu du fichier /etc/printcap et des arguments qu'a donnés l'utilisateur sur la ligne de commande de lpr pour ce travail d'impression. Par exemple, s'il a utilisé lpr -t, LPD démarrera le filtre troff, indiqué par la fonctionnalité tf pour l'imprimante destinataire. Si l'utilisateur veut imprimer du texte, il lancera le filtre if (c'est vrai la plupart du temps, voyez la section Filtres de sortie pour plus de détails).
Il y a trois sortes de filtres que vous pouvez définir dans /etc/printcap:
Le filtre texte, inexactement appelé filtre d'entrée dans la documentation de LPD, se charge de l'impression du texte ordinaire. Considérez-le comme le filtre par défaut. LPD suppose que toutes les imprimantes savent par défaut imprimer du texte, et c'est le rôle du filtre texte de faire en sorte que les retours arrière, tabulations et autres caractères spéciaux ne posent pas de problèmes à l'imprimante. Si vous êtes dans un environnement où vous devez comptabiliser l'utilisation des imprimantes, le filtre texte doit aussi s'en charger, habituellement en comptant le nombre de lignes et en le comparant au nombre de lignes par page accepté par l'imprimante. Le filtre texte est exécuté avec les arguments suivants:
nom_du_filtre [-c] -wlargeur -lhauteur -iindentation -n utilisateur -h hôte fichier_comptable
où:est utilisé si le travail a été soumis par lpr -l,
est la valeur donnée avec la fonctionnalité pw (largeur de page - ``page width'') dans /etc/printcap, 132 par défaut,
est la valeur indiquée par la fonctionnalité pl (hauteur de page - ``page length''), 66 par défaut,
indentation précisée par lpr -i, 0 par défaut,
est le nom (de session) de l'utilisateur imprimant le fichier,
est le nom de la machine d'où le travail a été soumis,
est le nom du fichier de comptabilité spécifé par la fonctionnalité af.
Un filtre de conversion convertit un format de fichier particulier en un format que l'imprimante comprend. Par exemple, des données provenant du traitement de texte ditroff ne peuvent pas être imprimées directement, mais vous pouvez installer un filtre de conversion pour les fichiers ditroff pour transformer les fichiers ditroff de façon à ce que l'imprimante les digère et les imprime. La section Filtres de conversion vous dit tout ce que vous devez savoir sur ces filtres. Les filtres de conversion doivent aussi gérer la comptabilité, si vous en avez besoin. Les filtres de conversion sont exécutés avec les arguments suivants:
nom_du_filtre -xlargeur_du_pixel -yhauteur_du_pixel -n utilisateur -h hôte fichier_comptable
où largeur_du_pixel est la valeur définie par la fonctionnalité px (0 par défaut) et hauteur_du_pixel celle définie par py (0 par défaut).Le filtre de sortie n'est utilisé que s'il n'y a pas de filtre texte, ou que les pages d'en-tête sont activées. D'après mon expérience personnelle, les filtres de sortie sont rarement utilisés. La section Filtres de sortie les décrit. Un filtre de sortie n'a que deux arguments:
nom_du_filtre -wlargeur -lhauteur
qui sont identiques aux arguments -w et -l du filtre texte.Les filtres doivent aussi retourner (``exit'') avec l'un des codes retour suivants:
Le filtre a correctement imprimé le fichier.
Le filtre n'a pas pu imprimer le fichier mais veut que LPD tente une nouvelle impression. LPD relancera le filtre s'il retourne ce code.
Le filtre n'a pas pu imprimer le fichier et ne veut pas que LPD relance l'impression. LPD supprimera le fichier de la file d'attente.
Le filtre texte livré avec la distribution de FreeBSD, /usr/libexec/lpr/lpf, utilise les arguments définissant la largeur et la hauteur de page pour déterminer quand envoyer un saut de page et pour gérer la comptabilité. Il se sert du nom d'utilisateur, du nom de machine et de celui du fichier comptable pour tenir à jour les enregistrements comptables.
Si vous cherchez des filtres, vérifiez qu'ils sont compatibles avec LPD. S'ils le sont, ils doivent accepter les arguments décrits ci-dessus. Si vous envisagez d'écrire des filtres, vous devez faire en sorte qu'ils acceptent ces arguments et gèrent les bons codes retour.
Si vous êtes le seul utilisateur de votre ordinateur et d'une imprimante PostScript (ou d'une autre imprimante fonctionnant avec un langage d'impression) et êtes certain de ne jamais envoyer de simples fichiers texte à l'imprimante ou de ne jamais utiliser les options de différents programmes qui feraient de même, alors vous n'avez pas besoin de vous préoccuper du contenu de cette section.
Mais, si vous voulez envoyer et du PostScript et de simples fichiers texte à l'imprimante, alors je vous conjure d'adapter la configuration de votre imprimante. Pour cela, nous ferons en sorte que le filtre texte distingue entre les travaux d'impression qui envoient du texte et ceux qui envoient du PostScript. Tous les travaux PostScript commencent par %! (pour les autres langages, consultez la documentation de votre imprimante). Si nous avons ces deux caractères au début du travail d'impression, alors c'est du PostScript, et nous pouvons l'envoyer tel quel. Sinon, le filtre convertira le texte en PostScript et imprimera le résultat.
Comment réaliser cela?
Avec une imprimante série, il suffit d'installer lprps. lprps est un filtre d'impression PostScript qui dialogue avec l'imprimante. Il met à jour le fichier d'état de l'imprimante en fonction des informations que celle-ci lui fournit, les utilisateurs et les administrateurs peuvent donc savoir exactement quel est l'état de l'imprimante (comme ``manque d'encre'' ou ``bourrage''). Mais, c'est plus intéressant, il comporte un programme appelé psif qui détecte si le prochain travail est du texte et invoque textps (un autre programme qui fait partie de lprps) pour le convertir en PostScript. Il utilise ensuite lprps pour l'envoyer à l'imprimante.
lprps fait partie du catalogue des logiciels portés de FreeBSD (voyez le chapitre Installer des Logiciels au ``Catalogue des Logiciels Portés''). Vous pouvez le télécharger, le compiler et l'installer vous-même, bien sûr. Après avoir installé lprps, donnez juste le chemin d'accès au programme psif qui fait partie de lprps. Si vous avez installé lprps depuis le catalogue des logiciels portés, utilisez ce qui suit dans la définition de l'imprimante série PostScript dans /etc/printcap:
:if=/usr/local/libexec/psif:
Vous devez aussi activer la fonctionnalité rw qui dit à LPD d'ouvrir l'imprimante en lecture/écriture.
Si vous avez une imprimante PostScript parallèle (et donc ne pouvez pas communiquer dans les deux sens avec l'imprimante, ce qui est indispensable à lprps), vous pouvez utilisez la procédure qui suit comme filtre texte:
#!/bin/sh # # psif - Imprime du PostScript ou du texte # version Procédure; Ce N'EST PAS la version qui accompagne lprs # fichier /usr/local/libexec/psif # read first_line first_two_chars=`expr "$first_line" : '\(..\)'` if [ "$first_two_chars" = "%!" ]; then # # Travail PostScript; l'imprimer. # echo $first_line && cat && printf "\004" && exit 0 exit 2 else # # Texte simple, le convertir, puis l'imprimer. # ( echo $first_line; cat ) | /usr/local/bin/textps && printf "\004" && exit 0 exit 2 fi
Dans la procédure ci-dessus, textps est un programme que nous avons installé séparément pour convertir du texte en PostScript. Vous pouvez utiliser le programme de conversion de votre choix. Le catalogue des logiciels portés de FreeBSD (voyez le chapitre Installer des Logiciels au ``Catalogue des Logiciels Portés'') comporte un programme complet de conversion de texte en PostScript appelé a2ps auquel vous pourriez jeter un coup d'oeil.
PostScript est le standard de facto du traitement de texte et de l'impression de qualité. PostScript est, toutefois, un standard coûteux. Heureusement, Alladin Enterprises fournit un émulateur PostScript libre, appelé Ghostscript, qui fonctionne sous FreeBSD. Ghostscript peut lire la plupart des fichiers PostScript et les convertir pour divers modèles d'imprimantes dont de nombreuses imprimantes non-PostScript. En installant Ghostscript et avec un filtre texte adapté à votre imprimante, vous pouvez utiliser votre imprimante comme une vraie imprimante PostScript.
Ghostscript devrait être dans le catalogue des logiciels portés de FreeBSD, d'où vous pouvez l'installer. Vous pouvez aussi facilement le télécharger, le compiler et l'installer.
Pour émuler PostScript, nous ferons en sorte que le filtre texte reconnaisse les fichiers PostScript. Quand ce n'est pas le cas, le filtre enverra directement le fichier à l'imprimante. Sinon, il utilisera Ghostscript pour convertir le fichier en un format que l'imprimante comprenne.
Voici un exemple: cette procédure est un filtre texte pour les imprimantes Hewlett Packard DeskJet 500. Pour d'autres imprimantes, modifiez l'argument de l'option -sDEVICE de la commande gs (Ghostscript). (Tapez gs -h pour avoir la liste des périphériques supportés par la version courante de Ghostscript.)
#!/bin/sh # # ifhp - Imprime du PostSCript émulé par Ghostscript sur une DeskJet 500 # fichier /usr/local/libexec/hpif # # traiter LF comme CR+LF: # printf "\033&k2G" || exit 2 # # Lit les deux premiers caractères du fichier # read first_line first_two_chars=`expr "$first_line" : '\(..\)'` if [ "$first_two_chars" = "%!" ]; then # # Si c'est du PostScript; utiliser Ghostscript pour convertir, et imprimer. # /usr/local/bin/gs -dSAFER -dNOPAUSE -q -sDEVICE=djet500 -sOutputFile=- - \ && exit 0 else # # Texte ou HP/PCL, donc, imprimer directement; envoyer ensuite un saut # de page pour éjecter la dernière page. # echo $first_line && cat && printf "\f" && exit 0 fi exit 2
Pour finir, il faut spécifier le filtre à LPD avec la fonctionnalité if:
:if=/usr/local/libexec/hpif:C'est tout. Vous pouvez maintenant taper lpr texte.simple et lpr quoique-ce-soit.ps et les deux devraient s'imprimer.
Après avoir terminé l'étape de Configuration simple d'une imprimante, la première chose que vous voudrez probablement faire sera d'installer des filtres de conversion pour vos formats de fichiers favoris (autres que le simple texte ASCII).
Les filtres de conversion facilitent l'impression de différents types de fichiers. Supposons, par exemple, que nous utilisions beaucoup le logiciel de traitement de texte TeX, et que nous ayons une imprimante PostScript. Chaque fois que nous générons un fichier DVI avec TeX, nous ne pouvons l'imprimer directement sans le convertir auparavant en PostScript. La séquence de commande pour le faire est la suivante:
En installant un filtre de conversion pour les fichiers DVI, nous pourrons nous dispenser de la conversion manuelle à chaque fois, en laissant LPD le faire à notre place. Quand nous aurons un fichier DVI, l'impression se fera en une seule étape:
L'option -d dit à LPD que c'est un fichier DVI à convertir. La section Options de mise en page et de conversion liste les options de conversion.
Pour chaque option de conversion que vous voulez que l'imprimante supporte, installez un filtre de conversion et donnez son chemin d'accès dans /etc/printcap. Un filtre de conversion est similaire au filtre texte de notre configuration simple (voir section Installer le filtre texte) sinon qu'au lieu d'imprimer du texte, il convertit le fichier en un format compréhensible pour l'imprimante.
Installez les filtres de conversion que vous prévoyez d'utiliser. Si vous avez beaucoup de données DVI, un filtre de conversion DVI s'impose. Si vous voulez imprimer beaucoup de troff, c'est une bonne idée d'installer un filtre troff.
La table ci-dessous résume les caractéristiques des filtres que LPD utilise, elle donne le type de fichier, la fonctionnalité correspondante dans le fichier /etc/printcap et l'option à utiliser avec la commande lpr.
Type de fichier | Fonctionnalité /etc/printcap | Option de lpr |
---|---|---|
cifplot | cf | -c |
DVI | df | -d |
format traceur (``plot'') | gf | -g |
ditroff | nf | -n |
programme FORTRAN | rf | -f |
troff | rf | -f |
image point à point (``raster'') | vf | -v |
texte | if | aucune, -p, ou -l |
Dans notre exemple, la commande lpr -d signifie que l'imprimante doit invoquer la fonctionnalité df de sa définition dans /etc/printcap.
Malgré ce que d'aucuns en pensent, des formats tels que FORTRAN ou ``traceur'' sont probablement obsolètes. Sur votre site, vous pouvez changer la signification de ces options, ou de n'importe quelle option de conversion, en installant des filtres personnalisés. Imaginons, par exemple, que vous vouliez imprimer directement des fichiers Printerleaf (des fichiers créés avec le logiciel de Publication Assistée par Ordinateur Interleaf), mais n'imprimerez jamais de fichier traceur. Vous pouvez installer un filtre de conversion Printerleaf pour la fonctionnalité gf et prévenir vos utilisateur que lpr -g signifie ``imprimer des fichiers Printerleaf.''
Les filtres de conversion sont des programmes qui ne font pas partie de la distribution standard de FreeBSD, ils ont logiquement leur place dans /usr/local. Le répertoire /usr/local/libexec est l'endroit habituel où les mettre, parce que ce sont des programmes réservés à LPD que les utilisateurs ordinaires ne devraient jamais employer.
Pour mettre en service un filtre de conversion, indiquez son chemin d'accès à la fonctionnalité correspondante pour l'imprimante destinatrice dans /etc/printcap.
Nous allons ajouter à notre exemple un filtre de conversion DVI pour l'imprimante appelée bamboo. Voici notre nouveau fichier /etc/printcap avec la fonctionnalité df pour l'imprimante bamboo:
# # /etc/printcap pour la machine rose - ajout du filtre df pour bamboo # rattan|line|diablo|lp|Imprimante Ligne Diablo 630:\ :sh:sd=/var/spool/lpd/rattan:\ :lp=/dev/lpt0:\ :if=/usr/local/libexec/if-simple: bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\ :sh:sd=/var/spool/lpd/bamboo:\ :lp=/dev/ttyd5:fs#0x82000e1:xs#0x820:rw:\ :if=/usr/local/libexec/psif:\ :df=/usr/local/libexec/psdf:
Le filtre DVI est une procédure appelée /usr/local/libexec/psdf. Voici cette procédure:
#!bin/sh # # psdf - filtre de conversion de DVI en PostScript # fichier /usr/local/libexec/psdf # # appelé quand l'utilisateur invoque lpr -d # exec /usr/local/bin/dvips -f | /usr/local/libexec/lprps "$@"
Cette procédure exécute dvips en mode filtre (l'argument -f) sur l'entrée standard, qui est le travail d'impression. Elle lance ensuite le filtre d'impression PostScript lprps (reportez-vous à la section Imprimer du texte sur des imprimantes PostScript) en lui passant les arguments donnés à LPD. lprps utilisera ces arguments pour comptabiliser les pages imprimées.
La méthode pour installer des filtres de conversion n'étant pas toujours la même, il vaut mieux que je vous donne d'autres exemples, dont vous pourrez vous inspirer pour mettre en oeuvre vos propres filtres. Utilisez-les tels quels, au besoin.
Voici une procédure pour convertir des fichiers graphiques point à point (en fait, des fichiers GIF) pour une imprimante Hewlett Packard LaserJet III-Si:
#!/bin/sh # # hpvf - Convertit des fichiers GIF en HP/PCL, et les imprime # fichier /usr/local/libexec/hpvf PATH=/usr/X11R6/bin:$PATH; export PATH giftopnm | ppmtopgm | pgmtopbm | pbmtolj -resolution 300 \ && exit 0 \ || exit 2
Elle convertit le fichier GIF en format portable universel, puis en format portable noir et blanc, puis en format portable ``bitmap'' et enfin en données compatibles LaserJet/PCL.
Voici le fichier /etc/printcap avec une entrée pour une imprimante utilisant ce filtre:
# # /etc/printcap pour la machine rose # teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\ :lp=/dev/lpt0:sh:sd=/var/spool/lpd/teak:mx#0:\ :if=/usr/local/libexec/hpif:\ :vf=/usr/local/libexec/hpvf:
La procédure suivante convertit des données troff produites par le traitement de texte groff pour l'imprimante PostScript bamboo:
#!/bin/sh # # pstf - Convertit des données troff de groff en PS, et les imprime # fichier /usr/local/libexec/pstf # exec grops | /usr/local/libexec/lprps "$@"
Cette procédure utilise de nouveau lprps pour communiquer avec l'imprimante. Si l'imprimante était sur un port parallèle, il faudrait utiliser une autre méthode:
#!/bin/sh # # pstf - Convertit des donnees troff de groff en PS, et les imprime # fichier /usr/local/libexec/pstf # exec grops
C'est tout. Voici ce qu'il faut mettre dans /etc/printcap pour utiliser ce filtre:
:tf=/usr/local/libexec/pstf:
Voici un exemple qui prend en charge la sauce FORTRAN. C'est un filtre pour les programmes FORTRAN pour n'importe quelle imprimante capable d'imprimer directement du texte. Nous l'installerons pour l'imprimante teak:
#!/bin/sh # # hprf - filtre de conversion pour FORTRAN pour LaserJet 3si: # fichier /usr/local/libexec/hprf # printf "\033&k2G" && fpr && printf "\f" && exit 0 exit 2
Et nous mettrons la ligne suivante dans /etc/printcap pour l'imprimante teak pour activer ce filtre:
:rf=/usr/local/libexec/hprf:
Voici un dernier exemple, quelque peu plus complexe. Nous allons installer un filtre DVI pour l'imprimante LaserJet teak de l'exemple précédent. Commençons par le plus facile: mettre à jour /etc/printcap en lui donnant le chemin d'accès au filtre DVI:
:df=/usr/local/libexec/hpdf:
Et maintenant, la partie compliquée: créer le filtre. Il nous faut un programme de conversion de DVI en PCL pour LaserJet. Il y en a un au catalogue des logiciels portés de FreeBSD (voyez le chapitre Installer des Logiciels au ``Catalogue des Logiciels Portés''): dvi2xx est le nom du logiciel. En l'installant, nous récupérons le programme dont nous avons besoin, dvilj2p, qui convertit du DVI en instructions compatibles LaserJet IIp, LaserJet III et LaserJet 2000.
dvilj2p rend le filtre hpdf assez complexe, parce que dvilj2p ne sait pas lire sur l'entrée standard. Il lui faut un nom de fichier. Pire encore, ce fichier doit avoir l'extension .dvi, nous ne pouvons donc pas utiliser /dev/fd/0 qui correspond à l'entrée standard. Nous contournons le problème avec un lien (symbolique) d'un fichier temporaire (avec l'extension .dvi) vers /dev/fd/0, forçant ainsi dvilj2p à lire l'entrée standard.
Il y a cependant une mouche dans le potage. Nous ne pouvons pas créer de lien symbolique temporaire dans /tmp. Les liens symboliques appartiennent à l'utilisateur et au groupe bin. Le filtre est exécuté par l'utilisateur daemon. Et le bit ``sticky (persistant)'' du répertoire /tmp est positionné. Le filtre peut créer le lien, mais ne pourra pas le détruire après avoir fait son travail, puisque le lien appartient à un autre utilisateur.
Le filtre créera donc le lien dans le répertoire courant, qui est le répertoire tampon pour la file d'attente des travaux d'impression (défini par la fonctionnalité sd dans /etc/printcap). C'est l'endroit idéal pour que les filtres accomplissent leur tâche, en particulier parce qu'il y a (parfois) plus de place dans le répertoire tampon que dans /tmp.
Voici, enfin, le filtre:
#!/bin/sh # # hpdf - Imprime du DVI sur une imprimante HP/PCL # fichier /usr/local/libexec/hpdf PATH=/usr/local/bin:$PATH; export PATH # # Définit une fonction pour détruire nos fichiers temporaires. Ces fichiers # sont dans le répertoire courant, qui est le répertoire de file d'attente de # l'imprimante # cleanup() { rm -f hpdf$$.dvi } # # Définit une fonction de gestion des erreurs fatales : imprime le message # d'erreur et retourne le code d'erreur 2. Ce code dit à LPD de ne pas # relancer le travail d'impression. # fatal() { echo "$@" 1>&2 cleanup exit 2 } # # Si l'utilisateur annule le travail d'impression, LPD envoie SIGINT, # il faut donc capturer SIGINT (et quelques autres signaux) # pour faire ensuite le ménage nous-mêmes. # trap cleanup 1 2 15 # # Assurons-nous de ne pas avoir de conflit de nom avec des fichiers existants. # cleanup # # Lien symbolique du fichier DVI sur l'entrée standard (fichier à imprimer). # ln -s /dev/fd/0 hpdf$$.dvi || fatal "Cannot symlink /dev/fd/0" # # LF = CR+LF # printf "\033&k2G" || fatal "Cannot initialize printer" # # Convertit et imprime. Le code retour de dvilj2p ne semble pas fiable, # nous l'ignorons. # dvilj2p -M1 -q -e- dfhp$$.dvi # # Fait le ménage et termine la procédure # cleanup exit 0
Tous ces filtres de conversion améliorent votre environnement d'impression, mais ils obligent l'utilisateur à préciser (sur la ligne de commande de lpr) lequel utiliser. Si vos utilisateurs ne sont pas particulièrement compétents en informatique, cela leur sera une gêne. Pire encore, une erreur d'option de filtrage peut lancer un filtre sur le mauvais type de fichier et provoquer l'impression de centaines de pages inutiles.
Au lieu d'installer des filtres de conversion, vous pouvez essayer de faire en sorte que le filtre texte (qui est le filtre par défaut) reconnaisse le type de fichier qu'il doit imprimer et exécute automatiquement le filtre de conversion adéquat. Des utilitaires comme file peuvent être employés pour cela. Il sera bien sûr difficile de faire la différence entre certains types de fichiers - dans ce cas, vous pouvez toujours fournir des filtres de conversion juste pour ces fichiers.
Le catalogue des logiciels portés de FreeBSD inclut un filtre texte appelé apsfilter qui effectue la conversion automatique. Il sait reconnaître les fichiers texte, PostScript et DVI, effectuer la conversion adéquate et imprimer.
Le gestionnaire d'impression LPD supporte encore un autre type de filtre dont nous n'avons pas encore parlé: le filtre de sortie. Un filtre de sortie sert à imprimer du texte uniquement, comme le filtre texte, mais il est grandement simplifié. Si vous utilisez un filtre de sortie, et pas de filtre texte, alors:
LPD exécute le filtre de sortie une seule fois par travail d'impression et non une fois pour chaque fichier d'un travail d'impression.
LPD ne s'inquiète pas de détecter le début et la fin de chaque fichier pour les besoins du filtre de sortie.
LPD ne passe pas le nom de la machine et de l'utilisateur au filtre, qui ne peut donc être utilisé pour la comptabilité. De fait, il n'a que deux arguments:
nom_du_filtre -wlargeur -lhauteur
où largeur est la valeur définie par la fonctionnalité pw et hauteur est la valeur définie par la fonctionnalité pl associée à l'imprimante en question.Ne soyez pas abusé par la simplicité du filtre de sortie. Si vous voulez que chaque fichier d'un travail d'impression commence sur une nouvelle page, le filtre de sortie ne convient pas. Utilisez un filtre texte (appelé aussi filtre d'entrée); voyez la section Installer le filtre texte. De plus, un filtre de sortie est en fait plus complexe car il doit examiner le flot de données pour voir s'il contient des caractères spéciaux et s'envoyer des signaux à lui-même au lieu que ce soit LPD qui le fasse.
Un filtre de sortie est toutefois nécessaire si vous voulez avoir des pages d'en-tête et devez envoyer des séquences d'échappement ou d'autres commandes d'initialisation pour pouvoir imprimer ces pages d'en-tête. (Il est cependant inutilisable si vous voulez facturer ces pages d'en-tête à l'utilisateur, puisque LPD ne donne pas d'informations sur l'utilisateur et la machine au filtre de sortie.)
Pour une même imprimante, LPD vous autorise à avoir à la fois un filtre texte, un filtre de sortie et d'autres filtres. Dans ce cas, LPD utilisera le filtre de sortie pour imprimer la page d'en-tête (voyez la section Pages d'en-tête) uniquement. LPD s'attend à ce que le filtre de sortie s'interrompe ensuite lui-même quand il lui envoie les deux octets: ASCII 031 suivi de ASCII 001. Quand un filtre de sortie reçoit cette séquence (031, 001), il doit s'interrompre en s'envoyant le signal SIGSTOP. Quand LPD en a fini avec les autres filtres, il réactive le filtre de sortie en lui envoyant un SIGCONT.
S'il y a un filtre de sortie mais pas de filtre texte et que LPD traite une impression de texte, LPD se sert du filtre de sortie pour faire le travail. Comme déjà dit plus haut, le filtre de sortie imprimera les fichiers en continu, sans saut de page ou autre commande d'avance papier entre eux, ce qui n'est probablement pas ce que vous attendez. Dans la plupart des cas, vous aurez besoin d'un filtre texte.
Le programme lpf, que nous avons cité auparavant comme filtre texte, peut aussi être utilisé comme filtre de sortie. Si vous avez besoin d'un filtre de sortie grossier et ne voulez pas écrire le code pour tester les octets et envoyer les signaux, essayez lpf. Vous pouvez aussi encapsuler lpf dans une procédure qui prenne en charge les codes d'initialisation dont l'imprimante aurait besoin.
Le programme /usr/libexec/lpr/lpf qui fait partie de la distribution de FreeBSD est un filtre texte (filtre d'entrée) qui sait indenter le résultat (commande lpr -i), imprimer littéralement le texte (commande lpr -l), se positionner à la bonne colonne d'impression pour gérer les retours arrière et les tabulations et comptabiliser les pages imprimées. Il peut aussi servir de filtre de sortie.
lpf convient à de nombreux environnements d'impression. Et bien qu'il ne sache pas envoyer de séquences d'initialisation à l'imprimante, il est facile d'écrire une procédure qui effectue les initialisations requises et exécute ensuite lpf.
Pour que lpf comptabilise correctement les pages, il faut que les valeurs définies par les fonctionnalités pw et pl du fichier /etc/printcap soient correctement renseignées. Ces valeurs sont utilisées pour savoir quelle quantité de texte tient sur une page, et combien de pages comporte le travail d'impression d'un utilisateur. Pour plus d'informations sur la comptabilisation des impressions, voyez la section Comptabiliser l'utilisation des imprimantes.
Si vous avez beaucoup d'utilisateurs, employant tous différentes imprimantes, alors vous devrez envisager les pages d'en-tête comme un mal nécessaire.
Les pages d'en-tête, appelées aussi bannières ou pages qui sautent aux yeux (burst) identifient les propriétaires des travaux après qu'ils aient été imprimés. Elles sont généralement imprimées en gros caractères gras, parfois encadrés, de façon à ce qu'elles se distinguent facilement des documents eux-mêmes dans une pile d'impressions. Elles permettent aux utilisateurs de répérer rapidement leurs propres travaux. L'inconvénient en est que cela fait une page supplémentaire à imprimer à chaque fois, d'usage éphémère - quelques minutes au plus, et qui finissent à la corbeille ou au recyclage. (Notez que comme il n'y a qu'une page d'en-tête par travail d'impression et non une pour chaque fichier, le gaspillage n'est peut-être pas si grave.)
Le système LPD peut générer automatiquement les pages d'en-tête si votre imprimante sait imprimer directement du texte. Si vous avez une imprimante PostScript, il vous faudra un programme supplémentaire pour les générer; reportez-vous à la section Pages d'en-tête sur les imprimantes PostScript.
Dans la Configuration simple d'une imprimante, nous avons supprimé l'impression des pages d'en-tête en ajoutant sh (pour ``suppress header'' - supprimer les en-têtes) dans le fichier /etc/printcap. Pour les mettre en service sur une imprimante, il suffit d'enlever la fonctionnalité sh.
Cela parait trop facile, non?
Vous avez raison. Vous devrez peut-être fournir un filtre de sortie pour envoyer une séquence d'initialisation à votre imprimante. Voici un exemple de filtre de sortie pour une imprimante compatible avec le langage PCL de Hewlett Packard:
#!/bin/sh # # hpof - filtre de sortie pour les imprimantes compatibles Hewlett Packard PCL # fichier /usr/local/libexec/hpof printf "\033&k2G" || exit 2 exec /usr/libexec/lpr/lpf
Donnez le chemin d'accès du filtre de sortie avec la fonctionnalité of. Voyez la section Filtres de sortie pour plus d'informations.
Voici par exemple le fichier /etc/printcap pour l'imprimante teak déjà utilisée plus haut; nous mettons en service les pages d'en-tête et ajoutons le filtre de sortie ci-dessus:
# # /etc/printcap pour la machine orchid # teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\ :lp=/dev/lpt0:sd=/var/spool/lpd/teak:mx#0:\ :if=/usr/local/libexec/hpif:\ :vf=/usr/local/libexec/hpvf:\ :of=/usr/local/libexec/hpof:
Maintenant, quand nous utilisateurs imprimeront sur teak, ils auront une page d'en-tête pour chaque travail. S'ils préférent perdre du temps à retrouver leurs impressions, ils peuvent supprimer les pages d'en-tête en soumettant leurs travaux avec lpr -h; voyez la section Options pour la page d'en-tête pour connaître les autres options de lpr.
Note : LPD imprime un caractère de saut de page après chaque page d'en-tête. Si votre imprimante utilise un caractère ou une séquence différente pour éjecter une page, précisez-la avec la fonctionnalité ff dans /etc/printcap.
Si les pages d'en-tête sont actives, LPD produira un en-tête long, une page entière en gros caractères, donnant le nom de l'utilisateur, de la machine et du travail d'impression. En voici un exemple (kelly a imprimé un travail appelé outline depuis la machine rose):
k ll ll k l l k l l k k eeee l l y y k k e e l l y y k k eeeeee l l y y kk k e l l y y k k e e l l y yy k k eeee lll lll yyy y y y y yyyy ll t l i t l oooo u u ttttt l ii n nnn eeee o o u u t l i nn n e e o o u u t l i n n eeeeee o o u u t l i n n e o o u uu t t l i n n e e oooo uuu u tt lll iii n n eeee r rrr oooo ssss eeee rr r o o s s e e r o o ss eeeeee r o o ss e r o o s s e e r oooo ssss eeee Job: outline Date: Sun Sep 17 11:04:58 1995
LPD ajoute un saut de page après ce texte de sorte que le travail commence en début de page (à moins que vous n'ayez mis sf - supprimer les sauts de page - dans l'entrée correspondant à l'imprimante destinatrice dans /etc/printcap).
Si vous le préférez, LPD peut générer des en-têtes courts; spécifiez sb (en-tête court - ``short banner'') dans le fichier /etc/printcap. La page d'en-tête ressemblera alors à ceci:
rose:kelly Job: outline Date: Sun Sep 17 11:07:51 1995
Par défaut, LPD imprime la page d'en-tête avant le contenu du travail. Vous pouvez faire l'inverse avec hl (en-tête à la fin - ``header last'') dans /etc/printcap.
Avec les pages d'en-tête pré-programmées de LPD, vous en êtes réduits à appliquer la politique suivante: les pages d'en-tête doivent être gratuites.
Pourquoi?
Le filtre de sortie est le seul programme additionnel qui puisse savoir quand sont imprimées les pages d'en-tête et comme il ne connait ni l'utilisateur, ni la machine, pas plus que le nom du fichier comptable, il ne peut pas savoir qui facturer. Il ne suffit pas de simplement ``ajouter une page'' par l'intermédiaire du filtre texte ou de l'un des filtres de conversion (qui connaissent l'utilisateur et la machine), puisque les utilisateurs peuvent supprimer les pages d'en-tête avec lpr -h. Ils seraient alors facturés pour des pages d'en-tête qu'ils n'ont pas imprimées. Les utilisateurs écologistes préféreront employer lpr -h, mais vous n'avez pas moyen de les y inciter.
Il ne suffit pas non plus de faire générer les pages d'en-tête par les différents filtres (ce qui permet de les facturer). Si les utilisateurs veulent alors les supprimer avec lpr -h, ils les auront malgré tout et seront facturés pour, parce que LPD ne passe l'information fournie par l'option -h à aucun des filtres.
Que pouvez-vous donc faire?
Vous pouvez :
Accepter la politique de LPD et ne pas facturer les pages d'en-tête.
Installer l'une des alternatives à LPD, comme LPDng ou PLP. La section Alternatives au gestionnaire d'impression standard vous en dit plus sur les autres gestionnaires d'impression qui peuvent se substituer à LPD.
Ecrire un filtre de sortie intelligent. Le filtre de sortie n'a normalement rien d'autre à faire que d'initialiser l'imprimante et effectuer quelques conversions simples de caractères. Il convient pour les pages d'en-tête et l'impression de textes (quand il n'y a pas de filtre texte - ou d'entrée). Mais, s'il y a un filtre texte, le filtre de sortie n'est utilisé que pour les pages d'en-tête. Le filtre de sortie peut alors déterminer quel utilisateur ou quelle machine facturer en fonction du contenu de la page d'en-tête. Le seul problème avec cette méthode est que l'on ne sait toujours pas quel est le fichier comptable (son nom, défini par la fonctionnalité af, n'est pas transmis au filtre de sortie), mais si son nom est standard, vous pouvez le codez ``en dur'' dans le filtre de sortie. Pour faciliter l'analyse du contenu de la page d'en-tête, utilisez la fonctionnalité sh (en-tête courte) dans /etc/printcap. Cependant, c'est peut-être se donner beaucoup de mal, alors que les utilisateurs apprécieront certainement plus l'administrateur système qui leur fait cadeau des pages d'en-tête.
Comme décrit ci-dessus, LPD peut générer une page d'en-tête texte qui convient pour de nombreuses imprimantes. PostScript ne peut pas imprimer directement du texte, donc dans ce cas, les pages d'en-tête de LPD sont inutilisables - ou presque.
Une méthode triviale pour obtenir des pages d'en-tête est de confier leur génération à chaque filtre de conversion et au filtre texte. Ces filtres se serviront des noms d'utilisateur et de machine pour remplir correctement la page d'en-tête. L'inconvénient de cette méthode est que les utilisateurs auront toujours une page d'en-tête, même s'ils soumettent leurs travaux avec lpr -h.
Voyons comment cela fonctionne. La procédure ci-dessous a trois arguments (le nom de l'utilisateur, celui de la machine et celui du travail d'impression) et génère une page d'en-tête PostScript simple:
#!/bin/sh # # make-ps-header - affiche une page d'en-tête PostScript sur la sortie standard # fichier /usr/local/libexec/make-ps-header # # # Ce sont les unités PostScript (72 par pouce). # A modifier pour le format A4 ou autre. # page_width=612 page_height=792 border=72 # # contrôle des arguments # if [ $# -ne 3 ]; then echo "Usage: `basename $0` <user> <host> <job>" 1>&2 exit 1 fi # # Les mémoriser, pour la lisibilité du code PostScript qui suit. # user=$1 host=$2 job=$3 date=`date` # # Envoyer le code PostScript sur la sortie standard. # exec cat <<EOF %!PS % % Pour ne pas interférer avec le travail de l'utilisateur qui suivra. % save % % Un cadre large et désagréable autour de la page. % $border $border moveto $page_width $border 2 mul sub 0 rlineto 0 $page_height $border 2 mul sub rlineto currentscreen 3 -1 roll pop 100 3 1 roll setscreen $border 2 mul $page_width sub 0 rlineto closepath 0.8 setgray 10 setlinewidth stroke 0 setgray % % Le nom de l'utilisateur en gros caractères. % /Helvetica-Bold findfont 64 scalefont setfont $page_width ($user) stringwidth pop sub 2 div $page_height 200 sub moveto ($user) show % % Les caractéristiques ennuyeuses % /Helvetica findfont 14 scalefont setfont /y 200 def [ (Job:) (Host:) (Date:) ] { 200 y moveto show /y y 18 sub def } forall /Helvetica-Bold findfont 14 scalefont setfont /y 200 def [ ($job) ($host) ($date) ] { 270 y moveto show /y y 18 sub def } forall % % C'est tout. % restore showpage EOF
Chacun des filtres de conversion et le filtre texte peuvent maintenant utiliser cette procédure pour produire les pages d'en-tête avant d'imprimer le travail de l'utilisateur. Voici le filtre de conversion DVI décrit plus haut dans ce chapitre, modifié pour inclure la génération des pages d'en-tête:
#!/bin/sh # # psdf - filtre de conversion de DVI en PostScript # fichier /usr/local/libexec/psdf # # Utilisé par lpd quand l'utilisateur emploie lpr -d # orig_args="$@" fail() { echo "$@" 1>&2 exit 2 } while getopts "x:y:n:h:" option; do case $option in x|y) ;; # Ignore n) login=$OPTARG ;; h) host=$OPTARG ;; *) echo "LPD started `basename $0` wrong." 1>&2 exit 2 ;; esac done [ "$login" ] || fail "Pas de nom d'utilisateur" [ "$host" ] || fail "Pas de nom de machine" ( /usr/local/libexec/make-ps-header $login $host "DVI File" /usr/local/bin/dvips -f ) | eval /usr/local/libexec/lprps $orig_args
Remarquez la façon dont le filtre analyse les arguments pour connaître le nom de l'utilisateur et celui de la machine. Ce serait la même pour les autres filtres de conversion. Le filtre texte a un jeu d'arguments légèrement différent (voyez la section Comment fonctionnent les filtres).
Comme nous l'avons déjà dit, cette méthode, quoique assez simple, empêche d'utiliser l'option de ``suppression de la page d'en-tête'' (l'option -h) de la commande lpr. Si les utilisateurs voulaient épargner un arbre (ou quelques centimes, si vous facturez les pages d'en-tête), ils ne pourront pas, puisque tous les filtres imprimeront une page d'en-tête pour chaque travail.
Pour permettre aux utilisateurs de désactiver les pages d'en-tête, vous devrez utiliser l'astuce décrite à la section Comptabiliser les pages d'en-tête: écrire un filtre de sortie qui analyse la page d'en-tête générée par LPD et en produire une version PostScript. Si l'utilisateur soumet son travail avec lpr -h, LPD ne génère pas de page d'en-tête, et donc le filtre de sortie non plus. Dans le cas contraire, votre filtre de sortie lira le texte produit par LPD et enverra le code PostScript de la page d'en-tête à l'imprimante.
Si votre imprimante PostScript est sur une interface série, vous pouvez utiliser lprps, qui inclut un filtre de sortie, psof, qui se charge de cela. Remarquez que psof ne facture pas les pages d'en-tête.
FreeBSD supporte l'impression en réseau pour envoyer des travaux sur des imprimantes distantes. Imprimer en réseau veut en général dire deux choses différentes:
Accéder à une imprimante connectée à une machine distante. Vous installez une imprimante avec une interface série ou parallèle classique sur une machine. Vous pouvez alors configurer LPD pour permettre l'accès à cette imprimante depuis d'autres machines du réseau. La section Imprimantes installées sur des machines distantes vous explique comment faire.
Accéder à une imprimante connectée directement au réseau. L'imprimante a une interface réseau en plus (ou à la place) de l'interface série ou parallèle habituelle. Une imprimante de ce type peut fonctionner comme suit:
Elle peut comprendre le protocole LPD, voire même gérer une file d'attente de travaux venant de machines distantes. Dans ce cas, elle se comporte comme une machine distante exécutant LPD. Suivez la même procédure qu'à la section Imprimantes installées sur des machines distantes pour configurer ce type d'imprimante.
Elle ne peut que recevoir un flot de données venant du réseau. Dans ce cas, vous la ``reliez'' à une machine du réseau en confiant à cette machine la gestion de la file d'attente et l'envoi des travaux à l'imprimante. La section Imprimantes avec une interface réseau donne quelques indications sur l'installation de ce type d'imprimante.
Le système LPD inclut ce qu'il faut pour envoyer des travaux sur d'autres machines qui exécutent aussi LPD (ou sont compatibles avec). Cela vous permet d'installer une imprimante sur une machine et de la rendre accessible à d'autres machines. Cela marche aussi avec les imprimantes qui ont une interface réseau qui comprend le protocole LPD.
Pour utiliser ce type d'impression en réseau, installez d'abord l'imprimante sur une machine, la machine d'impression, en utilisant la Configuration simple d'une imprimante. Utilisez les options nécessaires de la Configuration avancée d'une imprimante. Veillez à tester l'imprimante et vous assurez qu'elle marche avec les options de LPD que vous avez choisies.
Si vous utilisez une imprimante avec une interface réseau compatible avec LPD, alors la machine d'impression dont nous parlerons ci-dessous est l'imprimante elle-même, et le nom de l'imprimante est le nom que vous avez utilisé pour configurer votre imprimante. Consultez la documentation de votre imprimante ou de son interface réseau.
Ensuite, sur les autres machines depuis lesquelles vous voulez pouvoir accéder à cette imprimante, ajouter une entrée dans leurs fichiers /etc/printcap de la façon suivante:
Nommez cette entrée comme vous voulez. Pour plus de simplicité, vous utiliserez éventuellement le même nom et les mêmes alias que sur la machine d'impression.
Laissez explicitement la fonctionnalité lp non renseignée (:lp=:).
Créez un répertoire tampon et donnez son chemin d'accès avec la fonctionnalité sd. LPD y mettra les travaux avant de les envoyer à la machine d'impression.
Donnez le nom de l'imprimante avec la fonctionnalité rm.
Donnez le nom de l'imprimante telle qu'elle est connue sur la machine d'impression avec la fonctionnalité rp.
Voici un exemple. Il y a deux imprimantes sur la machine rose, bamboo et rattan. Nous allons permettre aux utilisateurs de la machine orchid d'utiliser ces imprimantes. Voici le fichier /etc/printcap de la machine orchid (repris de la section Activer les pages d'en-tête). Il contenait déjà une entrée pour l'imprimante teak; nous avons ajouté les entrées pour les deux imprimantes de la machine rose:
# # /etc/printcap pour la machine orchid # ajout des imprimantes (distantes) sur rose # # teak est locale; elle est connectée directement à orchid: # teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\ :lp=/dev/lpt0:sd=/var/spool/lpd/teak:mx#0:\ :if=/usr/local/libexec/ifhp:\ :vf=/usr/local/libexec/vfhp:\ :of=/usr/local/libexec/ofhp: # # rattan est connectée à rose; envoyer les travaux pour rattan à rose: # rattan|line|diablo|lp|Imprimante Ligne Diablo 630:\ :lp=:rm=rose:rp=rattan:sd=/var/spool/lpd/rattan: # # bamboo est aussi connectée à rose: # bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\ :lp=:rm=rose:rp=bamboo:sd=/var/spool/lpd/bamboo:
Nous n'avons plus qu'à créer les répertoires tampon sur orchid:
# mkdir -p /var/spool/lpd/rattan /var/spool/lpd/bamboo # chmod 770 /var/spool/lpd/rattan /var/spool/lpd/bamboo # chown daemon.daemon /var/spool/lpd/rattan /var/spool/lpd/bamboo
Les utilisateurs d'orchid peuvent maintenant imprimer sur rattan et bamboo. Si, par exemple, un utilisateur d'orchid tape:
Le système LPD d'orchid copiera le travail dans le répertoire tampon /var/spool/lpd/bamboo et notera que c'est un travail DVI. Dès qu'il y aura de la place dans le répertoire tampon pour bamboo sur la machine rose, les deux LPD transfèreront le fichier sur rose. Il attendra d'être imprimé dans la file d'attente de rose. La conversion de DVI en PostScript (puisque bamboo est une imprimante PostScript) sera faite par rose.La plupart du temps, quand vous achetez une carte d'interface réseau pour une imprimante, vous avez le choix entre deux versions: l'une (la plus chère) émule un gestionnaire d'impression, l'autre (la moins chère) ne vous permet que de lui envoyer des données comme si elle était sur un port parallèle ou série. C'est l'utilisation de cette dernière que décrit la présente section. Pour la version la plus chère, voyez la section précédente, Imprimantes installées sur des machines distantes.
Le format du fichier /etc/printcap vous permet d'indiquer quelle interface série ou parallèle utiliser, et (si vous utilisez une interface série), quelle est la vitesse en baud, s'il faut utiliser un contrôle de flux, les délais pour les tabulations, la conversion des sauts de ligne, et ainsi de suite. Mais il n'y a rien pour décrire la connexion d'une imprimante qui écoute sur un port TCP/IP ou un autre port réseau.
Pour envoyer des données à une imprimante réseau, il vous faut un programme de communication qui soit appelé par le filtre texte et les filtres de conversion. En voici une exemple: la procédure netprint récupère toutes les données qui arrivent sur l'entrée standard et les envoie à une imprimante réseau. Nous donnons comme premier argument de netprint le nom de machine de l'imprimante et comme deuxième argument le numéro du port auquel se connecter. Remarquez que la communication est à sens unique (de FreeBSD vers l'imprimante); nombre d'imprimantes réseau sont capables de communiquer dans les deux sens, et vous voudrez peut-être en profiter (pour connaître l'état de l'imprimante, gérer la comptabilité, etc.).
#!/usr/bin/perl # # netprint - filtre texte pour une imprimante réseau # fichier /usr/local/libexec/netprint # $#ARGV eq 1 || die "Usage: $0 <printer-hostname> <port-number>"; $printer_host = $ARGV[0]; $printer_port = $ARGV[1]; require 'sys/socket.ph'; ($ignore, $ignore, $protocol) = getprotobyname('tcp'); ($ignore, $ignore, $ignore, $ignore, $address) = gethostbyname($printer_host); $sockaddr = pack('S n a4 x8', &AF_INET, $printer_port, $address); socket(PRINTER, &PF_INET, &SOCK_STREAM, $protocol) || die "Impossible de créer la socket TCP/IP: $!"; connect(PRINTER, $sockaddr) || die "Impossible de contacter $printer_host: $!"; while (<STDIN>) { print PRINTER; } exit 0;
Nous pouvons utiliser cette procédure avec différents filtres. Supposons que nous ayons une imprimante ligne Diablo 750-N sur notre réseau. Cette imprimante reçoit les données à imprimer sur le port 5100. Son nom de machine est scrivener. Voici le filtre texte pour cette imprimante:
#!/bin/sh # # diablo-if-net - filtre texte pour l'imprimante Diablo `scrivener' à l'écoute # sur le port 5100. fichier /usr/local/libexec/diablo-if-net /usr/libexec/lpr/lpf "$@" | /usr/local/libexec/netprint scrivener 5100
Cette section vous donne des informations sur les restrictions d'accès aux imprimantes. Le système LPD vous permet de contrôler quels sont les utilisateurs qui peuvent accéder aux imprimantes, locales et distantes, s'ils ont le droit d'imprimer en plusieurs exemplaires, quelle taille peut avoir leurs travaux, et quelle peut être la taille maximale de la file d'attente.
Avec le système LPD, il est facile pour les utilisateurs d'imprimer en plusieurs exemplaires. Il leur suffit d'utiliser lpr -#5 (par exemple) pour obtenir 5 exemplaires de chaque fichier de leur travail d'impression. C'est à vous de décider si c'est une bonne chose.
Si vous pensez que les impressions multiples usent inutilement vos imprimantes, vous pouvez désactiver l'option -# de lpr en ajoutant la fonctionnalité sc au fichier /etc/printcap. Quand les utilisateurs soumettront des travaux avec l'option -#, ils auront le message :
(L'impression en plusieurs exemplaires n'est pas autorisée.)
Notez bien que si vous avez défini une entrée pour une imprimante distante (voyez la section Imprimantes installées sur des machines distantes), vous devrez aussi définir la fonctionnalité sc dans le fichier /etc/printcap de la machine, ou bien les autres utilisateurs pourrons envoyer des impressions multiples depuis d'autres machines.
Voici un exemple. C'est le fichier /etc/printcap de la machine rose. L'imprimante rattan est assez robuste, nous y autoriserons les impressions multiples, mais l'imprimante laser bamboo est un peu plus fragile, nous y désactiverons donc les impressions en plusieurs exemplaires en ajoutant la fonctionnalité sc:
# # /etc/printcap pour la machine rose # interdire plusieurs exemplaires sur bamboo # rattan|line|diablo|lp|Imprimante Ligne Diablo 630:\ :sh:sd=/var/spool/lpd/rattan:\ :lp=/dev/lpt0:\ :if=/usr/local/libexec/if-simple: bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\ :sh:sd=/var/spool/lpd/bamboo:sc:\ :lp=/dev/ttyd5:fs#0x82000e1:xs#0x820:rw:\ :if=/usr/local/libexec/psif:\ :df=/usr/local/libexec/psdf:
Il nous faut encore ajouter la fonctionnalité sc dans /etc/printcap sur la machine orchid (et pendant que nous y sommes, désactivons les exemplaires multiples sur l'imprimante teak):
# # /etc/printcap pour la machine orchid - pas d'impression en plusieurs # exemplaires sur l'imprimante locale teak ni sur l'imprimante distante bamboo # teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\ :lp=/dev/lpt0:sd=/var/spool/lpd/teak:mx#0:sc:\ :if=/usr/local/libexec/ifhp:\ :vf=/usr/local/libexec/vfhp:\ :of=/usr/local/libexec/ofhp: rattan|line|diablo|lp|Imprimante Ligne Diablo 630:\ :lp=:rm=rose:rp=rattan:sd=/var/spool/lpd/rattan: bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\ :lp=:rm=rose:rp=bamboo:sd=/var/spool/lpd/bamboo:sc:
Avec la fonctionnalité sc, nous empêchons d'utiliser la commande lpr -#, mais cela n'évite pas que les utilisateurs exécutent plusieurs fois lpr, ou soumettent plusieurs fois les mêmes fichiers dans un même travail, comme ceci:
Il y a de nombreux moyens d'empêcher ce type d'abus que vous êtes libre d'essayer (y compris l'ignorer).
Vous pouvez contrôler qui imprime sur quelle imprimante avec le mécanisme des groupes d'UNIX et la fonctionnalité rg dans /etc/printcap. Définissez les utilisateurs auxquels vous voulez autoriser l'accès à une imprimante dans un groupe précis et donnez ce groupe en paramètre de la fonctionnalité rg.
Les utilisateurs qui n'appartiennent pas à ce groupe (y compris le super-utilisateur) seront accueillis par:
(Vous n'appartenez pas au groupe autorisé.) s'ils essaient d'utiliser l'imprimante en question.
De même que pour la fonctionnalité sc (suppressions des exemplaires multiples), vous devez spécifier rg sur les machines distantes qui ont accès à l'imprimante, si cela vous paraît indiqué (voyez la section Imprimantes installées sur des machines distantes).
Par exemple, nous ne laisserons pas tout le monde imprimer sur rattan, mais seuls les utilisateurs du groupe artists pourront utiliser bamboo. Voici notre habituel fichier /etc/printcap pour la machine rose:
# # /etc/printcap pour la machine rose - restriction d'accès à bamboo # rattan|line|diablo|lp|Imprimante Ligne Diablo 630:\ :sh:sd=/var/spool/lpd/rattan:\ :lp=/dev/lpt0:\ :if=/usr/local/libexec/if-simple: bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\ :sh:sd=/var/spool/lpd/bamboo:sc:rg=artists:\ :lp=/dev/ttyd5:fs#0x82000e1:xs#0x820:rw:\ :if=/usr/local/libexec/psif:\ :df=/usr/local/libexec/psdf:
Laissons tel quel l'autre fichier /etc/printcap (de la machine orchid). Bien sûr, tous les utilisateurs d'orchid peuvent alors imprimer sur bamboo. Selon le cas, nous voudrons restreindre ou non l'accès à certains utilisateurs d'orchid.
Note : Avec cette fonctionnalité, il ne peut y avoir qu'un seul groupe d'utilisateurs autorisé par imprimante.
Si de nombreux utilisateurs accèdent à vos imprimantes, vous voudrez probablement limiter la taille des fichiers qu'ils peuvent imprimer. Après tout, l'espace disponible sur les systèmes de fichiers où se trouvent les files d'attente n'est pas illimité, et vous devez aussi faire en sorte qu'il y ait de la place pour les travaux de tous les utilisateurs.
LPD vous permet de définir une taille maximum en octets que peut avoir un fichier à imprimer grâce à la fonctionnalité mx. L'unité est le bloc BUFSIZ, qui est de 1024 octets. Si vous donnez en paramètre de cette fonctionnalité la valeur zéro, la taille des fichiers ne sera pas limitée.
Note : Cette limite s'applique à la taille des fichiers d'un travail d'impression, et non au volume total du travail.
LPD ne refusera pas d'imprimer un fichier trop volumineux. Il en mettra autant que la limite donnée dans la file d'attente. Cette partie sera imprimée, le reste sera ignoré. Est-ce la bonne méthode, le débat reste ouvert.
Ajoutons des limites aux imprimantes rattan et bamboo de notre exemple. Comme les fichiers PostScript de nos artistes sont assez volumineux, nous les limiterons à 5 méga-octets. Nous ne mettrons pas de limitation à l'utilisation de l'imprimante texte:
# # /etc/printcap pour la machine rose # # # Pas de limite à la taille des fichiers: # rattan|line|diablo|lp|Imprimante Ligne Diablo 630:\ :sh:sd=/var/spool/lpd/rattan:\ :lp=/dev/lpt0:\ :if=/usr/local/libexec/if-simple: # # Pas plus de 5 méga-octets # bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\ :sh:sd=/var/spool/lpd/bamboo:sc:rg=artists:mx#5000:\ :lp=/dev/ttyd5:fs#0x82000e1:xs#0x820:rw:\ :if=/usr/local/libexec/psif:\ :df=/usr/local/libexec/psdf:
Encore une fois, ces limitations s'appliquent aux utilisateurs locaux. Si ces imprimantes sont accessibles à distance, les utilisateurs distants ne seront pas assujettis à ces limites. Il vous faut aussi introduire la fonctionnalité mx dans les fichiers /etc/printcap des machines distantes. Voyez la section Imprimantes installées sur des machines distantes pour plus d'informations sur l'impression à distance.
Il y a un autre moyen de limiter le volume des travaux d'impression à distance; voyez la section Contrôler les impressions à distance.
Le système LPD fournit différents moyens de contrôler les impressions depuis des machines distantes:
Vous pouvez contrôler de quelles machines distantes le ``démon'' LPD local acceptera des requêtes d'impression grâce aux fichiers /etc/hosts.equiv et /etc/hosts.lpd. LPD vérifie si la requête vient d'une machine mentionnée dans l'un de ces deux fichiers. Si ce n'est pas le cas, il refuse la requête.
Le format de ces fichiers est trivial: un nom de machine par ligne. Notez que le fichier /etc/hosts.equiv est aussi utilisé par le protocole ruserok(3), et affecte des programmes comme rsh et rcp, faites donc attention.
Voici par exemple le fichier /etc/hosts.lpd de la machine rose:
orchid violet madrigal.fishbaum.deCe qui signifie que rose acceptera les demandes qui viennent des machines orchid, violet et madrigal.fishbaum.de. Si une autre machine fait appel au LPD de rose, il lui refusera l'accès.
Vous pouvez contrôler combien il doit rester d'espace libre sur le système de fichiers où se trouve le répertoire de file d'attente. Créez un fichier appelé minfree dans le répertoire de file d'attente de l'imprimante local. Mettez-y un nombre de blocs disque (512 octets) qui sera l'espace qui devra être disponible pour qu'un travail d'impression à distance soit accepté.
Vous vous assurez ainsi que les utilisateurs distants ne satureront pas votre système de fichiers. Vous pouvez aussi utiliser cette possibilité pour donner une certaine priorité aux utilisateurs locaux: ils pourront mettre des travaux en attente bien après que l'espace disponible soit descendu en dessous de la valeur indiquée par le fichier minfree.
Définissons par exemple un fichier minfree pour l'imprimante bamboo. Nous regardons dans /etc/printcap pour savoir quel est son répertoire de file d'attente. Voici l'entrée pour bamboo:
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\ :sh:sd=/var/spool/lpd/bamboo:sc:rg=artists:mx#5000:\ :lp=/dev/ttyd5:fs#0x82000e1:xs#0x820:rw:mx#5000:\ :if=/usr/local/libexec/psif:\ :df=/usr/local/libexec/psdf:
Le répertoire de file d'attente est défini par la fonctionnalité sd. Nous fixerons à trois méga-octets (soit 6144 blocs disque) l'espace qui doit être libre pour que LPD accepte des impressions distantes:
Vous pouvez contrôler quels utilisateurs distants peuvent utiliser les imprimantes locales avec la fonctionnalité rs dans /etc/printcap. Quand rs est mentionnée dans l'entrée correspondant à une imprimante locale, LPD acceptera les impressions venant de machines distantes si et seulement si l'utilisateur qui soumet le travail a un compte sous le même nom sur la machine locale. Sinon, le travail d'impression sera refusé.
Cette fonctionnalité est particulièrement utile lorsque (par exemple) plusieurs départements partagent un réseau et certains utilisateurs sont à cheval sur plusieurs départements. En leur ouvrant un compte sur vos systèmes, ils peuvent utiliser les imprimantes de leur propre département. Si vous préférez qu'ils n'utilisent que vos imprimantes, mais pas vos machines, vous pouvez leur ouvrir des comptes ``jeton'', sans répertoire utilisateur et avec un interpréteur de commandes inutilisable tel que /usr/bin/false.
Donc, vous voulez facturer les impressions. Et pourquoi pas? Le papier et l'encre coûtent de l'argent. Il y a aussi les coûts de maintenance. Les imprimantes ont des pièces mobiles qui ont tendance à casser. Vous avez fait un bilan du coût de vos imprimantes, consommables et frais de maintenance et avez calculé un coup à la page (ou au mètre, ou toute autre unité). Comment faites-vous maintenant pour comptabiliser les impressions?
Bien, la mauvaise nouvelle est que le gestionnaire d'impression LPD n'aide pas beaucoup dans ce domaine. La facturation dépend dans une large mesure du type d'imprimante, du format utilisé, et de votre politique de facturation de l'utilisation des imprimantes.
Pour mettre en oeuvre la facturation, vous devez modifier le filtre texte de l'imprimante (pour facturer l'impression de fichiers texte) et les filtres de conversion (pour les autres formats de fichiers), pour qu'ils comptent les pages ou interrogent l'imprimante pour connaître le nombre de pages imprimées. Vous ne pouvez pas vous en sortir avec un simple filtre de sortie, qui n'est pas capable de gérer la comptabilité. Voyez la section Filtres.
D'une façon générale, il y a deux méthodes de faire la facturation:
La facturation périodique est la méthode la plus courante, probablement parce que c'est la plus facile. Chaque fois que quelqu'un imprime, le filtre enregistre dans le fichier comptable le nom de l'utilisateur, celui de la machine et le nombre de pages imprimées. Tous les mois, semestres, années, ou avec la périodicité que vous voulez, vous récupérez les fichiers comptables des différentes imprimantes et facturez leur utilisation. Vous réinitialisez ensuite ces fichiers, et repartez à zéro pour la période suivante.
La facturation à la volée est moins utilisée, certainement parce qu'elle est plus délicate. Avec cette méthode, les filtres facturent les utilisateurs dès qu'ils utilisent les imprimantes. Comme pour les quotas d'espace disque, la comptabilité est immédiate, Vous pouvez interdire aux utilisateurs d'imprimer dès qu'ils sont dans le rouge et leur fournir un moyen de consulter et modifier leurs ``quotas d'impression''. Mais cette méthode demande de mettre en oeuvre une base de données pour gérer les utilisateurs et leurs quotas.
Le gestionnaire d'impression LPD permet de mettre facilement en oeuvre les deux méthodes: de même que vous devez fournir des filtres (la plupart du temps, au moins), vous devez aussi écrire le code de facturation. Mais cela a un avantage: vous avez énormement de souplesse pour la méthode. Par exemple, vous pouvez choisir entre la facturation périodique ou à la volée. Vous pouvez choisir quelles informations utiliser: le nom d'utilisateur, le nom de machine, le type d'impression, le nombre de pages, la surface ou la quantité de papier utilisée, le temps qu'a pris l'impression, et ainsi de suite. Vous faites cela en modifiant le filtre pour qu'il archive ces informations.
FreeBSD inclut deux programmes que vous pouvez immédiatement configurer pour une facturation périodique de base. Ce sont le filtre texte lpf, décrit à la section lpf: un filtre texte, et pac, un programme qui rassemble et globalise les données des fichiers comptables.
Comme indiqué à la section sur les filtres (Filtres), LPD exécute le filtre texte et les filtres de conversion en leur donnant en argument le nom du fichier comptable. Les filtres peuvent utiliser ce paramètre pour savoir où écrire l'enregistrement comptable. Le nom du fichier est précisé par la fonctionnalité af du fichier /etc/printcap, avec un chemin d'accès absolu ou relatif au répertoire de file d'attente.
LPD exécute lpf avec comme paramètres la largeur et la hauteur de page (définies par les fonctionnalités pw et pl). lpf utilise ces arguments pour savoir combien il faudra de papier. Après avoir envoyé le fichier à l'imprimante, il génère alors un enregistrement dans le fichier comptable. Cet enregistrement ressemble à ce qui suit:
2.00 rose:andy 3.00 rose:kelly 3.00 orchid:mary 5.00 orchid:mary 2.00 orchid:zhang
Il faut utiliser un fichier comptable différent pour chaque imprimante, car lpf ne sait pas verrouiller les fichiers, et deux lpf pourraient corrompre leurs enregistrements respectifs s'ils écrivaient en même temps dans le même fichier. Une façon simple d'être sûr que l'on a des fichiers différents pour chaque imprimante est d'utiliser af=acct dans /etc/printcap. On a alors dans les répertoires de file d'attente de chaque imprimante, un fichier comptable appelé acct.
Quand vous voulez facturer les utilisateurs, exécutez le programme pac. Allez simplement dans le répertoire de file d'attente de l'imprimante dont vous voulez récupérer les informations comptables et tapez pac. Vous obtiendrez un résumé (en dollars) des coûts:
Login pages/feet runs price orchid:kelly 5.00 1 $ 0.10 orchid:mary 31.00 3 $ 0.62 orchid:zhang 9.00 1 $ 0.18 rose:andy 2.00 1 $ 0.04 rose:kelly 177.00 104 $ 3.54 rose:mary 87.00 32 $ 1.74 rose:root 26.00 12 $ 0.52 total 337.00 154 $ 6.74
Voici les arguments qu'attend pac:
L'imprimante dont on veut le résumé comptable. Cette option ne fonctionne que si l'on a donné un chemin d'accès absolu à la fonctionnalité af dans /etc/printcap.
Trier par coûts au lieu d'utiliser l'ordre alphabétique des noms d'utilisateurs.
Ne pas tenir compte du nom de machine indiqué pour la comptabilité. Avec cette option, l'utilisateur smith sur la machine alpha est le même utilisateur que smith sur la machine gamma. Sinon, ils sont considérés comme des utilisateurs différents.
Calculer les coûts sur la base du prix en dollars par page ou par pied (``ft'') au lieu d'utiliser la valeur donnée avec la fonctionnalité pc dans /etc/printcap, ou deux centimes (la valeur par défaut). prix peut être un nombre en virgule flottante.
Trier dans l'ordre inverse.
Editer le résumé comptable et tronquer le fichier.
N'imprimer les informations comptables que pour l'utilisateur nom.
Dans le résumé que produit pac par défaut, vous avez le nombre de pages imprimées par chaque utilisateur sur chaque machine.Si, sur votre site, les machines n'ont pas d'importance (parce que les utilisateurs peuvent se servir de n'importe laquelle), utilisez pac -m, pour obtenir un récapitulatif qui ressemble à:
Login pages/feet runs price andy 2.00 1 $ 0.04 kelly 182.00 105 $ 3.64 mary 118.00 35 $ 2.36 root 26.00 12 $ 0.52 zhang 9.00 1 $ 0.18 total 337.00 154 $ 6.74
Pour calculer la facture en dollars, pac utilise la fonctionnalité pc du fichier /etc/printcap (200 par défaut, soit 2 centimes par page). Donnez, en centièmes de centimes, le prix par page ou par pied que vous voulez facturer. Cette valeur peut être redéfinie quand vous utilisez pac avec l'option -p. Avec l'option -p, l'unité est le dollar et non plus le centième de centime. Par exemple:
facture chaque page un dollar cinquante centimes. Vous pouvez vraiment faire des affaires avec cette option.Enfin, utiliser pac -s sauvegardera le résumé dans un fichier comptable récapitulatif, de même nom que le fichier comptable associé à l'imprimante, mais suffixé par _sum. Le fichier comptable est ensuite tronqué. La prochaine fois que vous utiliserez pac, ce fichier récapitulatif sera relu et pris en compte pour recalculer les totaux, en y ajoutant ce qui est comptabilisé dans le fichier comptable normal.
Pour comptabliser correctement les impressions, même à distance, vous devez pouvoir calculer la quantité de papier consommée par chaque travail. C'est la difficulté principale liée à la facturation des impressions.
Pour les impressions en mode texte, la difficulté n'est pas si grande: vous comptez le nombre de lignes à imprimer et le comparer au nombre de lignes que l'imprimante peut éditer par page. N'oubliez pas de prendre les retours arrière en compte, lorsqu'il y a sur-impression, de même que les lignes trop longues qui s'impriment sur plus d'une ligne.
Le filtre texte lpf (décrit dans lpf: un filtre texte) prend tout cela en compte lorsqu'il gère la comptabilité. Si vous écrivez un filtre texte qui doit prendre la facturation en charge, vous devriez jeter un oeil au code source de lpf.
Comment prendre les autres formats en compte?
Pour les conversions de DVI en LaserJet ou PostScript, le filtre peut analyser la sortie de dvilj ou dvips pour y lire le nombre de pages converties. Vous devriez être en mesure de faire de même avec d'autres formats de fichiers et d'autres programmes de conversion.
Ces méthodes sont toutefois limitées parce qu'elles ne prennent pas en compte le fait que l'imprimante n'imprimera peut-être pas toutes ces pages. Il peut par exemple y avoir bourrage ou manque d'encre - et l'utilisateur sera malgré tout facturé.
Que pouvez-vous alors faire?
Il n'y a qu'une seule méthode sûre pour tenir une comptabilité précise. Faire dire à l'imprimante combien de papier elle utilise, et la connecter sur un port série ou directement sur le réseau. Pratiquement toutes les imprimantes PostScript offrent cette possibilité. C'est aussi faisable avec d'autres modèles (les imprimantes laser réseau Imagen, par exemple). Modifiez les filtres de ces imprimantes pour lire le nombre de pages imprimées à la fin de chaque travail et reportez dans le fichier comptable des informations qui se basent uniquement là-dessus. Il n'y a alors pas besoin de compter les lignes ou d'un examen des fichiers qui peut être source d'erreurs.
Vous pouvez toujours en définitive vous montrer généreux et instituer la gratuité des impressions.
Précédent | Sommaire | Suivant |
Utiliser les imprimantes | Niveau supérieur | Alternatives au gestionnaire d'impression standard |
For questions about FreeBSD, e-mail
<questions@FreeBSD.org>.
For questions about this documentation, e-mail <doc@FreeBSD.org>.