Printing-HOWTO Grant Taylor , traduction Jean- Michel VANSTEENE , 12 Novembre 1997 11.. IInnttrroodduuccttiioonn Le Printing-HOWTO devrait contenir tout ce dont vous avez besoin pour mettre en place les services d'impression sur votre systeme Linux. Comme vous vous en doutez peut-etre, ceci est un tantinet plus complique que le ``simple'' _c_l_i_c du monde _M_i_c_r_o_s_o_f_t et _A_p_p_l_e, mais en contre-partie, c'est beaucoup plus souple et certainement plus facile a administrer pour les grands reseaux. Ce document est organise de facon a ce que la lecture de la premiere moitie suffise a la mise en place d'un systeme qui ``tourne''. Les choses plus obscures voire particulieres sont concentrees dans la deuxieme moitie. Vous pouvez vous referer a la table des matiere pour les details. Depuis la version 3.x, ce document a ete completement reecrit et un certain nombre d'informations ont ete retirees. La principale raison est que l'ancien document faisait une soixantaine de pages et contenait pas mal de parties redondantes voire inutiles. Ainsi fait, la sanction est tombee: vous trouverez ici un document sensiblement plus concis. S'il manque une information qui vous semble importante, nous vous encourageons soit a parcourir l'ancien HOWTO, soit a nous envoyer un courrier nous proposant d'ajouter ladite information. L'adresse du site de G. Taylor est http://www.picante.com/~gtaylor/pht/. En vous souhaitant comme a l'accoutumee, moulte satisfaction dans vos recherches et pleine reussite dans la configuration de votre imprimante (Note : Desole : ca vouloir dire nous esperer toi reussir configurer imprimante :-)). Les HOWTOs francais peuvent etre trouves en France, notamment sur les sites ftp.lip6.fr (/pub/linux/french/docs/HOWTO) ftp.univ-angers.fr (/pub/linux/french/docs/HOWTO) 11..11.. HHiissttoorriiqquuee Ce document est le troisieme du nom, c'est a dire la troisieme version completement revue (en esperant que sa structure se stabilise un peu). L'histoire du PHT peut etre brievement decrite ainsi : J'ai commence a ecrire le premier HOWTO en reponse a un nombre assez consequent de questions qui avaient ete posees dans comp.os.linux. C'etait en fait une FAQ que j'avais nommee HOWTO. Cette version etait disponible uniquement en ASCII. Le PHT a ensuite ete regroupe avec la FAQ de LPD ecrite par Brian McCauley , nous avons continue ce document de concert pendant a peu pres deux ans. Nous avons alors ajoute a notre document les travaux de Karl Auer . Cette version du PHT etait disponible en TeXInfo, PostScript, HTML, ASCII et Info. Apres avoir un peu laisse le PHT vieillir pendant une bonne annee, sans avoir pu trouver quelqu'un souhaitant le maintenir, j'ai decide de le reecrire. Cette version est conforme au ``standard'' Linuxdoc-SGML. 11..22.. CCooppyyrriigghhtt Ce document est sous Copyright (C) 1996 par Grant Taylor. Vous pouvez le copier et le distribuer tel quel comme vous le souhaitez. Par contre aucune modification ne peut etre faite sans le consentement de l'auteur sauf si vous supprimez du document toute marque qui lui fait reference, ainsi qu'au traducteur et a toutes les personnes citees (y compris les adresses de courrier electronique) et que vous le diffusez en votre nom. L'auteur (et le traducteur) ne sauraient etre tenus responsables de propos qui ne sont pas les leurs. Le coordinateur des HOWTOs est actuellement Greg Hankins . Veuillez quand meme ne pas encombrer sa boite aux lettres de questions sauf de la plus haute importance. En France, le coordinateur est Eric Dumas . 22.. QQuu''eesstt--ccee qquuee ll''iimmpprreessssiioonn ssoouuss UUNNIIXX ?? Je me permets de consacrer un petit chapitre au B.A.BA de l'impression sous UNIX et donc sous Linux. Les gourous trouveront ce chapitre inutile et je les invite a passer au suivant. Les debutants trouveront l'information suffisante, je l'espere, pour comprendre comment les donnees sont vehiculees vers leur chere imprimante. La facon la plus simple d'imprimer sous Unix (et donc Linux) est d'envoyer les donnees directement au pilote de l'imprimante. ls >/dev/lp0 Cette methode a neanmoins un gros inconvenient : elle ne tire pas parti des caracteristiques multi-taches du systeme d'exploitation. En effet vous devrez attendre que le tampon de l'imprimante ait absorbe toutes les donnees pour pouvoir continuer a travailler. Une meilleure methode consiste a utiliser un spool d'impression, dont le role est de collecter les donnees temporairement dans des fichiers afin de les envoyer, en tache de fond, a l'imprimante. Lorsque plusieurs fichiers sont soumis, ils seront imprimes dans l'ordre de soumission (premier entre, premier sorti). La zone de spool est donc bien une ffiillee. On dit que les travaux sont dans la ffiillee dd''iimmpprreessssiioonn. Cette methode met en jeu deux acteurs : le client (_l_p_r) permet a tout utilisateur de soumettre des travaux d'impression. Le serveur quant a lui (_l_p_d) les prend en charge en tache de fond. Il recupere les donnees dans le spool ainsi que des informations qui lui sont necessaires pour l'impression proprement dite. Nous verrons dans un chapitre un peu plus loin comment tout cela interagit. Arretons-nous la pour le moment et penchons-nous deja sur le plus important: les peripheriques du systeme. 33.. CCoommmmeenntt IImmpprriimmeerr Si le demon d'impression de votre machine est correctement configure, vous pouvez lire le _P_r_i_n_t_i_n_g_-_U_s_a_g_e _H_O_W_T_O /dev/ttyS2 produit une sortie correcte pour les fichiers courts et tronquee pour les longs fichiers, vous etes peut-etre dans ce cas. Le delai de 30 secondes peut etre ajuste a l'aide du parametre ``closing_wait'' (attente fermeture) de la commande setserial (version 2.12 et ulterieure). Notez que les ports serie sont generalement configures au demarrage de la machine grace a un appel a setserial dans le fichier /etc/rc.d/rc.serial. Vous pouvez rajouter toute option necessaire dans ce fichier. 44.. LLeess iimmpprriimmaanntteess ssuuppppoorrtteeeess Le noyau Linux supporte quasiment toutes les imprimantes que vous pouvez physiquement connecter au port serie ou parallele. Il y a neanmoins des petites choses a savoir, notamment certaines imprimantes a eviter bien qu'elles puissent (electriquement parlant) communiquer avec Linux. En premier lieu, il existe toute une generation d'imprimantes incompatibles s'appuyant sur le ``Windows Printing System'' et qui repondent au label ``pour Windows''. Ces imprimantes ne fonctionnent pas avec Linux. Elles font travailler l'unite centrale pour des taches normalement laissees au microprocesseur de l'imprimante. Malheureusement ces taches ne peuvent etre effectuees que par le pilote du constructeur qui ne tourne que sous Windows. Conclusion n'achetez pas ce genre d'imprimante pour Linux. Evidemment, sous Linux, comme d'ailleurs sous tout autre systeme, le meilleur choix est d'avoir une imprimante PostScript. Presquer tous les logiciels Unix produisent du _P_o_s_t_S_c_r_i_p_t et bien evidemment le mieux est d'avoir une imprimante qui le comprend. Cela simplifie. Malheureusement _P_o_s_t_S_c_r_i_p_t n'est pratiquement pas disponible en dehors du domaine des imprimantes laser. Et c'est cher. Rassurez-vous, vous pouvez utiliser toute autre imprimante. Si vous ne comptez pas avoir de PostScript a imprimer, vous pouvez connecter une simple imprimante matricielle retrouvee dans votre grenier. Sinon, comme nous le verrons, il faudra passer par un logiciel d'interpretation du _P_o_s_t_S_c_r_i_p_t (le plus celebre est le logiciel gratuit _G_h_o_s_t_S_c_r_i_p_t de _A_l_l_a_d_i_n _s_o_f_t_w_a_r_e). Utilisez alors une imprimante reconnue par ce logiciel. Voir http://www.cs.wisc.edu/~ghost/printer.html pour des informations mises a jour selon les versions disponibles et les pilotes en test. Les imprimantes supportees sont: Canon BubbleJet BJ10e Canon BubbleJet BJ200 Canon BubbleJet BJC-210 (4.01) N/B seulement Canon BubbleJet BJC-240 (3.33, 4.03) N/B seulement Canon BubbleJet BJC-600 Canon BubbleJet BJC-610 (3.53) 360dpi seulement, N/B & couleur. Voir correctif bjc610. Canon BubbleJet BJC-4000 Canon BubbleJet BJC-4100 (4.01) pas couleur. Canon MultiPASS C2500 Canon BJC-240 (5.01) Canon BJC-70 (5.01) Canon BubbleJet BJC-800 HP DeskJet (3.33) HP DeskJet Plus (3.33) HP DeskJet 500 (3.53) HP DeskJet Portable (4.01) HP DeskJet 400 (3.33, 4.03) N/B teste seulement. HP DeskJet 500C (3.53) HP DeskJet 540C (3.53) HP DeskJet 690C (4.03) 1bit/pixel et 32bit/pixel HP DeskJet 693C (4.03) HP DeskJet 550C (3.53) HP DeskJet 560C (3.53) HP DeskJet 600 (3.53) N/B teste seulement (1bit/pixel or 32bit/pixel) HP DeskJet 660C (3.53) HP DeskJet 682C (4.01) Utiliser gamma=0.3 HP DeskJet 683C (3.33, 4.03) HP DeskJet 693C (4.03) 24bit/pixel HP DeskJet 850 (3.53) 300dpi HP DeskJet 870Cse (4.03) (16 ou 32 bits/pixel) HP DeskJet 850 HP DeskJet 870Cse (4.03) HP DeskJet 870Cxi (4.03) HP DeskJet 680 (5.01) HP DeskJet 500C (3.53) HP DeskJet 500C (3.53) HP DeskJet 510 (3.53) HP DeskJet 520 (3.53) HP DeskJet 540C (3.53) HP DeskJet 693C (4.03) HP DeskJet 600 (3.53) HP DeskJet 600 (3.53) marges incorrectes HP DeskJet 870Cse (4.03) HP LaserJet 5 (4.01) 300dpi ou 600dpi HP LaserJet 5L (4.03) 300dpi ou 600dpi Marges incorrectes dans GS 3.33. Correct dans GS 4.03. Oki OL410ex LED printer (4.03) 300dpi ou 600dpi HP PaintJet XL300 HP DeskJet 600 (3.53) 300dpi OK, 600 dpi tres lent HP DeskJet 1200C (3.53) HP DeskJet 1600C (4.03) 24bit/pixel. -dShingling=2 -dDepletion=1 -dPrintQuality=1 Ricoh 4081 laser printer (3.53) Ricoh 6000 laser printer (3.53) Epson Stylus Color (3.53) Epson Stylus Color II (3.53) -r360 -dMicroweave voir devices.txt et GS stcolor FAQ Epson Stylus 500 (4.03) -r360 or -r720, -dMicroweave voir les notes d'Alan Williams sur GS. (Ne marche pas avec 3.33.) Epson Stylus 800 (3.53) -sModel=st800 55.. QQuueell ddeemmoonn dd''iimmpprreessssiioonn ?? Jusque recemment, le choix sous Linux etait simple puisque tout le monde disposait du seul demon lpd sorti tout droit et presque tel quel du code BSD Net-2. Aujourd'hui la plupart des fournisseurs proposent ce logiciel. Mais les choses sont en train de changer. Les systemes SVR4 tels que Sun Solaris sont fournis avec un paquetage logiciel d'impression centre sur lpsched. D'autre part, sous Linux, quelques fournisseurs proposent LPRng, une implementation beaucoup plus recente et disponible gratuitement. LPRng est tres facilement administrable notamment sur des plate-formes importantes et contient du code plus robuste (moins farfelu??) que lpd. A l'heure actuelle malgre toutes ces nouveautes, lpd est certainement ce qui convient le mieux a la plupart des utilisateurs. Meme si ce n'est pas le fin du fin, il tourne bien une fois configure et, chose importante, il est tres bien documente dans les livres sur Unix. Pour plus d'information sur LPRng, allez voir sur http://ltpwww.gsfc.nasa.gov/ltpcf/about/unix/Depotdoc/LPRng/. 66.. LL''iimmpprreessssiioonn,, ccoommmmeenntt ccaa mmaarrcchhee Nous considerons ici que vous utilisez la suite logicielle lpd que nous decrirons d'ailleurs. Elle est la plus repandue et fonctionne tres bien. 66..11.. IImmpprreessssiioonn llooccaallee eett iimmpprreessssiioonn ddiissttaannttee L'impression locale permet aux utilisateurs d'envoyer des travaux d'impression a l'imprimante directement rattachee a leur machine. L'impression distante, par contre, permet de soumettre des travaux d'impression depuis une machine, a une autre machine sur le reseau, sur laquelle est connectee une imprimante. 66..22.. DDee qquuooii aavveezz vvoouuss bbeessooiinn Nous supposons que vous savez editer un fichier texte sous Linux et que vous avez une bonne comprehension des notions de droits d'acces et de propriete (chmod, chown). Nous supposons egalement que votre systeme Linux fonctionne correctement. En particulier, si vous souhaitez faire de l'impression distante, que votre reseau fonctionne deja. Consultez a ce propos les nombreuses documentations disponibles sur le sujet (comme on dit: RTFM, ce qui en bon francais veut dire LLBD :-)). 66..33.. LLeess pprrooggrraammmmeess iimmppoorrttaannttss Le systeme d'impression Unix comprend (au moins) 5 programmes. Ils doivent se trouver a l'endroit decrit (c'est le mieux) ou dans un repertoire accessible (avec la variable PATH), appartenir a root (groupe lp), et avoir les permissions suivantes : -r-sr-sr-x root lp /usr/bin/lpr -r-sr-sr-x root lp /usr/bin/lpq -r-sr-sr-x root lp /usr/bin/lprm -r-xr-sr-x root lp /usr/sbin/lpc -rwxr--r-- root lp /usr/sbin/lpd Les quatre premiers sont utilises pour soumettre, visualiser, annuler, controler les travaux d'impression. Le dernier est le demon. Il existe bien entendu des pages de manuel en ligne pour ces commandes que vous pourrez consulter pour plus d'information. Le point important a noter est que les commandes lpr, lpq, lpc et lprm operent sur une imprimante par defaut nommee lp. La variable d'environnement PRINTER peut contenir le nom de l'imprimante que vous avez choisie. La specification du nom d'une imprimante sur la ligne de commande surchargera ces definitions (les imprimantes de l'exemple sont hors-ligne): # echo $PRINTER (vide) # # lpq waiting for lp to become ready (offline ?) ... # export PRINTER=mon_imprimante # lpq waiting for mon_imprimante to become ready (offline ?) ... # lpq -Plpr0 waiting for lpr0 to become ready (offline ?) ... 66..33..11.. LLee cclliieenntt eett llee sseerrvveeuurr Voici ci-dessous les interactions client - demon _________ +/BlaBla /+ //________//| / / + +----------------+ +----------+ / | LPR | |= oo |/ +----------------+ +----------+ | Imprimante | ^ V | +----------------+ +------------------+ | LPD |------>------>----| LPD | +----------------+ +------------------+ Soumission d'un requete d'impression +----------------+ | LPQ | +----------------+ \ \_______>______ \ +----------------+ \+------------------+ | LPD | | LPD | +----------------+ +------------------+ Soumission d'une demande d'information Lorsque le systeme demarre, lpd est charge. Il lit le fichier /etc/printcap (dont vous trouverez une explication plus loin) qui decrit les imprimantes connues. 66..33..22.. LLeess ffiicchhiieerrss ssoouummiiss ppaarr llee cclliieenntt Lorsqu'un programme client soumet un travail d'impression, il genere deux fichiers qu'il ecrit dans le spool: +o Un fichier de donnees qui contient une copie des donnees que vous souhaitez soumettre a l'imprimante. Il s'agit bien d'une copie, ce qui signifie que toute modification ulterieure de votre fichier n'alterera pas l'impression. +o Un fichier de description du travail a effectuer. 66..33..33.. LLaa ccoommmmaannddee llpprr La commande lpr soumet un travail d'impression. Elle se charge de mettre les donnees a imprimer dans un fichier dans le spool d'impression. Ces donnees peuvent provenir soit d'un fichier (les donnees sont dupliquees et toute modification ulterieure du fichier d'origine n'affectera pas l'impression), soit de l'entree standard (stdin). Le demon est averti de l'existence d'un nouveau fichier et envoie, des que possible, les donnees vers l'imprimante physique (ou la machine distante). La taille du spool est bien entendu limitee a la place disponible sur votre disque dans /usr/spool/ ou a la taille limite specifiee dans le fichier de configuration printcap. Vous pouvez neanmoins imprimer un gros fichier en demandant a lpr de ne pas dupliquer le fichier. Le demon d'impression ira alors chercher le fichier que vous indiquez dans la ligne de commande et non plus dans le spool. 66..33..44.. LLaa ccoommmmaannddee llppqq La commande lpq affiche le contenu du spool, pour une imprimante donnee. Une des informations importantes fournies est le numero du travail (job). C'est lui qui pourra servir a annuler un des travaux soumis, y compris celui en cours d'impression. Parmi tous les travaux soumis, l'indication ``active'' indique le travail en cours d'impression (ou que lpd essaie d'envoyer a l'impression). 66..33..55.. LLaa ccoommmmaannddee llpprrmm La commande lprm enleve un travail de la file (et donc le fichier du spool). Vous pouvez soit specifier un numero de job, soit un tiret permettant de supprimer tous les travaux vous appartenant. Si vous etes root, tous les travaux sont supprimes. Pour supprimer les travaux d'un utilisateur, specifiez son nom. # lprm 1 dfA001Aa00484 dequeued cfA001Aa00484 dequeued # Le premier fichier contient les donnees a imprimer. Il a ete cree par lpr. Le deuxieme contient des informations que le demon utilise pour savoir que faire des donnees (impression locale, distante, ...) Consultez le manuel en ligne : lpd(8). 66..33..66.. LLaa ccoommmmaannddee llppcc La commande lpc permet de controler les travaux en cours ainsi que l'imprimante, et certains aspects de son utilisation. En particulier, vous pouvez demarrer ou stopper la sortie des travaux du spool pour l'impression, valider ou invalider une imprimante, et meme modifier l'ordre d'impression des fichiers. Les commandes suivantes permettent d'invalider l'impression sur mon_imprimante, de valider le spool sur ton_imprimante, et de faire passer le job 37 en debut de file: lpc down mon_imprimante lpc enable ton_imprimante lpc topq 37 lpc peut fonctionner en interactif si aucun parametre ne lui est passe. Vous pouvez lire les pages du manuel en ligne pour obtenir des instructions completes. A noter que certaines actions de lpc sont reservees au super-utilisateur (root). 66..44.. LLeess rreeppeerrttooiirreess iimmppoorrttaannttss Le repertoire le plus important est le repertoire de spool, dans lequel les donnees vont etre stockees avant d'etre imprimees. Typiquement, un systeme sera configure pour avoir un repertoire de spool par imprimante. Cela rend la gestion plus facile. Sur mon systeme, par exemple, le repertoire /usr/spool/lp est le repertoire principal. Sous ce repertoire, on y trouve le sous-repertoire lpr0, correspondant a la declaration que j'ai faite dans /etc/printcap pour le repertoire de spool de mon imprimante. NDT: Ce qui va suivre decrit une facon de faire pour donner les bons droits d'acces aux repertoires de spool. Differentes methodes sont possibles, sachant que, comme sous Un*x, beaucoup de choses sont possibles dans ce domaine, il convient de faire attention de ne pas offrir de failles a la securite de l'ensemble. Le repertoire de spool doit appartenir a root, et au groupe lp, avec les droits de lecture/d'ecriture pour utilisateur et groupe, et lecture seule pour le reste du monde. chmod ug=rwx,o=rx lpr0 chgrp lp lpr0 drwxrwxr-x 2 root lp 1024 Feb 11 10:51 lpr0/ Un autre repertoire doit egalement etre present : /usr/spool/lpd avec les memes droits. Vous aurez plus d'informations plus avant dans ce document. 66..55.. LLeess ffiicchhiieerrss iimmppoorrttaannttss En dehors des programmes que nous avons deja evoques precedemment, quatre fichiers doivent se trouver dans chaque repertoire de spool. Avec les versions recentes des gestionnaires d'impression, vous n'avez pas a vous soucier de ces fichiers. Ils sont crees automatiquement s'ils n'existent pas : .seq, errs, lock et status. Ces fichiers doivent avoir les droits -rw-rw-r--. Le fichier .seq contient un compteur pour l'affectation des numeros de jobs. Le fichier status contient le message devant etre emis par la commande lpc stat. Le fichier lock est utilise par le demon pour qu'il n'imprime qu'un fichier a la fois. Le fichier errs contient les erreurs survenues sur l'imprimante. Le fichier errs n'est pas obligatoire. De plus, il peut s'appeler comme vous le souhaitez, pourvu que son nom soit declare dans le fichier /etc/printcap que nous decrirons dans la suite. 77.. CCoonnffiigguurreerr lleess sseerrvviicceess dd''iimmpprreessssiioonn La configuration minimale pour un systeme d'impression permet de mettre des fichiers en file d'impression puis de les imprimer. Il ne prete aucune attention au fait que votre imprimante puisse les imprimer (les comprendre meme) et ne vous permettra pas d'imprimer des choses extraordinaires. Neanmoins, c'est un premier pas. 77..11.. LLee ffiicchhiieerr //eettcc//pprriinnttccaapp Le fichier /etc/printcap decrit toutes les imprimantes que votre systeme doit connaitre. Il peut etre modifie avec votre editeur prefere, doit appartenir a root et avoir les droits suivants: -rw-r--r-- 1 root system 164 Oct 25 21:23 /etc/printcap Le contenu du fichier semble assez incomprehensible a premiere vue. Il respecte effectivement une syntaxe particuliere et malgre les apparences, assez simple lorsque l'on connait ! Il n'y a pas toujours de manuels concernant ce fichier, et cela complique un peu les choses. Un petit conseil en passant : essayez, dans la mesure du possible de rendre votre fichier le plus lisible possible, avec des commentaires. Vous pouvez consulter les pages du manuel en ligne concernant printcap(5) (ou empressez-vous de les recuperer si vous ne les avez pas). Plus loin sont decrits les parametres importants. Une entree de printcap decrit une imprimante, c'est-a-dire une correspondance nom logique - imprimante physique, puis decrit la facon de transmettre les donnees. Par exemple, une entree va decrire le peripherique physique a utiliser, le repertoire de spool, les traitements a effectuer sur les donnees avant impression, ou encore le repertoire dans lequel seront notifiees les erreurs. Vous pouvez aussi limiter la quantite de donnees pour un job, ou meme limiter l'acces d'une imprimante a une classe d'utilisateurs. Vous trouverez dans la partie suivante la description des champs. Il est tout a fait possible d'avoir plusieurs entrees decrivant differentes facons d'envoyer des donnees a une meme imprimante physique. Par exemple, une imprimante physique peut supporter les formats HP LaserJet et PostScript, en fonction de la sequence de caracteres envoyee au debut d'un travail. Vous definirez donc deux entrees, l'une permettant de traiter le format HP, l'autre le format _P_o_s_t_S_c_r_i_p_t. Les programmes generant des donnees ``HP'' les enverront a l'imprimante HP, ceux generant des donnees _P_o_s_t_S_c_r_i_p_t les enverront a l'imprimante _P_o_s_t_S_c_r_i_p_t. Toutes les deux representent la meme imprimante physique. Les programmes qui modifient les donnees avant de les envoyer a l'imprimante physique sont des filtres. Exemple d'entree d'un fichier /etc/printcap: # LOCAL djet500 lp|dj|deskjet:\ :sd=/var/spool/lpd/dj:\ :mx#0:\ :lp=/dev/lp0:\ :sh: Ceci definit une imprimante dont les noms sont lp (par defaut), dj et deskjet. Les deux derniers sont des alias de la meme imprimante. La file (on dit tres souvent le spool, meme en francais...) de cette imprimante de trouve dans le repertoire /var/spool/lpd/dj (sd signifie spool directory). Le peripherique utilise est /dev/lp0. La page d'en-tete est supprimee (sh) et aucune limite de taille de fichier n'est fixee (mx) Notez que la meme entree pourrait s'ecrire: lp|dj|deskjet:sd=/var/spool/lpd/dj:mx#0:lp=/dev/lp0:sh: mais c'est moins beau. Vous pouvez consultez la page de manuel de printcap sur http://www.picante.com/~gtaylor/pht/man/printcap.html. Toutes les options y sont decrites. Tous les champs exceptes les noms d'imprimantes sont entoures de deux- points et reperes par un symbole de deux lettres suivi du signe egal. Ensuite est indiquee la valeur qui peut etre de type numerique, booleenne ou chaine de caracteres: champ type signification lp string designe le peripherique d'impression sd string designe le repertoire de spool lf string designe le fichier de rapport d'erreurs if string specifie le nom du filtre d'entree rm string designe le nom d'un site d'impression distant rp string designe le nom d'une imprimante distante sh booleen indique s'il faut supprimer les en-tetes sf booleen indique s'il faut supprimer les sauts de pages de fin de travaux mx numerique indique la taille maximum d'un job (en blocs = 1Ko sous linux) 77..11..11.. DDeettaaiillss ssuurr llee cchhaammpp llpp Si vous specifiez /dev/null comme peripherique, tous les traitements se feront, mais tout partira a la poubelle. Ca semble ridicule, mais cela vous permet par exemple de tester une configuration. Lisez le chapitre ``Imprimantes qui ne sont pas de simples peripheriques''. Si vous designez une imprimante distante avec rp et rm, lp doit contenir :lp=:. Ne laissez pas ce champ vide en cas d'impression locale, le demon signalerait une erreur. 77..11..22.. DDeettaaiillss ssuurr llee cchhaammpp llff Tout fichier specifie ici doit exister, sinon le rapport d'erreurs ne se ferait pas. 77..11..33.. DDeettaaiillss ssuurr llee cchhaammpp iiff Les filtres d'entree sont des utilitaires transformant les donnees qu'il recoivent sur leur entree standard en un format particulier qu'il sortent sur leur sortie standard. Typiquement, la conversion texte - _P_o_s_t_S_c_r_i_p_t deja mentionnee. Si vous specifiez un filtre d'entree, le demon n'envoie pas directement les donnees au peripherique. Il execute le filtre en dirigeant les donnes sur son entree standard et en designant le peripherique de sortie comme sortie standard. 77..11..44.. DDeettaaiillss ssuurr lleess cchhaammppss rrmm eett rrpp Envoyer des donnees a une imprimante rattachee a une machine distante est tres simple: il suffit de specifier le nom de la machine avec rm et le nom de l'imprimante avec rp. S'assurer que l'entree lp est vide. A noter que les donnees seront d'abord mises dans le spool local avant d'etre transferees. Meme si votre imprimante est distante, il faudra egalement un spool local. 77..11..55.. DDeettaaiillss ssuurr lleess cchhaammppss sshh eett ssff Les bannieres concernent eventuellement les utilisations a plusieurs personnes. Elles identifient les jobs. La suppression de ces bannieres vous permet d'economiser du papier. Par contre la gestion des sauts de page sera plus interessante, surtout si vous utilisez des traitements de textes qui formatent toujours des pages pleines. Dans ce cas, pas besoin de saut de page supplementaire. Vous auriez sinon une page blanche en fin de chaque travail. Si vous utilisez des listings ou autres documents, ajouter un saut de page garantit que chaque travail commancera bien en debut de page. 77..11..66.. DDeettaaiill ssuurr llee cchhaammpp mmxx Ce champ permet de limiter la taille des donnees pour chaque job. Le nombre a specifier est en blocs de BUFSIZE (pardon, de 1 Ko) sous Linux. La valeur 0 rend la taille illimitee, permettant la soumission de travaux limitee uniquement a la taille du disque. Notez que la limite concerne la taille des donnees mises en spool, et non pas les donnees envoyees a l'imprimante physique. Si la limite est depassee, le fichier est tronque avec l'emission d'un message disant: lpr: : copy file is too large. Cela peut etre interessant pour des imprimantes physiques en mode texte, notamment si des utilisateurs ou des programmes creent accidentellement des donnees trop volumineuses. Si vous manquez de memoire de masse, pourquoi n'inventeriez-vous pas un filtre qui decompresse ce qu'il a a envoyer a l'imprimante ? Vous soumettriez alors des donnees compressees. 88.. LLeess ffiillttrreess Si avec les explications precedentes, tout marche c'est formidable, mais en regle general, 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 _P_o_s_t_S_c_r_i_p_t... Vous obtenez le listing complet du code _P_o_s_t_S_c_r_i_p_t avec les meme effets d'escalier. Une horreur. Il faut donc quelque chose de plus et c'est le role des filtres. Les plus observateurs d'entre vous auront peut-etre remarque l'existence des parametres 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 executable qui lit les donnees sur son entree standard et sort le resultat sur sa sortie standard. Commencons par ecrire un script que vous appellerez filtre et qui ajoute des retours chariot avant chaque caractere fin de ligne. Ceci elimine 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(){chop $_; print "$_\r\n";}; # Vous pouvez aussi vouloir terminer avec une fin de page: print "\f"; Dans /etc/printcap, l'entree est modifiee en consequence: lp|dj|deskjet:\ :sd=/var/spool/lpd/dj:\ :mx#0:\ :lp=/dev/lp0:\ :if=/var/spool/lpd/dj/filtre:\ :sh: Essayez d'ecrire 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 caractere retour-chariot et non pas un `^' suivi d'un 'M'. Dans emacs, pour saisir ce caractere, entrez la sequence 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 genere des parametres qui sont passes au filtre. Par defaut il passe -w0. Si l'option -l est donnee, il passe -c. Ce script est traditionnellement nomme /usr/lib/lpf. Si vous avez plusieurs scripts de la sorte, une bonne idee consiste a les mettre tous dans un sous-repertoire, par exemple /usr/lib/lpd. Il se peut aussi que votre imprimante puisse passer dans un mode permettant l'ajout de retour-chariots grace a une sequence d'echappement. Voici un exemple de filtre utilisant la commande echo -ne pour envoyer cette sequence: #!/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 reconnait le fichier d'entree et le convertit au bon format pour votre imprimante. Un tel filtre est appele filtre magique. Ne vous embetez pas a les ecrire vous-meme, il en existe surement deja un qui vous convient. Allez voir sur tsx-11.mit.edu:/pub/linux/sources/usr.bin/magic-filter-x.y.tar.gz. 99.. LLeess ffiicchhiieerrss,, lleeuurr eemmppllaacceemmeenntt eett lleess ddrrooiittss dd''aacccceess Les differences qui existent entre les nombreuses distributions font que l'on ne peut ici etre exhaustif. Je pense que beaucoup de gens utilisent maintenant les distributions type slackware et on peut raisonnablement s'appuyer sur cet exemple. Pensez a inclure lpd dans le fichier rc.local apres le demarrage eventuel de syslogd. Voici les fichiers tels que l'on peut les trouver: -r-sr-xr-x 1 root lp 9308 Aug 23 21:45 /usr/bin/lpq* -r-sr-xr-x 1 root lp 10056 Aug 23 21:45 /usr/bin/lpr* -r-sr-xr-x 1 root lp 8900 Aug 23 21:45 /usr/bin/lprm* -r-x------ 1 root lp 1596 Aug 23 21:45 /usr/bin/lptest* -r-xr-sr-x 1 root lp 17160 Aug 23 21:45 /usr/sbin/lpc* -rwxr--r-- 1 root lp 34072 Aug 23 21:45 /usr/sbin/lpd* et pour chaque repertoire de spool: /usr/spool/lp/lpr0/ total 5 drwxr-xr-x 2 root lp 1024 Feb 12 15:15 ./ drwxr-xr-x 3 root lp 1024 Sep 2 1993 ../ -rw-r----x 1 root lp 4 Feb 12 15:15 .seq -rw-r--r-- 1 root lp 3 Feb 13 20:46 lock -rw-rw-r-- 1 root root 27 Feb 12 15:15 status Ces trois fichiers sont crees par lpr et lpd. Ils peuvent etre absents si vous ne les avez encore jamais lances. Avec d'anciennes versions il fallait executer touch sur ces fichiers ou bien modifier leurs droits. Les bugs concernant ces fichiers ont maintenant ete corriges dans les versions recentes. Il est a noter egalement que le groupe d'appartenance etait daemon avec d'anciennes versions, et est maintenant lp. Ne soyez pas surpris de trouver des choses legerement differentes sur votre systeme. D'un autre cote, si quelque chose ne fonctionne pas, pensez a soupconner ces droits avant d'affoler nos boites aux lettres (Si vous saviez le nombre de courriers electroniques recus et dont la solution se trouve la !). On peut trouver le programme lpr avec ou sans le bit setuid(root). En fait ce n'est pas si evident que cela. Tout depend des droits et permissions des repertoires de spool. Autant que je sache, il y a une totale securite avec lpr, meme si il est setuid(root). Donc, a la limite, positionnez le bit pour ne pas vous soucier des droits d'acces au repertoire de spool. Vous etes libre de mettre les binaires dans les repertoires que vous voulez, bien qu'ils se trouvent couramment dans /usr/bin ou /usr/sbin. (lpc et lpd peuvent se trouver par exemple dans /etc). Certaines commandes etant interessantes pour tout utilisateur, il est bon de les laisser aux endroits habituels. Attention toutefois, car les gens qui concoivent les distributions sont egalement libres de choisir. Pensez a supprimer les anciennes versions, si vous changez de distribution. L'emplacement du fichier de verrouillage principal du demon lpd (lpd.lock), est fixe en dur dans le code. Il se trouve dans /var/spool/lpd/lpd.lock. Donc, vous devrez prevoir un repertoire /var/spool/lpd meme si votre repertoire de spool est different. Les binaires anciens mettaient ce fichier dans /var/spool/lpd.lock/ Typiquement, chez moi, on trouve /var/spool/lpd/ drwxr-xr-x 4 root lp 1024 Aug 18 1994 ./ drwxr-xr-x 18 root root 1024 Aug 17 1994 ../ -rw-r--r-- 1 root root 3 Feb 14 20:12 lpd.lock /var/spool/lp/lpr0 drwxr-xr-x 2 root lp 1024 Feb 12 15:15 ./ drwxr-xr-x 3 root lp 1024 Sep 2 1993 ../ -rw-r----x 1 root lp 4 Feb 12 15:15 .seq* -rw-r--r-- 1 root root 3 Feb 14 20:12 lock -rw-rw-r-- 1 root root 27 Feb 12 15:15 status Etant donne que l'on jongle en permanence entre /usr et /var, il est clair qu'un lien doit exister entre les deux. Soit vous definissez vos repertoires dans /usr/spool/... et definissez le lien /var vers /usr, soit vous mettez tout sous /var/spool/lpd... et definissez le lien /usr/spool vers /var/spool. Si vous avez, comme moi, une partition root (/) et une partition /usr, les deux cas ne sont pas identiques. Dans le premier, vos fichiers seront stockes dans la partition de root, /var etant cree sous /, dans l'autre, ce sera dans la partition /usr, puisque /usr est monte. Vous pouvez aussi avoir un systeme de fichiers /var reserve. Le fichier de configuration principal est /etc/printcap. Il existe aussi, pour l'impression distante, les fichiers /etc/hosts.allow et /etc/hosts.lpd. Desormais, le repertoire /etc est le repertoire ou sont situes les fichiers de configuration. Vous pouvez choisir de les mettre ailleurs, mais definissez toujours un lien symbolique de /etc vers vos fichiers. Si votre systeme comporte des binaires qui vont toujours chercher leur configuration dans /usr/etc ou /etc/inet, ils sont surement tres anciens et vous gagneriez a mettre votre systeme a jour. 1100.. OOuu ttrroouuvveerr ddeess ffiillttrreess dd''iimmpprreessssiioonn ?? Pas mal de filtres sont deja rediges et disponibles sur _S_u_n_s_i_t_e ou _l_i_p_6 dans /pub/sunsite/linux/system/printing. 1100..11.. LLeess ffiillttrreess mmaaggiiqquueess Titre: magicfilter Version: 1.1b Date-entree: 04APR95 Description: Un filtre d'impression automatique, extensible, parametrable. Detecte tout type de fichier pour lequel existe un utilitaire de conversion. Ce filtre est ecrit en C et completement controle' par un fichier de configuration externe. Cette version apporte la creation "automagique" de ce fichier d'apres les logiciels installes sur votre systeme grace a 'GNU Autoconf'. Cette version corrige les bogues de la version 1.1/1.1a; En plus: filtres pour imprimantes PostScript non-ASCII Auteur: H. Peter Anvin Site-initial: sunsite.unc.edu 53000 /pub/Linux/system/printing/magicfilter-1.1b.tar.gz licence-copie: GPL 1100..22.. LLeess ffiillttrreess AAPPSS Titre: apsfilter Version: 4.9.1 Date-entree: Lundi, 10. Juillet 1995, 21:22:35 MET DST Description: magicfilter for lpd with auto filetype detection Mots-cles: lpd magicfilter aps apsfilter Site-initial: sunsite.unc.edu /pub/Linux/system/printing/ 211KB aps-491.tgz Platformes: C-Compiler, gs Postscript emulator, pbmutils Licence-copie: GPL Les filtres APS se configurent dans l'entree _i_f du fichier /etc/printcap et convertissent la plupart des types de fichiers connus (texte, _P_o_s_t_S_c_r_i_p_t, dvi, gif, ...) en commandes comprehensibles par votre imprimante. 1100..33.. LLeess ffiillttrreess EEZZ--mmaaggiicc Titre: ez-magic printer filter Version: 1.0.5 Date-entree: 26 Janvier 1997 Description: ez-magic est un filtre d'impression supportant 8 formats de fichiers (txt,ps,gif,bmp,pcx,png,jpg,tif). Il permet l'impression via un reseau (SMB), ou vers une imprimante locale. Lit depuis un fichier, STDIN ou lpd. Simple a utiliser et a configurer. Seul un fichier 'script' est necessaire, pas de multitudes de manuels et pilotes. Necessite des programmes de conversion (tels que netpbm et ghostscript). Ecrit en 'bash'. Ajout de nouveaux formats facile. Preconfigure pour HP DeskJet 870Cse en reseau. Comparable a apsfilter et autres. Mots-cles: magic filter, print, graphics, samba, network, smb, ghostscript, postscript, gif, jpg, simple Auteur: toby@eskimo.com (Toby Reed) Maintenu-par: toby@eskimo.com (Toby Reed) Site-initial: http://www.eskimo.com/~toby/ez-magic-1.0.5.tar.gz 38 kb ez-magic-1.0.5.tar.gz Site-secondaire:sunsite.unc.edu /pub/Linux/system/printing 38 kb ez-magic-1.0.5.tar.gz Licence-copie: Copyright, droits complets de manipulation sauf 1 ou 2 restrictions. 1111.. LLeess llooggiicciieellss dd''iimmpprreessssiioonn Les logiciels d'impression sont disponibles en France par exemple sur ftp://ftp.lip6.fr/pub/linux/sunsite/system/Printing. 1111..11.. GGhhoossttSSccrriipptt _G_h_o_s_t_S_c_r_i_p_t est un logiciel majeur pour l'impression sous Linux. En effet la plupart des logiciels generent du _P_o_s_t_S_c_r_i_p_t. Ce logiciel, gratuit, est capable de convertir le _P_o_s_t_S_c_r_i_p_t en langage comprehensible par votre imprimante (si le pilote est disponible). Il joue le role de filtre afin que vous puissiez considerer votre imprimante comme _P_o_s_t_S_c_r_i_p_t. Ceci vous simplifie grandement la vie. _G_h_o_s_t_S_c_r_i_p_t est disponible sous deux formes. Une version commerciale, appelee _A_l_l_a_d_i_n _G_h_o_s_t_S_c_r_i_p_t, peut etre utilisee librement pour des besoins prives mais ne doit pas etre distribuee par les distributions payantes de Linux. Elle est generalement en avance d'une annee sur la version gratuite. La version gratuite est sous licence GNU et n'est rien d'autre qu'une version plus ancienne de _A_l_l_a_d_i_n _G_h_o_s_t_S_c_r_i_p_t. 1111..11..11.. UUttiilliisseerr GGhhoossttSSccrriipptt gs est le nom de l'executable. gs -help vous donne une aide rapide sur les parametres disponibles. (La liste des pilotes est la liste des pilotes compiles avec la version et non la liste complete.) Quoi que vous fassiez avec gs, il est conseille d'invalider l'acces aux fichiers (par -dSAFER). En effet _P_o_s_t_S_c_r_i_p_t est un langage pleinement operationnel et un fichier _P_o_s_t_S_c_r_i_p_t peu scrupuleux peut endommager vos fichiers et vous donner un terrible mal de crane.. Exemple de ligne de commande pour un imprimante Stylus 800 gs -dNOPAUSE -sDEVICE=escp2 -sPAPERSIZE=a4 -sOutputFile=/dev/lp1 fichier.ps 1111..11..22.. RReeggllaaggeess La taille, l'aspect et la situation d'une image sur une page sont regles par le pilote de l'imprimante dans _G_h_o_s_t_S_c_r_i_p_t. Si vous trouvez que vos impressions sont tronquees ou mal cadrees il faudra soit retoucher le code du pilote (deconseille), soit modifier les fichiers de configuration (gs_init.ps, gamma.ps) 1111..11..33.. GGaammmmaa,, ttaaiilllleess ddee ppooiinnttss,, ...... Il se peut que vous trouviez vos impressions trop sombres. Ceci peut arriver si votre imprimante n'a pas une definition suffisante. Dans ce cas vous devez creer votre propre fonction de transfert. Pour ceci, creez le fichier gamma.ps dans le repertoire des librairies de _G_h_o_s_t_S_c_r_i_p_t et appelez le fichier sur la ligne de commande de gs avant le fichier a imprimer. Pour eclaricir le resultat, vous devez diminuer les valeurs indiquees. Notamment si votre pilote utilise l'algorithme de _F_l_o_y_d_-_S_t_e_i_n_b_e_r_g pour rasteriser les couleurs, des valeurs comprises entre 0.15 et 0.2 sont mieux adaptees. ---8<---- gamma.ps ----8<--- %! %transfer functions for cyan magenta yellow black {0.3 exp} {0.3 exp} {0.3 exp} {0.3 exp} setcolortransfer ---8<------------------8<--- Vous pouvez aussi modifier les dominantes de couleurs (voir le repertoire /examples de _G_h_o_s_t_S_c_r_i_p_t qui contient une page de test des couleurs). 1122.. LL''iimmpprreessssiioonn aa ddiissttaannccee Une des caracteristiques de lpd est qu'il supporte l'impression sur des imprimantes rattachees a d'autres machines que la votre. Avec, en plus, une combinaison de filtres soignee, vous aurez un systeme d'impression transparent, reparti et performant. 1122..11.. VVeerrss uunn hhoottee UUnniixx//llppdd Pour que des machines distantes puissent utiliser l'imprimante attachee a votre machine, le nom de ces machines doit etre reference soit dans le fichier /etc/hosts.lpd, soit dans le fichier /etc/hosts.equiv. Ce sont des fichiers textes normaux, dans lesquels on indique un nom de machine par ligne. Il est preferable de declarer les machines dans /etc/hosts.lpd qui est specialement reserve a l'impression, le fichier /etc/hosts.equiv donnant des droits plus etendus. Vous pouvez restreindre les droits d'acces distants par groupe ou par utilisateur. Les groupes autorises sont indiques grace au parametre :rg=: du fichier printcap: rg=admin restreint l'utilisation aux utilisateurs du groupe admin. Le parametre booleen :rs=: du meme fichier restreint l'acces aux utilisateurs ayant un compte sur votre machine. 1122..11..11.. AAvveecc llppdd Pour imprimer vers une autre machine, vous devez creer une entree printcap telle que: # REMOTE djet500 lp|dj|deskjet:\ :sd=/var/spool/lpd/dj:\ :rm=machine.out.there.com:\ :rp=printername:\ :lp=/dev/null:\ :sh: Vous noterez qu'il doit bien exister un repertoire de spool local gere par votre lpd local. Les fichiers soumis y seront copies puis envoyes vers la machine distante. 1122..11..22.. AAvveecc rrllpprr Vous pouvez utiliser rlpr pour soumettre une impression directement a la machine distante sans passer par un demon local et toute sa configuration. C'est particulierement interessant lorsque vous imprimer rarement et vers differentes imprimantes. rlpr s'appuie sur TCP/IP. Il n'est pas necessaires que les imprimantes soient connues explicitement. N'ayant pas besoin de fichier printcap, il est plus facile a gerer. Il est compatible avec lpr. 1122..22.. LLaannMMaannaaggeerr oouu SSaammbbaa.. IImmpprriimmeerr vveerrss uunnee iimmpprriimmaannttee aattttaacchheeee aa WWiinnddoowwss 9955,, NNTT,, Il existe un mini-document (Printing to Windows HOWTO) qui decrit ceci tres bien. Il est possible de rediriger une file lpd vers un service d'impression SMB grace au programme smbclient (http://www.picante.com/~gtaylor/pht/man/smbclient.html). Samba contient un script (smbprint) qui fait cela. Vous devez mettre un fichier de configuration pour l'imprimante en question dans le repertoire de spool et decrire le programme smbprint en tant que filtre dans /etc/printcap: lp|remote-smbprinter:\ :lp=/dev/null:sh:\ :sd=/var/spool/lpd/lp:\ :if=/usr/local/sbin/smbprint: Vous pouvez egalement utiliser le programme smbclient pour soumettre un fichier directement a un service d'impression SMB sans impliquer lpd. Lisez la documentation de tous ces programmes pour plus d'information. 1122..33.. VVeerrss uunnee iimmpprriimmaannttee NNeettWWaarree La suite logicielle ncpfs contient un utilitaire appele nprint qui fournit les memes fonctionnalites que smbprint pour NetWare. Vous pouvez l'obtenir sur ftp://sunsite.unc.edu/pub/Linux/system/filesystems/ncpfs/. Avec ncpfs vous pouvez monter des volumes du serveur NetWare sous Linux. Vous pouvez egalement soumettre des travaux d'impression vers NetWare ou mettre des travaux d'impression de NetWare en file sur votre systeme Linux. Vous devez disposer d'un noyaux 1.2.x ou 1.3.54 et ulterieur. ncpfs NNEE fonctionne PPAASS avec un noyau 1.3.x (x < 54). Pour que nprint fonctionne via lpd, vous devez ecrire un shell- script pour diriger stdin sur l'imprimante NetWare. Vous l'installerez comme un filtre (if) d'une file d'impression lpd. Vous obtiendrez : sub2|remote-NWprinter:\ :lp=/dev/null:sh:\ :sd=/var/spool/lpd/sub2:\ :if=/var/spool/lpd/nprint-script: le script nprint-script ressemble a quelque chose comme : #! /bin/sh # Essayez en premier le compte invite (guest)sans mot de passe! /usr/local/bin/nprint -S net -U name -P passwd -q printq-name - 1122..44.. VVeerrss uunnee iimmpprriimmaannttee EEtthheerrTTaallkk Le paquetage logiciel netatalk contient l'equivalent de nprint et smbclient. Referez-vous au Netatalk-HOWTO dans lequel est bien decrite la procedure d'impression vers et depuis un reseau _A_p_p_l_e. 1122..55.. VVeerrss uunnee iimmpprriimmaannttee HHPP oouu aauuttrree iimmpprriimmaannttee EEtthheerrnneett Certaines imprimantes (HP et autres) sont fournies avec une interface Ethernet que vous pouvez directement adresser pour soumettre vos travaux d'impression. Conformez-vous au manuel du constructeur. En general, ces imprimantes font ``tourner'' un lpd et fournissent une ou plusieurs files vers lesquelles vous pouvez imprimer. Une imprimante HP, par exemple, pourra fonctionner avec une entree printcap telle que: lj-5|remote-hplj:\ :lp=/dev/null:sh:\ :sd=/var/spool/lpd/lj-5:\ :rm=printer.name.com:rp=raw: Les imprimantes LaserJet HP avec une interface JetDirect ont en general deux files incorporees; l'une ``raw'' accepte le PCL (et peut-etre le PostScript), l'autre ``text'' accepte l'ascii pur (et s'arrange pour resoudre d'elle-meme les problemes d'effets d'escalier). Dans un environnement dans lequel plusieurs imprimantes ne supportent pas le _P_o_s_t_S_c_r_i_p_t, il peut etre bon de configurer un serveur d'impression dedie vers lequel toutes les machines enverront leurs travaux et sur lequel GhostScript tournera. 1122..66.. VVeerrss dd''aanncciieennnneess HHPP Certaines anciennes imprimantes HP ne supportent qu'un protocole mal foutu s'appuyant sur des connexions TCP, notamment les premiers modeles a base de cartes JetDirect (et quelques JetDirectEx). Pour imprimer vers de telles imprimantes, vous devez ouvrir une connexion TCP vers un port dedie (9100) et envoyer votre impression vers cette connexion. Voici le script Perl correspondant : #!/usr/bin/perl # Thanks to Dan McLaughlin for writing the original version of this # script (And to Jim W. Jones for sitting next to Dan when writing me # for help ;) $fileName = @ARGV[0]; open(IN,"$fileName") || die "Can't open file $fileName"; $dpi300 = "\x1B*t300R"; $dosCr = "\x1B&k3G"; $ends = "\x0A"; $port = 9100 unless $port; $them = "bach.sr.hp.com" unless $them; $AF_INET = 2; $SOCK_STREAM = 1; $SIG{'INT'} = 'dokill'; $sockaddr = 'S n a4 x8'; chop($hostname = `hostname`); ($name,$aliases,$proto) = getprotobyname('tcp'); ($name,$aliases,$port) = getservbyname($port,'tcp') unless $port =~ /^\d+$/;; ($name,$aliases,$type,$len,$thisaddr) = gethostbyname($hostname); ($name,$aliases,$type,$len,$thataddr) = gethostbyname($them); $this = pack($sockaddr, $AF_INET, 0, $thisaddr); $that = pack($sockaddr, $AF_INET, $port, $thataddr); if (socket(S, $AF_INET, $SOCK_STREAM, $proto)) { # print "socket ok\n"; } else { die $!; } # Give the socket an address. if (bind(S, $this)) { # print "bind ok\n"; } else { die $!; } # Call up the server. if (connect(S,$that)) { # print "connect ok\n"; } else { die $!; } # Set socket to be command buffered. select(S); $| = 1; select(STDOUT); # print S "@PJL ECHO Hi $hostname! $ends"; # print S "@PJL OPMSG DISPLAY=\"Job $whoami\" $ends"; # print S $dpi300; # Avoid deadlock by forking. if($child = fork) { print S $dosCr; print S $TimesNewR; while () { print S; } sleep 3; do dokill(); } else { while() { print; } } sub dokill { kill 9,$child if $child; } 1122..77.. LLeess ffiillttrreess dd''eennttrreeee ppoouurr ddeess iimmpprriimmaanntteess ddiissttaanntteess Une des bizarreries de lpd est que le filtre d'entree (if) n'est pas execute pour des imprimantes distantes. Si vous devez absolument passer par un filtre, il vous faudra utiliser deux files, la premiere redirigeant vers la deuxieme. Par exemple : lj-5:remote-hplj:\ :lp=/dev/null:sh:\ :sd=/var/spool/lpd/lj-5:\ :if=/usr/lib/lpd/filter-lj-5: lj-5-remote:lp=/dev/null:sh:rm=printer.name.com:\ :rp=raw:sd=/var/spool/lpd/lj-5-raw: et le filtre filter-lj-5 (exemple): #!/bin/sh gs -q -dSAFER -sOutputFile=- - | \ lpr -Plj-5-remote -U$5 L'option -U ne fonctionne que si lpr est lance en tant que demon. Elle positionne correctement le nom du soumissionnaire du travail dans la deuxieme queue. Il serait d'ailleurs mieux d'utiliser une methode plus sure pour recuperer ce nom car ce n'est pas toujours le 5eme parametre. 1122..88.. IImmpprriimmeerr ddeeppuuiiss WWiinnddoowwss L'impression depuis un client Windows vers un serveur Unix est directement supporte par SMB en utilisant le paquetage SAMBA (qui supporte egalement le partage de fichiers du systeme de fichiers Linux vers les clients Windows). Samba est fourni avec une documentation complete. Vous pouvez soit installer un filtre magique sur Linux et imprimer du _P_o_s_t_S_c_r_i_p_t soit installer un pilote d'imprimante specifique sous Windows et decrire une file sans filtre. En s'appuyant sur les pilotes Windows, vous pourrez obtenir de meilleurs resultats, mais c'est un peu plus complique a administrer si vous avez plusieurs stations sous Windows. Donc essayez d'abord la premiere solution. 1122..99.. DDeeppuuiiss NNeettwwaarree Il y a des services NetWare disponibles pour Linux, mais je n'ai aucune idee si vous pouvez offrir des services d'impression depuis des client Netware. Des informations sont les bienvenues. 1122..1100.. DDeeppuuiiss uunn AAppppllee Netatalk permet d'imprimer depuis une station Apple sur EtherTalk. Voir le Netatalk HOWTO (http://thehamptons.com/anders/netatalk) pour de plus amples renseignements. 1122..1111.. IImmpprriimmeerr vveerrss uunn ffaaxx 1122..1111..11.. UUttiilliisseerr uunn mmooddeemm//ffaaxx Si vous disposez d'un modem/fax, vous pouvez configurer votre systeme pour envoyer ou recevoir des fax aux formats _P_o_s_t_S_c_r_i_p_t, dvi, ascii, etc... Vous pourrez meme faire en sorte que votre courrier electronique soit faxe! Les modems/Fax supportent les commandes de classe 1 ou 2. Les modems de classe 1 ont un sous-ensemble de fonctionnalites d'un fax disons traditionnel (donc, le logiciel doit faire le reste... et le cout de traitement est parfois critique!) La classe 1 correspond au standard EIA 578. Les modems de classe 2 repondent au sandard EIA 592. Vous trouverez dans la documentation de votre modem a quelle classe il appartient. Ne confondez pas classe et groupe. Le groupe est generalement le groupe III. Les logiciels de fax tournant sous Linux doivent savoir convertir les donnees recues en un format compatible avec le groupe III pour la transmission. Comme d'habitude _G_h_o_s_t_s_c_r_i_p_t sait faire ! Le pilote tiffg3 genere des messages fax encodes au format g3/tiff. Vous devrez compiler et integrer le pilote si ce n'est deja fait. Un des logiciels les plus complets sur le sujet, HylaFax est disponible sur : ftp.sgi.com:/sgi/fax/?????.src.tar.Z Il supporte toutes sortes de choses comme les multiples modems et la diffusion. mgetty + sendfax est un couple de logiciels, contenant un getty pour Linux et les modems fax ainsi qu'un logiciel d'envoi de fax assez simple. Ce paquetage se trouve a: sunsite.unc.edu:/pub/Linux/system/serial/getty/mgetty+sendfax-1.0.0.tar.gz Enfin, efax merite d'etre mentionne. C'est un excellent choix pour Linux. Il supporte les classes 1 et 2. sunsite.unc.edu:/pub/Linux/apps/serialcomm/fax/efax08a.tar.gz (Repertoire dans lequel on trouvera egalement vfax10.tar.z, qfax1.3.tar.gz, xfax.v1.07s.tar.gz) 1122..1111..22.. UUttiilliisseerr llee sseerrvviiccee dd''iimmpprreessssiioonn ddiissttaanntt C'est un service experimental vous permettant d'envoyer un courrier electronique que vous souhaitez imprimer sur un fax distant. Des formats tels que PostScript sont supportes. Bien que la couverture geographique de ce service soit tres faible, il est tres prometteur. Pour plus d'information, referez- vous au site Web ``Remote Printing WWW Site'' (http://www.tpc.int/). 1133.. LLeess llooggiicciieellss qquuii ppeerrmmeetttteenntt ddee rreeaalliisseerr ddee bbeelllleess iimmpprreessssiioonnss Linux sait faire tourner un grand nombre de binaires avec plus ou moins de reussite: Linux/x86, Linux/Alpha, Linux/Sparc, iBCS, Windows (Un jour, avec Wine), Mac/68k (avec Executor) et Java. WordPerfect, traitement de texte commercial tourne bien avec l'emulation iBCS. La suite Corel Office en Java est egalement prometteuse...) En ce qui concerne Linux, les choix sont limites aux logiciels Unix classiques: 1133..11.. LLeess llaannggaaggeess aa bbaalliisseess La plupart des langages balises sont bien adaptes aux projets consequents ou repetitifs pour lesquels vous souhaitez que l'ordinateur controle la mise en forme pour un resultat homogene. Vouloir ajouter un bel effet dans un tel langage choquera certainement. 1133..11..11.. nnrrooffff C'est l'un des plus anciens langages balises sous Unix. Les pages de manuel en ligne sont l'exemple le plus connu de pages formattees en macros nroff; beaucoup de gens ne jurent que par lui... mais sa syntaxe est quand meme plus compliquee que necessaire; ce n'est certainement pas le bon choix pour les nouveaux projets. Il est interessant de savoir que vous pouvez imprimer une page de manuel directement en PostScript avec groff. La syntaxe est la suivante: man -t truc | lpr. Le resultat en vaut vraiment la peine. 1133..11..22.. TTeeXX TeX (et le paquetage de macros LaTeX) est l'un des langages balises le plus repandu sous Unix. Les travaux techniques sont souvent rediges en LaTeX parce qu'il simplifie grandement la mise en page et il est l'un des rares logiciels a traiter correctement et puissamment les fomules mathematiques. Le format de sortie de TeX est dvi, et peut etre converti en _P_o_s_t_S_c_r_i_p_t ou PCL (HP) a l'aide du programme dvips ou dvilj. 1133..11..33.. SSGGMMLL Il y a au moins un interpreteur de SGML gratuit sous Unix et Linux; il est la base du systeme de documentation LinuxDoc-SGML. Il supporte bien entendu d'autres types de documents. 1133..11..44.. HHTTMMLL Bien connu, il permet d'ecrire des documents simples. 1133..22.. TTrraaiitteemmeennttss ddee tteexxtteess WWYYSSIIWWYYGG Ca y est! Linux et Unix ne manquent plus de tels traitement de texte. Il existe plusieurs suites logicielles dont une disponible gratuitement pour une utilisation personnelle: _S_t_a_r_O_f_f_i_c_e. 1133..22..11.. SSttaarrOOffffiiccee Une compagnie allemande distribue StarOffice pour Linux. On peut trouver une version libre de droits sur les serveurs ftp classiques. Cette version est limitee a un usage personnel. Cette suite logicielle est tres complete; vous trouverez tout ce dont vous reviez. Il existe d'ailleurs un mini-HOWTO decrivant ou la trouver et comment l'lnstaller. La plupart des imprimantes sont reconnues. 1133..22..22.. LLyyXX LyX est une interface pour LaTeX assez prometteuse. Rendez-vous sur la page Web de Lyx a http://www- pu.informatik.uni-tuebingen.de/users/ettrich/ pour de plus amples renseignements. 1133..22..33.. LL''iinntteerrffaaccee uuttiilliissaatteeuurr ''AAnnddrreeww'' Cette interface comprend un editeur WYSIWYG appele ez comportant la plupart des fonctionnalites de base d'un traitement de texte: HTML, et MIME pour courrier et forums de discussions (niouzes, si vous preferez). 1133..22..44.. OOffffrreess ccoommmmeerrcciiaalleess Caldera et Red Hat vendent des paquetages logiciels comprenant les applications principales, a savoir un traitement de texte et un tableur. Caldera vend egalement (a verifier) WABI, l'emulation Windows de Sun qui permet de faire tourner les applications de Microsoft bien connues. Pour plus d'information, consultez les sites de Caldera (http://www.caldera.com) et de Red Hat (http://www.redhat.com). D'autres vendeurs peuvent m'envoyer un courrier descriptif de leur offre. 1144.. LLooggiicciieellss ddee pprree--vviissuuaalliissaattiioonn Tout ce que vous imprimez peut etre egalement visualise a l'ecran. Ceci permet dans bien des cas d'economiser du papier. 1144..11.. PPoossttSSccrriipptt GhostScript possede un pilote X11 utilise par Ghostview (http://www.picante.com/~gtaylor/pht/man/ghostview.html). La derniere version de ce logiciel devrait permettre egalement la visualisation de fichiers au format PDF. 1144..22.. TTeeXX ddvvii les fichiers TeX dvi (DeVice Independent - independant du peripherique) peuvent etre visualises sous X11 a l'aide de xdvi (http://www.picante.com/~gtaylor/pht/man/xdvi.html). Les versions recentes de xdvi appellent ghostscript pour le rendu de specificites _P_o_s_t_S_c_r_i_p_t. Un pilote VT100 (dgvt) existe egalement. Tmview fonctionne sous Linux avec svgalib, si cela vous suffit. 1144..33.. AAddoobbee PPDDFF _A_c_r_o_b_a_t _R_e_a_d_e_r d'Adobe est disponible pour Linux. Vous pouvez le charger depuis http://www.adobe.com. Vous pouvez egalement utiliser xpdf, un logiciel gratuit fournit avec les sources. _G_h_o_s_t_S_c_r_i_p_t, devrait, comme je l'ai dit plus haut, supporter le format pdf. 1155.. LLeess iimmpprriimmaanntteess sseerriiee Le demon lpd fournit cinq attributs que vous pouvez positionner dans /etc/printcap afin de controler le port serie sur lequel se trouve votre imprimante. br (numerique) definit le taux de transfert en bauds (appel a ioctl(2)) fc (num) efface des indicateurs (sgtty.h) fs (num) positionne des indicateurs (inverse de `fc') xc xs Pour definir la vitesse du port, la syntaxe est evidente. Exemple: br .Pp Les autres parametres a positionner correspondent a un ensemble de bits, que l'on pourra soit positionner, soit mettre a 0. Pour effacer des bits, on utilisera les parametres fc et xc, pour les positionner, fs et xs. Faites bien attention aux bits que vous selectionnez. Mais au fait que sont-ils ? Souvenez-vous..., la commande stty. Elle indique de nombreux parametres caracterisant un tty. La commande stty -a affiche en clair les parametres du tty, certains d'entre-eux etant precedes d'un tiret s'ils sont invalides et sans tiret s'ils sont valides. La commande stty peut etre appliques au port serie (voir exemple). Ce sont certains de ces parametres (des drapeaux, des flags, donc des bits) que l'on va manipuler. # stty -a < /dev/ttyS2 speed 9600 baud; rows 0; columns 0; line = 0; intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = ; eol2 = ; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; min = 1; time = 0; -parenb -parodd cs8 hupcl -cstopb cread -clocal -crtscts -ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr -icrnl ixon -ixoff -iuclc -ixany -imaxbel -opost -olcuc -ocrnl -onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0 -isig -icanon -iexten -echo -echoe -echok -echonl -noflsh -xcase -tostop -echoprt -echoctl -echoke Note: utilisez toujours stty de cette facon (stty < /dev/ttyS?); cette command utilise en effet l'entree standard). Vous pouvez utiliser cette commande pour configurer le port de facon a obtenir une impression correcte. Par exemple, les differences que l'on peut noter entre le stty ci-dessus et l'initialisation du port au demarrage de ma machine reside dans les informations -clocal, -crtscts et ixon. (La configuration de votre port pourra tres bien etre differente selon la maniere dont votre imprimante gere le controle de flux). Votre port etant bien configure, faites : cat fichier > /dev/ttyS? (? est le numero de votre port) pour imprimer un fichier. Imprimez par exemple le fichier /usr/src/linux/include/asm-i386/termbits.h. Vous y decouvrirez un tas de definitions de constantes et de structures. Nous allons voir quelles valeurs definies dans ce fichier vont nous servir pour configurer le port, non plus avec stty, mais avec les parametres fc, xc, fs et xs du fichier printcap. Regardez la section commencant par : /* c_cflag bit meaning */ #define CBAUD 0010017 Elle decrit justement les bits manipulables a l'aide de fc et fs dont on parlait. On y voit les constantes des vitesses de modulation en baud, puis des lignes qui nous interessent particulierement : ce sont les memes parametres que dans la commande stty. Je sens que vous voyez ou on veut en venir. stty n'est qu'un interface necessaire au positionnement (ou effacement) de bits. Vous savez maintenant que chaque parametre affiche par stty correspond a un bit, et qui ont la valeur 0 lorsqu'il y a un tiret devant. Notez alors les bits a effacer (ce sera fait avec la parametre fc) et ceux a positionner (parametre fs). Exemple: `fcfc semble surcharger le parametre br, donc prenez garde a les positionner correctement). Ensuite occupez-vous des bits a positionner. Par exemple s'il faut positionner les bits cs8, hupcl et cread, regardez les constantes CS8 (0000060), HUPCL (0002000) et CREAD (0000200). Pensez a la vitesse de modulation qu'il faut aussi definir, dans mon cas, ce sera B9600 (0000015). Tous ces bits ensemble font `0002275'. Indiquez cette valeur au parametre fs. Effectuez les meme reglages avec la section suivante intitulee /* c_lflag bits */ Dans mon cas je n'ai rien a positionner, j'ai donc simplement a fournir la valeur xcvotre fichier printcap correctement defini, essayez d'imprimer. Si quelque chose ne va pas, continuez a lire les paragraphes suivants. Souvenez-vous de toujours commencer par les bits que vous souhaitez voir a 0 (fc et xc), puis de definir seulement apres des bits a positionner (fs et xs). La commande cat fonctionne pour le port serie, mais pas lpd La mise en place de lpd n'est pas traitee ici, mais sachez que si vous avez des problemes avec la configuration du port serie, vous pouvez empecher lpd de le configurer en considerant votre imprimante comme ne presentant pas une interface normale. Lisez egalement a ce propos le chapitre suivant. Donnez a votre imprimante le peripherique /dev/null1 (mknod /dev/null1 c 1 3). N'utilisez pas /dev/null, pour ne pas qu'il soit ouvert de maniere exclusive. Enlevez les parametres de vitesse et de positionnement des bits du fichier printcap. Creez un shell-script comme ci-dessous : #!/bin/sh echo if: $* >> /var/spool/lpd/results # /dev/lp est un lien vers /dev/ttyS2 auquel est reliee l'imprimante exec votre_vieux_filtre $* > /dev/lp #!/bin/sh echo if: $* >> /var/spool/lpd/results cat > /dev/lp # la commande ``echo -ne'' suppose que /bin/sh correspond a bash echo -en \\f > /dev/lp Donnez-lui les droits de lecture/ecriture pour tout le monde. Essayez-le: /usr/lib/lpd/if . +o l'imprimante est en configuration d'usine avec le flag d'impression des erreurs postscript valide. +o Le fichier printcap est tres simple: # /etc/printcap # # This file can be edited with the printtool in the control-panel. laser5M|lp:\ :lp=/dev/lp2:\ :sh:\ :sd=/var/spool/lpd/laser5M:\ :lf=/var/spool/lpd/laser5M/erreurs:\ :if=/var/spool/lpd/laser5M/filter_court: +o Le filtre utilise (filter_court) est donne ci-dessous. Il n'accepte que les fichiers _a_s_c_i_i, _P_o_s_t_S_c_r_i_p_t et _P_o_s_t_S_c_r_i_p_t _c_o_m_p_r_e_s_s_e. Ce qui est interessant, ce sont les chaines d'initialisation en PCL. En gros: \033%-12345X passage en mode PCL (d'apres l'ingenieur de MDS) \033E reinitialisation de l'imprimante les \n semblent indispensables dans le filtre. Avec echo -ne, Esc c'est 033 en octal (27 en decimal ) #!/bin/sh # # Filtre d'impression gerant l'ascii, le postscript et le postscript # compresse pour une laserjet 5M. A declarer comme filtre "if" dans # /etc/printcap. # Reinitialise l'imprimante entre chaque impression postscript pour # eviter les erreurs sur timeout. # # Version 0.1 P. BEGOU 8/97 (Patrick.Begou@hmg.inpg.fr) # # recuperation des donnees dans un fichier temporaire # FILE=/tmp/laser5M.$$ cat - > ${FILE} # # Scrutation du type de fichier # filetype=`file $FILE| cut -d":" -f2` case $filetype in *PostScript*) (echo -ne "\033%-12345X\n"; cat ${FILE}; echo -ne "\033%-12345X\033E\033%-12345X\n") echo " $FILE postscript" >&2 ;; *text*|*script*) (echo -ne "\033%-12345X\n"; /usr/bin/nenscript -s -2rG -p- ${FILE}; echo -ne "\033%-12345X\033E\033%-12345X\n") echo " $FILE texte" >&2 ;; *compress*) # verifions qu'il s'agit bien de postscript. resu=`zcat ${FILE} |head -1|grep "^%!"|wc -l` if [ ${resu} -eq 1 ] then (echo -ne "\033%-12345X\n"; zcat ${FILE}; echo -ne "\033%-12345X\033E\033%-12345X\n") echo " $FILE compresse" >&2 else echo " $FILE compresse non reconnu" >&2 fi ;; *) echo " $FILE non reconnu" >&2 ;; esac # # On repond Ok, tout s'est bien passe. # rm ${FILE} exit 0 1188..22.. RReeccttoo--vveerrssoo Voici comment configurer, par logiciel, le passage en mode recto- seulement ou recto-verso aussi bien pour de l'ascii que du PostScript. Il suffit d'inserer apres la premiere ligne... %!Ado... %%BeginFeature: *Duplex DuplexNoTumble <> setpagedevice %%EndFeature ou, pour valider le recto seul: %%BeginFeature: *Duplex None <> setpagedevice %%EndFea- ture 1199.. IInnffoorrmmaattiioonnss ccoonncceerrnnaanntt ccee ddooccuummeenntt Sauf changements, les documents HOWTO sont places sous copyright par leurs auteurs respectifs. Les documents Linux HOWTO peuvent etre reproduits et distribues en tout ou partie, par quelque moyen physique que ce soit, sans l'autorisation de l'auteur. Les traductions et travaux derives sont egalement permis sans autorisation expresse. La distribution a titre commercial est permise et meme encouragee; cependant, l'auteur souhaiterait en etre averti. En bref, nous souhaitons que l'information contenue dans ces document soit repandue le plus largement possible. Cependant, nous souhaitons maintenir le copyright sur ce document, et souhaiterions etre avertis de toute re-distribution. Si vous avez des questions a ce propos, contactez Greg Hankins, le nouveau coordinateur des documents Linux HOWTO a l'adresse . Son representant francais est Eric Dumas .