Cours GULL: Imprimer sous Linux

Jeudi 18 Janvier 2001, à Genève Félix Hauri - www.f-hauri.ch - felix@f-hauri.ch

Dans un soucis d'apporter de l'eau au moulin, sans réinventer la roue, ce cours est basé sur des documentations existantes.

^» Présentation

Félix Hauri
Informaticien consultant
www.f-hauri.ch
felix@f-hauri.ch

^» Premières couches: liaison

Première chose: communiquer physiquement avec l'imprimante.

^» Parallèle (standard)

Communiquer via le port parallèle nécessite la présence des modules ``parport'' et ``lp'', dans le kernel.
Essai de communication:
echo -en \\007 >/dev/lp0
... fait émettre un bip par l'imprimante.
Plus de documentation dans le Printing HOWTO: Printing HowTo sec 3.2

^» Série (vieux)

Certaines anciennes imprimantes se raccordent par le port série: /dev/ttyS?.
Plus de documentation dans le Serial HOWTOet le Printing HowTo sec 3.3

^» USB (nouveau)

Les imprimantes modernes et bon marché sont équipées de ports USB. Ces ports ne sont pas supportés par les noyaux antérieurs au noyau 2.2.7. N'ayant pas eu l'occasion d'expérimenter de telles imprimantes, je ne m'étalerais pas sur la question, toutefois, une information concernant les ports USBs peut être trouvée à Linux USB, avec une page concernant l'impression via USB: Printer Support et une page listant les imprimantes connues, à consulter AVANT d'acheter une imprimante.

^» Réseau lpr, samba, netware

L'impression via réseau nécessite une configuration réseau ad'hoc. La configuration du noyau dépend du type de réseau.
Introduit depuis la version 3 de BSD, le 'lpr' de Berkeley s'est rapidement vu devenir LE standard d'impression pour réseaux locaux.
Les cartes HP-JetDirect, ainsi que la plupart des imprimantes disposant d'un raccordement réseau proposent un port 'lpr'. HowTo: Unix/lpr (standard), Windows, LanManager, Samba, Netware ou EtherTalk.

^» Formats de données et langages d'impression

Depuis les premières imprimantes, à boule, marguerites ou à aiguilles, les jobs doivent correspondre aux imprimantes auxquelles ils sont destinés.

^» Mode texte

Le mode texte pourrait être ASCII, malheureusement cela ne suffit pas. Le mode ASCII-Etendu varie d'un pays à l'autre et d'un fabricant à l'autre. Le programme recode permet de manipuler des table de codage. La plupart des imprimantes utilisent une table type CP-437 ou CP-850(1).

^» Mode propriétaire

La plupart des constructeurs d'imprimantes ont élaboré un langage ou protocole permettant de dialoguer avec le logiciel. Ces protocoles sont à priori les mieux adaptés à leurs imprimantes respectives...
Une imprimante Epson émule du langage IBM Proprinter, mais donnera de meilleurs résultats pilotée par un langage Epson.

^» Mode Postscript

Il s'agit d'un mode propriétaire particulier. Développé par Adobe, dans le but de séparer les notions de calculs d'impression des dépendances matérielles, le langage Postscript avait pour ambition d'être commun à toutes les imprimantes.
Les licences Postscript accordées par Adobe permettent à n'importe quel fabricant de développer des imprimantes compatibles Postscript, moyennant un sur-coût.
Le langage Postscript est devenu un standard de fait pour les applications Unix. Pour transformer un job Postscript dans un langage reconnu par une imprimante donnée, on utilisera Ghostscript, dans un environnement Open-Source.

^» Mode compatible

Comme cité plus haut, la plupart des constructeurs tenteront d'émuler le comportement des imprimantes de concurrents, ce avec plus ou moins de réussite. Certains constructeurs préféreront se concentrer sur LEUR langage qui fonctionne bien, tandis que d'autres choisiront d'utiliser des langages efficaces et existants.

^» Mode WP$

Comme à son habitude, Bill nie l'existence de standards pour bricoler SON système d'impression unilatéral.
Le Windaube Printing System présente une particularité, celle d'établir une communication bi-directionnelle entre les pilotes et les imprimantes. Cela peut être un avantage, si l'on considère un petit réseau local, cela devient vite un inconvénient sur des réseaux plus grands, voire commutés.

^» Le démon d'impression 'lpd'

Line Printer Daemon

^» Pourquoi

Afin de pouvoir accéder à plusieurs imprimantes, simultanément par plusieurs logiciels voire plusieurs clients, sans avoir à se préoccuper des conflits en découlant, lpd est un programme, chargé d'empiler les tâches pour les écouler vers l'imprimante, selon la disponibilité de cette dernière.

^» Comment, installation.

