Dans un soucis d'apporter de l'eau au moulin, sans réinventer la roue,
ce cours est basé sur des documentations existantes.
Félix Hauri
Informaticien consultant
www.f-hauri.ch
felix@f-hauri.ch
Première chose: communiquer physiquement avec l'imprimante.
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
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
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.
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.
Depuis les premières imprimantes, à boule, marguerites ou à aiguilles,
les jobs doivent correspondre aux imprimantes auxquelles ils sont
destinés.
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).
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.
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.
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.
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.
Line Printer Daemon
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.
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.
- lpr Line Printer: Commande générale
d'impression.
- lpq Line Printer Query: Etat des files
d'attente.
- lprm Line Printer ReMove: Suppression
d'un job.
lpc Line Printer Control: Commande privilégiée
de contrôle des queues.:
- lpc ? demander de l'aide concernant une commande
- lpc help demander de l'aide concernant une commande
- lpc abort termine un démon et interdit les impressions
- lpc clean efface les fichier déchets des répertoires de
files
- lpc disable interdit les impressions sur une queue.
- lpc down effectue un 'stop' suivit d'un
'disable', puis envoie un message dans 'status'
- lpc enable autorise les impressions sur une queue.
- lpc exit sort de l'utilitaire 'lpc'
- lpc quit quitter l'utilitaire 'lpc'
- lpc restart tuer (si possible) et redémarrer un démon
d'impression.
- lpc start autorise les impressions sur une queue et démarrer
un démon d'impression.
- lpc status afficher l'état d'une ou plusieurs
queues.
- lpc stop stop a spooling daemon after current job completes
and disable printing
- lpc topq envoie un job en tête d'une file
d'attente.
- lpc up autoriser tout et redémarrer les démons
d'impression.
... sans parler de /etc/???.d/lpd start/stop/restart/status
.
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
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
A propos des images et résolutions
Manipuler les images avec les différentes librairies:
- libtiff avec entre autres:
- fax2ps Transforme un fax en Postscript
- tiff2ps Transforme un fichier TIFF en Postscript
- tiff2bw Transforme une image couleur en gris
- tiffdither Transforme une image grise en N/B tramé
- tiffinfo Donne des informations sur un fichier TIFF
- libjpeg:
- cjpeg Compresse un PNM en JPEG
- djpeg Décompresse un JPEG en PNM
- jpegtran Effectue des transformation sur un JPEG
- rdjpgcom Donne des informations sur un JPEG.
(``rdjpgcom -v'' pour obtenir ses dimensions en pixels)
- pnmtools: une usine à images avec un choix impressionnant de
commandes:
anytopnm, rasttopnm, tifftopnm, xwdtopnm, pnmtops, pnmtorast,
pnmtotiff, pnmtoxwd, pnmarith, pnmcat, pnmconvol, pnmcrop, pnmcut,
pnmdepth, pnmenlarge, pnmfile, pnmflip, pnmgamma, pnmindex,
pnminvert, pnmmargin, pnmnoraw, pnmpaste, pnmrotate, pnmscale,
pnmshear, pnmsmooth, pnmtile
- anytopnm Transforme n'importe quel type d'image en PNM
- tifftopnm Transforme une image TIFF en PNM
- pnmtops Transforme une image PNM en document Postscript
- pnmscale Applique un facteur d'échelle sur une image
- pnmgamma Applique une correction gamma sur une image
etc.
etc.
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
- epsffit Etend un PostScript encapsulé (EPSF) à une dimension
donnée
- fixwpps Corrige un PS de WP pour PSUtils
- fixwwps Corrige un PS de Windows Write pour PSUtils
- psnup Arrange plusieurs pages sur une feuille
- psselect Selectionne des pages d'un fichier PostScript
- pstops Réorganise les pages, ordre et dimension,
d'un fichier PostScript
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:
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:
- -c.. -d.. -s.. L'indice du paramètre: -c commande,
-d drapeau, -s setting=val
-sOUTPUTFILE NE MARCHE PAS! La casse des
paramètres et options DOIT être respectée
- -dNOPAUSE Evite d'attendre que l'utilisateur appuie sur
la touche ``Return'' entre chaque pages.
- -dSAFER Evite l'accès en écriture sur les fichiers soumis
- -c quit La ligne de commande est lue séquentiellement par
ghostscript. ``gs truc.ps -c quit'' affichera truc.ps puis quitter,
tandis que ``gs -c quit truc.ps'' ne fera rien du tout.
- -dBATCH Lancé par un script, gs quittera après exécution.
- -sDEVICE= Sélection du mode de sortie.
- -sOutputFile= Nom du fichier de sortie plutôt que la
sortie standard
- uniprint ou @ Mode de sortie unifiée: ``gs -sDEVICE=uniprint @bjc610a1.upp truc.ps'' aura le même effet que: ``gs @bjc610a1.upp truc.ps'', la présence du ``@'' implique ``uniprint''
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.
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''.
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.
Oups;)
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
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
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
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...
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