Pour partager une imprimante sur une machine Windows, vous devez suivre les points suivants :
/etc/printcap
et elles doivent correspondre � la structure locale des
r�pertoires (pour le r�pertoire de spool, etc...).
/usr/bin/smbprint
. Il est fournit avec les
sources de Samba, mais pas avec toutes les distributions binaires. Une version
l�g�rement modifi�e de ce script est pr�sent�e plus loin.
nenscript
, ou �quivalent. nenscript
est un convertisseur
Postscript et se trouve g�n�ralement dans /usr/bin
.
L'entr�e dans /etc/printcap
est pour une imprimante HP 5 MP sur une
machine utilisant Windows NT. Les entr�es sont comme suit :
cm - commentaire lp - nom du p�riph�rique � ouvrir en �criture sd - le r�pertoire de spool de l'imprimante (sur la machine locale) af - le fichier d'accounting mx - la taille maximum de fichier (z�ro pour aucune limite) if - le nom du filtre en entr�e (un script)
Pour plus ample information, lisez le Printing HOWTO ou la page de manuel de printcap.
# /etc/printcap
#
# //zimmerman/oreilly avec smbprint
#
lp:\
~:cm=HP 5MP Postscript OReilly sur zimmerman:\
~:lp=/dev/lp1:\
~:sd=/var/spool/lpd/lp:\
~:af=/var/spool/lpd/lp/acct:\
~:mx#0:\
~:if=/usr/bin/smbprint:
Assurez que le r�pertoire de spool et celui d'accounting existent et son
accessibles en �criture, que le chemin correct vers le script smbprint (donn�
ci-dessous) est indiqu� par la ligne � if � et que vous avez s�lectionn� le
bon fichier de p�riph�rique (le fichier sp�cial dans /dev
).
Vient ensuite le script smbprint. Il est g�n�ralement mis dans le r�pertoire
/usr/bin
et a �t� cr�� par Andre Tridgell, le cr�ateur de Samba pour
autant que je sache. Il est fourni avec la distribution sous forme de code
source de Samba, mais est absent de certaines distribution binaires. Je l'ai
donc recopi� ici.
Examinez le avec attention. Certains changement fait � ce script se sont av�r�es �tre utiles.
#!/bin/sh -x
# Ce script est un filtre d'entr�e sur l'impression avec printcap sur une
# machine Linux. Il utilise le programme smbclient pour imprimer le fichier au
# serveur et service sp�cifi�.
# Par exemple, vous pouvez avoir une entr�e printcap comme celle-ci~:
#
# smb:lp=/dev/null:sd=/usr/spool/smb:sh:if=/usr/local/samba/smbprint
#
# qui cr�erai une imprimante Unix appel�e "smb" qui imprimerait par
# l'interm�diaire de ce script. Vous devrez cr�er le r�pertoire de spool,
# /usr/spool/smb avec les permissions qui conviennent et le bon propri�taire,
# pour votre syst�me.
# Mettez les valeurs pour le serveur et le service sur lequel vous voulez
# imprimer. Dans cet exemple, j'utilise un PC sous Windows pour Workgroups
# nomm� "laplan" ayant une imprimante appel�e "printer" sans mot de passe.
#
# Script modifi� par hamiltom@ecnz.co.nz (Michael Hamilton) afin que le
# serveur, le service et le mot de passe puissent �tre lus depuis un fichier
# /usr/var/spool/lpd/PRINTNAME/.config
#
# Pour que ceci puisse fonctionner, l'entr�e du /etc/printcap doit inclure un
# fichier d'accounting (af=...)~:
#
# cdcolour:\
# :cm=CD IBM Colorjet au 6eme etage:\
# :sd=/var/spool/lpd/cdcolour:\
# :af=/var/spool/lpd/cdcolour/acct:\
# :if=/usr/local/etc/smbprint:\
# :mx=0:\
# :lp=/dev/null:
#
# Le fichier /usr/var/spool/lpd/PRINTNAME/.config devrait contenir~:
# server=SERVEUR_PC
# service=NOM_IMPRIMANTE
# password="mot_de_passe"
#
# Pas exemple~:
# server=MON_BO_PC
# service=CJET_371
# password=""
#
# Fichier de log pour debuggage, changez le � /dev/null si vous le voulez
#
logfile=/tmp/smb-print.log
# logfile=/dev/null
#
# Le dernier param�tre du filtre est le nom du fichier d'accounting
#
spool_dir=/var/spool/lpd/lp
config_file=$spool_dir/.config
# Les variables suivantes devraient �tre lues depuis le fichier de
# configuration~:
# server
# service
# password
# user
eval `cat $config_file`
#
# Des informations de d�bogage, changez le>> en> si vous voulez �conomiser
# de la place.
#
echo "server $server, service $service">> $logfile
(
# NOTE Vous voudrez peut �tre ajouter la ligne "echo translate" si vous voulez
# une conversion automatiques des CR/LF lors de l'impression
echo translate
echo "print -"
cat
) | /usr/bin/smbclient "\\\\$server\\$service" $password -U $user -N -P>> $logfile
La plupart des distributions Linux sont fournies avec nenscript pour convertir des documents ASCII en Postscript. Le script perl qui suit simplifie la vie en fournissant une interface simple � smbprint pour l'impression sous Linux.
Usage: print [-a|c|p] <fichier> -a imprime <fichier> comme un fichier ASCII -c imprime <fichier> formatt� en code source -p imprime <fichier> en tant que fichier Postscript Si aucun param�tre n'est donn�, print tente de deviner le type de fichier et imprime en cons�quence.
smbprint a tendance � tronquer les longues lignes lors de l'impression de fichiers ASCII. Ce script coupe les longues lignes sur les espaces (plut�t qu'au milieu d'un mot), si possible.
Le formatage en code source est r�alis� par nenscript.Il prend en entr�e un fichier ASCII et le formatte sur deux colonnes avec une ent�te (date, nom du fichier, etc...). Il num�rote �galement les lignes. En prenant ce script comme exemple, on peut faire d'autres types de formatage.
Les documents sont d�j� correctement format�s, donc ils passent directement � travers le filtre.
#!/usr/bin/perl
# Script: print
# Auteurs: Brad Marshall, David Wood
# Plugged In Communications
# Date: 960808
#
# Script pour imprimer sur oreilly qui est pour l'instant connect�e sur
# zimmerman.
# But: Prendre diff�rentes sortes de fichier en argument et les
# traiter pour les injecter dans le script d'impression de Samba.
#
# Types de fichier support�s pour l'instant~:
#
# ASCII - v�rifie que les lignes plus longues que $line_length
# caract�res sont coup�s sur un espace.
# Postscript - Aucune action.
# Code - Formatte en Postscript (� l'aide de nenscript) pour un
# affichage correct (orientation, fonte, etc...).
#
# Fixe la longueur maximale d'une ligne de texte ASCII
$line_length = 76;
# Le chemin d'acc�s vers le script d'impression de Samba
$print_prog = "/usr/bin/smbprint";
# Le chemin vers le programme nenscript (le convertisseur
# ASCII->Postscript)
$nenscript = "/usr/bin/nenscript";
unless ( -f $print_prog ) {
die "Je ne peux pas trouver $print_prog!";
}
unless ( -f $nenscript ) {
die "Je ne peux pas trouver $nenscript!";
}
&ParseCmdLine(@ARGV);
# D�bug
print "filetype is $filetype\n";
if ($filetype eq "ASCII") {
&wrap($line_length);
} elsif ($filetype eq "code") {
&codeformat;
} elsif ($filetype eq "ps") {
&createarray;
} else {
print "D�sol�, ce n'est pas un type de fichier que je connais";
exit 0;
}
# Envoie le tableau � smbprint
open(PRINTER, "|$print_prog")
|| die "Je ne peux pas ouvrir $print_prog: $!\n";
foreach $line (@newlines) {
print PRINTER $line;
}
# Envoie un retour � la ligne suppl�mentaire si jamais le fichier a sa
# derni�re ligne incompl�te
print PRINTER "\n";
close(PRINTER);
print "Achev�\n";
exit 0;
# --------------------------------------------------- #
# Tout ce qui suit est un sous programme #
# --------------------------------------------------- #
sub ParseCmdLine {
# Traite la ligne de commande, d�termine le type de fichier
# $arg et $file sont respectivement les arguments (s'ils
# existent) et le nom de fichier
if ($#_ < 0) {
&usage;
}
# D�bug
# foreach $element (@_) {
# print "*$element* \n";
# }
$arg = shift(@_);
if ($arg =~ /\-./) {
$cmd = $arg;
# D�bug
# print "\$cmd trouv�.\n";
$file = shift(@_);
} else {
$file = $arg;
}
# D�finition du type de fichier
unless ($cmd) {
# Aucun argument
if ($file =~ /\.ps$/) {
$filetype = "ps";
} elsif ($file =~ /\.java$|\.c$|\.h$|\.pl$|\.sh$|\.csh$|\.m4$|\.inc$|\.html$|\.htm$/) {
$filetype = "code";
} else {
$filetype = "ASCII";
}
# Traite $file selon le type de fichier et retourne
# le type de fichier ($filetype)
} else {
# Nous utilisons ltype de fichier d�crit dans $arg
if ($cmd =~ /^-p$/) {
$filetype = "ps";
} elsif ($cmd =~ /^-c$/) {
$filetype = "code";
} elsif ($cmd =~ /^-a$/) {
$filetype = "ASCII"
}
}
}
sub usage {
print "
Usage: print [-a|c|p] <fichier> -a imprime <fichier> comme un fichier ASCII
-c imprime <fichier> format� en code source
-p imprime <fichier> en tant que fichier Postscript
Si aucun param�tre n'est donn�, print tente de
deviner le type de fichier et imprime en cons�quence.\n
";
exit(0);
}
sub wrap {
# Cr�e un table contenant les lignes du fichier, avec chaque
# ligne ayant une longueur < au nombre de caract�res
# sp�cifi�s, et coup�e uniquement sur un espace.
# R�cup�re la longueur maximum d'une ligne
$limit = pop(@_);
# D�bug
#print "Entr�e dans la proc�dure wrap\n";
#print "La longueur maximum d'une ligne est $limit\n";
# Lit le fichier, le traite et le stocke dans le tableau
open(FILE, "<$file") || die "Impossible d'ouvrir $file: $!\n";
while(<FILE>) {
$line = $_;
# D�bug
#print "La ligne est~:\n$line\n";
# Coupe la ligne si celle-ci d�passe la limite
while ( length($line)> $limit ) {
# D�bug
#print "Je coupe...";
# Prend les premiers $limit +1 caract�res.
$part = substr($line,0,$limit +1);
# D�bug
#print "La ligne partielle est~:\n$part\n";
# V�rifie si le dernier caract�re est un
# espace
$last_char = substr($part,-1, 1);
if ( " " eq $last_char ) {
# Oui, on imprime le reste
# D�bug
#print "Le dernier caract�re �tait un espace\n";
substr($line,0,$limit + 1) = "";
substr($part,-1,1) = "";
push(@newlines,"$part\n");
} else {
# Non, on cherche le dernier espace de la
# ligne et on imprime jusqu'� lui
# D�bug
#print "Le dernier caract�re n'�tait pas un espace\n";
# Supprime le caract�re apr�s $limit
substr($part,-1,1) = "";
# Inverse la ligne pour trouver plus
# facilement l'espace
$revpart = reverse($part);
$index = index($revpart," ");
if ( $index> 0 ) {
substr($line,0,$limit-$index) = "";
push(@newlines,substr($part,0,$limit-$index)
. "\n");
} else {
# Aucun espace dans la ligne
# Imprime jusqu'� $limit
substr($line,0,$limit) = "";
push(@newlines,substr($part,0,$limit)
. "\n");
}
}
}
push(@newlines,$line);
}
close(FILE);
}
sub codeformat {
# Appelle la proc�dure wrap et filtre par nenscript
&wrap($line_length);
# Envoie le r�sultat � nenscript pour cr�er un fichier
# Postscript qui respecte un format d�cent d'impression pour
# du code source (orientation paysage, font Courier,
# num�rotation des lignes).
# Imprime d'abord dans un fichier temporaire.
$tmpfile = "/tmp/nenscript$$";
open(FILE, "|$nenscript -2G -i$file -N -p$tmpfile -r") ||
die "Je ne peux pas ouvrir nenscript~: $!\n";
foreach $line (@newlines) {
print FILE $line;
}
close(FILE);
# Relis le fichier temporaire dans un tableau pour pouvoir
# �tre pass� au script smbprint de Samba.
@newlines = ("");
open(FILE, "<$tmpfile") || die "Je ne peux pas ouvrir $file~: $!\n";
while(<FILE>) {
push(@newlines,$_);
}
close(FILE);
system("rm $tmpfile");
}
sub createarray {
# Cr�e le tableau pour un fichier postscript
open(FILE, "<$file") || die "Can't open $file: $!\n";
while(<FILE>) {
push(@newlines,$_);
}
close(FILE);
}
Hosting by: Hurra Communications GmbH
Generated: 2007-01-26 18:01:16