En principe lpd s'installe automatiquement.
Il s'agit de créer un groupe 'lp', un répertoire principal, puis un sous-répertoire par imprimante, pour y empiler les jobs à imprimer et autoriser les utilisateur du groupe 'lp' à y écrire des données.
felix@medium:~/ImpressionSousLinux$ ls /var/spool/lpd/ -la
total 8
drwxrws---   10 lp       lp           4096 déc  6 15:18 .
drwxr-x---    7 root     root         4096 déc  1 11:40 ..
drwxrws---    2 root     lp           4096 jan 10 14:03 MonImprimante
-rw-r-----    1 root     lp              6 jan  7 06:47 lpd.lock
Créer un fichier /etc/printcap du type
MonImprimante::sd=/var/spool/lpd/MonImprimante::mx#0::sh::if=/bin/cat::lp=/dev/lp0
Lancer le démon lpd, c'est tout... Pour le moment.

^» Les commandes de base

^» Les commande privilégiées

lpc Line Printer Control: Commande privilégiée de contrôle des queues.: ... sans parler de
/etc/???.d/lpd start/stop/restart/status
.

^» Les filtres

On appelle ``filtre'' un outil qui reçoit un flux de données, le transforme et le fait suivre. C'est un programme que l'on peut utiliser naturellement à travers des ``pipes'' (|)
Le programme ``cat'' est un exemple de filtre passif.
echo "salut" | cat | cat | cat >/dev/lp0

^» Textes: ASCII, ManDoc, SGML, LaTeX, etc.

Le programme recode cité plus haut, est un filtre permettant de transformer entre autres du code ASCII-ISO-Latin-1 en CP-437, selon IBM:
felix@medium:~$ echo "Il est déjà huit heures"|recode lat1..cp437
Il est dj huit heures
ou encore du ``Quoted-Printable'' (utilisé pour les mails) en Latin-1:
felix@medium:~$ echo "Il est d=e9j=e0 huit heures"|recode /QP..lat1
Il est déjà huit heures
Plusieurs outils permettent de mettre ces fichiers texte en forme, au travers du langage Postscript: mpage, enscript, a2ps, etc.
%> On transformera des pages de manuels avec les commandes grog, groff, grops, tbl, troff, etc.
zcat /usr/share/man/man1/man.1.gz |tbl |troff -msafer -mandoc -Tps|grops -g|lpr
imprimera la page de manuel de la commande ``man'' sur l'imprimante par défaut.
grog propose une manière simplifiée d'obtenir les bons paramètres à appliquer:
felix@medium:~$ zcat /usr/share/man/man1/man.1.gz|grog -Tps     
groff -Tps -t -man
felix@medium:~$ zcat /usr/share/man/man1/man.1.gz|groff -Tps -t -man|lpr

%> Les documents au format SGML ne sont pas imprimables, directement. En effet, il faudra d'abord les transformer dans un format html, TeX-LaTex, texte, dvi, etc.
%> Pareil pour les documents TeX-LaTeX. Double passage à travers le moteur de TeX pour la réalisation des index, voire triple passage pour ré-indexer la table des matière au début du document.
Toutefois, les fichiers ``.dvi'' peuvent être envoyés au travers d'un filtre presque standard, même si ``dvips'' ne supporte pas de travailler comme un filtre:
#! /bin/sh
TMP_FILE=`tempfile` || exit 1
cat - > $TMP_FILE
dvips -f -ta4 < $TMP_FILE |lpr 
rm -f $TMP_FILE
    

^» Images: libtiff, libjpeg, pnmtools, etc.

A propos des images et résolutions

Manipuler les images avec les différentes librairies:

etc.

^» Postscript, le paquet psutil

Donc, comme je l'disais, le Postscript est Le langage d'impression universel, en tout cas dans le monde Linux.
Pour manipuler les fichiers Postscript, avant tout: A First Guide to PostScript
Puis vous avez le paquet PSUtils avec, encore un fois une pètée de commandes: epsffit, extractres, fixdlsrps, fixfmps, fixmacps, fixpsditps, fixpspps, fixscribeps, fixtpps, fixwfwps, fixwpps, fixwwps, getafm, includeres, psbook, psmerge, psnup, psresize, psselect, pstops Pour terminer, un petit outils de mon cru, servant à réorganiser les pages d'un fichier A4 pour créer une brochure au format A5 à agrafer par le milieu:

^» Ghostscript: L'incontournable

Le Postscript est Le langage d'impression universel... Hein? j'l'ai déjà dit?
Ghostscript est un interprète de langage Postscript. Il permet de visualiser un Postscript à l'écran, mais aussi de l'imprimer sur une imprimante non PostScript ou encore d'en faire une image pixel.
Dans le cas d'une configuration d'imprimante, on utilisera Ghostscript comme un filtre:
      gs -sDEVICE=bjc600 -q -dSAFER -dNOPAUSE -dBATCH -sPAPERSIZE=a4 -
Pour répondre à la multitude de situations, écran graphiques et imprimantes différentes, ses options sont nombreuses, en voici un bref résumé: gs --help. La liste d'options disponible et issue des options de compilation du programme. Dans certains cas, (rationalisation au maximum de l'espace disque requis, exploitation de processeurs récents, utilisation d'une imprimante absente de la liste mais connue du programme) la compilation du programme sera nécessaire. Attention! Suivre les instructions à la lettre, les sources de nombreux outils et librairies doivent êtres présentes pour la compilation.
Quelques options ou notions utiles: Voir aussi: /usr/share/doc/gs/README, /usr/share/doc/gs/use.txt, /usr/share/doc/gs/devices.txt, /usr/share/doc/gs/drivers.txt, etc.

^» Les intégrés

Ouf! Si on est arrivé jusqu'ici, y'a p'us ka mettre le tout dans une boite:)
La plupart du temps, la commande ``magique'' file est utilisée pour connaître la nature d'un job.
Lorsque l'on connaît la nature d'un fichier, on sait comment en faire un Postscript (si ce n'est pas déjà le cas), après quoi si besoin, on la passe à travers Ghostscript pour finir par l'envoyer vers le périphérique.
Les ``intégrés'' ci-dessous prennent en charge l'installation du démon LPR, des différents outils nécessaires et de leur configuration pour les imprimantes utilisées.
Ils se constituent essentiellement d'un filtre: ``magic-file->PS->imprimante''.

^» apsfilter

La seule commande apsfilterconfig s'occupe de tout.
Il s'agit d'un outil interactif basé sur des menus en mode texte, permettant de configurer complètement le démon LPR et utilisant un script unique: apsfilter.

^» magicfilter

Oups;)

^» printtool

L'utilitaire Red Hat PrintTool, fonctionne de la même manière. Toutefois, un écran graphique ``X'' sera nécessaire pour son affichage.
Impression d'écran 1 Impression d'écran 2
Il utilise, pour sa part, une série de filtres nommés ``xxx-to-yyy.fpi'' qui amènent successivement à ``xxx-to-printer.fpi''...
Voir: /var/spool/lpd/lp/filter

^» Les variantes

^» lpr

Déjà discuté au chapitre Le démon d'impression 'lpd', je n'avais pas parlé de la commande pac qui permet de comptabiliser les sorties pour facturation.
Cela dit, Berkeley ne s'est pas arrêté de penser: google/u/berkeley?q=lpr

^» lprNG

Il s'agit d'une version améliorée de 'lpr'.
Il semble que son utilisation soit relativement similaire à celle du 'lpr' de Berkeley. Je n'ai eu qu'une petite occasion de constater ce qui précède.
Voir: LPRng Web Page

^» cups

Voici pour finir, un travail colossal: Overview of the Common UNIX Printing System
Il s'agit d'un environnement regroupant tous les outils nécessaires, introduisant un nouveau format ``bitmap'' pour les pré-impressions, recréant un système de queues et émulant les commandes ``lpr'' de Berkeley, ainsi que le fichier ``/etc/printcap'' qui est recréé à titre consultatif pour la compatibilité avec les programmes U*ix.
CUPS propose en outre, le support du nouveau protocole IPP Internet Printing Protocole.
Ou un système intéressant de gestion des fichiers de description d'imprimantes (le fichiers ``*.ppd'')
Ou encore une notion de ``classes d'imprimantes'' permettant d'imprimer sur des groupe d'imprimantes, ou la première disponible.
Une seule commande pour l'administration: lpadmin, plus une petite pour remplacer ``lpc status'': lpstat
      lpadmin -pcanon360 -E -v lpd://minux/canon360
      
Ajouter une imprimante qui se nommera ``canon360'' et qui sera redirigée sans opérations sur la queue ``canon360'' du serveur ``minux''.
Sinon un accès via un brouzeur WEB sur ``http://localhost:631/admin'' permettra d'administrer facilement classes, imprimantes et jobs...

^^ Truc

Voici un petit truc qui m'a rendu service, que ce soit pour comprendre ou pour réaliser des fichiers d'impression... tempprint.sh [TXT]
Créer /var/spool/lpd/tempprint en groupe lpet en mode 770. Y installer le script ci dessus, puis dans /etc/printcap, ajouter:
tempprint|Temp Print:\
        :sd=/var/spool/lpd/tempprint:\
        :mx#0:\
        :sh:\
        :lp=/dev/console:\
        :if=/var/spool/lpd/tempprint/tempprint.sh:
      
Enfin, essayez d'imprimer quelque chose sur cette imprimante
      /bin/ls -l|lpr -Ptempprint