Questo documento descrive l'uso del sistema di buffering di stampa di cui è dotato il sistema operativo Linux. Questo HOWTO è un documento accessorio al Linux Printing Setup HOWTO, che tratta della configurazione del sistema di stampa di Linux. Il materiale trattato da questo howto dovrebbe risultare applicabile in maniera similare a tutte le varianti del sistema operativo BSD.
Nota di Mark Komarinski <markk@auratek.com>:
Desidero ringraziare Matt Foster per aver fatto un sacco di lavoro nella riscrittura di questo HOWTO. Ho deciso di preservare il suo stile nel provvedere a tutte le aggiunte necessarie ad aggiornare il documento.
Nota di Matt Foster <mwf@engr.uark.edu>:
Questa versione del Linux Printing HOWTO è una completa riscrittura di quella originaria scritta da Grant Taylor <grant@god.tufts.edu> e Brian McCauley <B.A.McCauley@bham.ac.uk>. Ho cercato di coprire lo stesso materiale analizzato da Grant e Brian nel loro HOWTO, ma ho al tempo stesso radicalmente modificato lo stile della presentazione e la sua profondità. La mia speranza è che questo sforzo renda l'HOWTO più completo e scorrevole nella lettura. Posso solo sperare che voi concordiate con me.
v1.2.2
v1.1
v1.0
Some names mentioned in this HOWTO are claimed as copyrights and/or trademarks of certain persons and/or companies. These names appear in full or initial caps in this HOWTO.
(c) 1995 Matt Foster (mwf@engr.uark.edu)
(c) 1996-1997 Mark F. Komarinski (markk@auratek.com)
All translations, derivative works, or aggregate works incorporating any Linux HOWTO documents must be covered under this copyright notice.
That is, you may not produce a derivative work from a HOWTO and impose additional restrictions on its distribution. Exceptions to these rules may be granted under certain conditions; please contact the Linux HOWTO coordinator at the address given below.
In short, we wish to promote dissemination of this information through as many channels as possible. However, we do wish to retain copyright on the HOWTO documents, and would like to be notified of any plans to redistribute the HOWTOs.
If you have questions, please contact Tim Bynum, the Linux HOWTO coordinator, at <linux-howto@sunsite.unc.edu>. You may finger this address for phone number and additional contact information.
L'autore raccomanda a chi desideri stampare l'HOWTO di procurarsi la versione PostScript del documento, che è stata impaginata in uno stile che ne rende la lettura più semplice e piacevole. La versione PostScript è reperibile in molti dei siti di distribuzione di Linux, come SunSITE ftp://sunsite.unc.edu/pub/Linux/docs/HOWTO/).
La traduzione italiana è disponibile al sito dell'Italian LDP (ILDP) www.pluto.linux.it/ildp/index.html (N.d.T.).
Domande, commenti e correzioni relative a questo HOWTO possono essere dirette (in lingua inglese N.d.T.) a <markk@auratek.com>.
I miei ringraziamenti vanno a coloro che hanno speso il loro tempo nel leggere le versioni alfa di questo HOWTO e hanno fornito molti commenti e suggerimenti utili. Qualcuno di voi potrebbe notare l'effetto dei suoi commenti in questa versione del documento.
Vorrei anche ringraziare Matt Foster per aver compiuto la ristesura iniziale.
Questa sezione del documento illustra come stampare file, esaminare la coda di stampa, rimuovere file dalla coda di stampa, formattare file prima di stamparli e configurare l'ambiente di stampa.
Il sistema di stampa di Linux ---il sistema lp--- è un porting del codice sorgente scritto dai Regents of the University of California per la distribuzione di UNIX nota come BSD (Berkeley Software Distribution).
La via di gran lunga più semplice di stampare un file sotto Linux è quella di inviare il file
che si intende stampare direttamente alla stampante. Uno dei modi in cui questo può esser
fatto è tramite l'uso del comando cat. Per l'utente root
è possibile eseguire
un comando come il seguente
# cat tesi.txt > /dev/lp
Nel caso in esame /dev/lp
è un link simbolico all'effettivo dispositivo di stampa
- indipendentemente dal suo essere una stampante a matrice di punti, una laser o un plotter
(si veda ln(1) per ulteriori informazioni sui link simbolici).
Per ragioni di sicurezza, solo l'utente root
ed utenti facenti parte dello
stesso gruppo del demone di stampa possono accedere direttamente al dispositivo di stampa.
Per accedere alle stampanti devono quindi essere usati comandi come
lpr, lprm e lpq.
Per questi motivi gli utenti devono usare il comando lpr per stampare un file. Il comando lpr si occupa di tutti i compiti inizialmente necessari nella stampa di un file prima di cedere il controllo al programma lpd, il line printing daemon, che si occuperà di indicare alla stampante come procedere alla effettiva stampa del file.
Quando il comando lpr viene eseguito, procede a copiare il file specificato dall'utente in una directory speciale (directory di spool), ove il file rimarrà sino a quando lpd non abbia completato la sua stampa. Non appena lpd riceve comunicazione dell'esistenza di un file nella coda di stampa, provvede a creare una copia di se stesso (tramite una procedura detta dai programmatori "di forking"). Questa copia del programma provvederà alla stampa del file mentre il processo originario si pone in attesa della prossima richiesta di stampa. Tramite questo sistema è possibile porre più file nella coda di stampa simultaneamente.
La sintassi del comando lpr(1) è una di quelle molto familiari agli utenti:
$ lpr [ opzioni ] [ nomefile ... ]
Se nomefile
non viene specificato lpr assume che l'imput provenga dal file
di standard input stdin (solitamente la tastiera o l'output di un altro programma).
Questo permette agli utenti di reindirizzare l'output di un altro processo direttamente al
programma di stampa, come nell'esempio seguente:
$ cat tesi.txt | lpr
oppure
$ pr -l60 tesi.txt | lpr
Il comando lpr accetta diversi argomenti che permettono all'utente di controllare il suo funzionamento. Tra quelli più spesso usati ricordiamo: -Pstampante indica quale stampante usare, -h sopprime la stampa della burst page, -s crea un link simbolico nella directory di spool invece di procedere a copiarvi il file (particolarmente utile nel caso di file di notevoli dimensioni) e -#num specifica quante copie del file stampare. A titolo di esempio:
$ lpr -#2 -sP dj tesi.txt
Questo comando creerà un link simbolico al file tesi.txt
nella
directory di spool della stampante chiamata dj, dove sarà
processato da lpd, che ne stamperà due copie.
Per una lista esaustiva di tutte le opzioni del comando lpr si rinvia alla manpage lpr(1).
Il comando lpq viene impiegato per visualizzare i contenuti della coda di stampa. Lanciato senza argomenti lpq ritorna i contenuti della coda di stampa della stampante predefinita.
L'output di lpq può tornare utile in molti contesti:
$ lpq
lp is ready and printing
Rank Owner Job Files Total Size
active mwf 31 tesi.txt 682048 bytes
Un'altra utile funzione di un qualsiasi rispettabile sistema di stampa è quella di poter rimuovere file che siano stati precedentemente posti nella coda di stampa. A questo scopo si utilizza il comando lprm:
$ lprm -
Questo comando cancella tutti gli ordini di stampa pendenti appartenenti all'utente che lo ha lanciato. Un singolo file può essere rimosso dalla coda di stampa in due fasi: inizialmente sarà necessario scoprire il suo job number tramite lpq e a quel punto sarà possibile invocare lprm con tale parametro. L'esempio seguente:
$ lprm 31
cancellerebbe il file con job number 31 (tesi.txt
) dalla coda di stampa della stampante predefinita.
Il comando lpc(8) serve a controllare le stampanti gestite da lpd. È possibile abilitare o disabilitare l'uso di una stampante o della sua code di stampa, modificare l'ordine con cui i file sono disposti al loro interno e ottenere un rapporto sullo stato delle stampanti e relative code di stampa. Lpc risulta particolarmente utile in configurazioni in cui una singola macchina disponga di più di una stampante.
$ lpc
Questo comando introduce l'utente in un ambiente interattivo nel quale è possibile inserire comandi. Un'altra possibilità è quella di passare un comando a lpc tramite la linea di comando:
$ lpc status all
Una lista completa dei comandi disponibili può essere ottenuta tramite la manpage di
lpd, ma il lettore troverà di seguito una lista di quelli di maggior rilevanza.
Ogni comando seguito dalla parola opzioni può ricevere sia il nome di una specifica
stampante (ad esempio lp o print) sia la parola chiave all
, usata per indicare il riferirsi
del comando a tutte le stampanti disponibili.
Una breve nota sul sorprendente programma printtool della RedHat: esso sembra possedere tutte le capacità di un magic filter. La distribuzione della RedHat provvede automaticamente ad installare molti dei programmi che eseguono il filtraggio. Seguono i passi seguiti dal sottoscritto per configurare la propria stampante (una HP LJ 4L connessa alla porta parallela) sotto RH 4.0 (tale procedura dovrebbe risultare effettiva anche sotto altre versioni della distribuzione RH).
Esattamente come se gestiste il file /etc/printcap file manualmente, è possibile mantenere più definizioni per ciascuna stampante con differenti dimensioni della carta, risoluzioni o altro.
Questa sezione copre la stampa dei tipi di file più comunemente incontrati in un tipico ambiente Linux.
La stampa di file grafici solitamente dipende dal tipo di file che si intende stampare e dal tipo di stampante impiegata. Le stampanti a matrice di punti sono solitamente semplicemente fuori questione a causa delle differenze nella maniera in cui le matrici di punti gestiscono la grafica. In queste condizioni l'approccio più fertile è solitamente verificare la compatibilità della stampante con una Epson o una IBM ProPrinter e quindi (dopo aver convertito il file in PostScript) impiegare Ghostscript (si veda la prossima sezione del documento) per stampare il file.
Qualora si disponga di una stampante laser, le cose sono rese più semplici dalla compatibilità PCL. Questo ci rende disponibili alcune opzioni: alcuni programmi possono avere la capacità di produrre direttamente output PCL. Se questo non è il caso in questione, programmi come NetPBM possono effettuare la conversione in PCL. Un ultima possibilità è quella di usare ghostscript.
In generale la miglior soluzione è quella di installare un pacchetto come NetPBM o Ghostscript unitamente ad un magic filter per gestire i file grafici "automagicamente".
Stampare file PostScript con una stampante dotata di un interprete PostScript è estremamente semplice: basta usare lpr e la stampante si occuperà di tutti i dettagli per voi. Quelli di voi che non possiedono stampanti PostScript si troveranno a dover ricorrere ad altri sistemi. Fortunatamente, vi sono programmi in grado di tradurre il PostScript in un linguaggio che la maggioranza delle stampanti sono in grado di comprendere. Il più noto fra questi programmi è probabilmente Ghostscript.
È responsabilità di Ghostscript convertire i descrittori di un file PostScript in comandi che la vostra stampante sia in grado di comprendere. Un esempio di stampa tramite Ghostscript potrebbe essere il seguente:
$ gs -dSAFER -dNOPAUSE -sDEVICE=deskjet -sOutputFile=\|lpr tesi.ps
Osservate che nell'esempio precedente stiamo passando l'output di Ghostscript al comando lpr tramite una pipe nell'opzione -sOutputFile.
Ghostview è una interfaccia per Ghostscript sotto X-window. Esso permette di vedere un anteprima di un file PostScript prima di procedere alla sua stampa. Sia Ghostview che Ghostscript possono essere scaricati dal sito ftp://prep.ai.mit.edu/pub/gnu/.
Adobe ha rilasciato una versione di Acrobat reader per Linux disponibile presso la home page di Adobe http://www.adobe.com. Il suo predecessore, xpdf, è ancora disponibile. Entrambi i programmi sono in grado di stampare su dispositivi PostScript.
Una delle maniere più semplici di stampare un file Tex è quella di convertire tale file in PostScript e quindi stamparlo tramite Ghostscript. Per far ciò è prima necessario convertire il file da TeX ad un formato noto come DVI (che sta per device-independent) tramite il comando tex(1). È a questo punto possibile convertire il file DVI in PostScript usando il programma dvips. Un esempio di quanto si è appena illustrato è il seguente:
$ tex tesi.tex
$ dvips tesi.dvi
A questo punto potete stampare il file PostScript risultante come si è descritto in precedenza.
troff
$ groff -Tascii tesi.tr | lpr
oppure, se così preferite,
$ groff thesis.tr > thesis.ps
e provvedete quindi a stampare il file PostScript come si è già discusso in precedenza.
$ man man | col -b | lpr
Le pagine man sono preformattate tramite troff
ed è quindi necessario eliminare
qualsiasi forma di sottolineatura, evidenziamento e similari. Il programma "col" esegue
questo compito perfettamente, e dato che nell'esempio sopracitato stiamo passando l'output
ad una pipe, man
non invocherà more
ad ogni schermata.
Questa sezione del documento copre aspetti della stampa sotto Linux che non rientrano esattamente in nessuna delle altre sezioni.
Dato che molti file ASCII non sono formattati per la stampa, potrebbe risultare utile il poterli formattare in qualche maniera prima di procedere alla loro stampa. Questo può includere l'apporre il suo numero su ciascuna pagina, modificare i margini, raddoppiare la spaziatura o lo stampare il file in colonne multiple. Un modo comune di fare tutto questo è tramite un preprocessore come pr.
$ pr +4 -d -h"Tesi di dottorato, seconda bozza" -l60 tesi.txt | lpr
Nell'esempio precedente pr leggerà il file tesi.txt
, salterà le prime
tre pagine (+4), imposterà la lunghezza di pagina a sessanta linee (-l60),
raddoppierà la spaziatura dell'output (-d) ed aggiungerà la frase "Tesi di dottorato,
seconda bozza" in cima ad ogni pagina (-h). Lpr provvederà quindi ad accodare l'output
di pr sulla stampante predefinita. Fate riferimento alla manpage di pr per
maggiori informazioni sul suo uso.
Tutti i comandi del sistema di stampa di Linux accettano l'opzione -P, che permette all'utente di specificare su quale stampante l'output del comando vada indirizzato. Qualora l'utente non specifichi quale stampante si intende utilizzare il sistema impiegherà la stampante predefinita come dispositivo di output.
Al fine di evitare di dover specificare quale stampante si intende utilizzare ogniqualvolta si stampi un file, è possibile impostare la variabile d'ambiente PRINTER con il nome della stampante che si desidera utilizzare. Questo compito va eseguito in modi diversi a seconda della shell utilizzata. Sotto bash ci si può trarre d'impiccio nel modo seguente:
$ PRINTER="nome_stampante"; export PRINTER
mentre sotto csh si avrà:
% setenv PRINTER "nome_stampante"
Questi comandi possono essere inseriti nel vostro script di login (.profile sotto bash o .cshrc sotto csh) o essere eseguiti dalla linea di comando. Si vedano bash(1) e csh(1) per ulteriori informazioni in merito alle variabili d'ambiente.
Q1. Come si previene l'effetto scala ?
A1. L'effetto scala (staircase effect) è dovuto alla maniera in cui alcune stampanti si aspettano le linee vengano terminate. Certe stampanti richiedono sequenze di fine linea composte dalla coppia carriage-return/line-feed (fine linea in stile DOS) invece della sequenza usata dai sistemi UNIX (line-feed). Il sistema più semplice di risolvere questo problema è il verificare se sia possibile modificare la modalità operativa della vostra stampante. Solitamente questo è possibile cambiando la posizione di un DIP switch o tramite l'invio di una appropriata sequenza di escape all'inizio di ogni ordine di stampa. Nel secondo caso sarà necessario creare un filtro (si veda Q2)
Una rapida soluzione è quella di usare un filtro sulla linea di comando. Un esempio di questo potrebbe essere:
$ cat tesi.txt | todos | lpr
Q2. Che cosa è un filtro ?
A2. Un filtro è un programma che legge da standard input (stdin), compie una qualche operazione su questo input e scrive i risultati su standard output (stdout). I filtri sono usati per svolgere molti compiti e tra questi vi è l'elaborazione di testo.
Q3. Che cosa è un magic filter ?
A3. Un magic filter è un filtro che determina quale tipo di operazione svolgere sul suo input in base al tipo di file ricevuto. A titolo di esempio, un magic filter potrebbe adottare una procedura di stampa differente a seconda che il file passatogli sia composto di testo puro (procedura di stampa "normale") o si tratti di un file PostScript (stampa tramite Ghostscript). Due esempi sono magicfilter e APSfilter. Bisogna osservare come sia necessario installare appropriati programmi prima di procedere all'installazione del filtro.
La ragione di questo va ricercata nel fatto che quando un magicfilter viene installato esso esamina il sistema alla ricerca di certi programmi (come Ghostscript - se esso è presente nel sistema il filtro sa di poter gestire il PostScript) e definisce le azioni che verranno compiute sul suo input in base a quanto trovato. Per poter gestire tutti i dei formati di stampa il vostro sistema dovrebbe avere almeno i seguenti programmi installati
Q4. Linux è in grado di gestire il Windows Printing System ?
A4. Forse. Quelle stampanti che accettano solo comandi WPS non funzioneranno sotto Linux. Quelle stampanti che accettano sia comandi WPS che altri comandi (come la BJC 610) funzioneranno se impostate in maniera da accettare comandi in un formato diverso dal WPS. Altre stampanti, come la HP DeskJet 820Cxi/Cse, non funzioneranno sotto Linux. Detto questo, si ricordi che Linux è in grado di funzionare come printserver per macchine Windows 95 (tramite Samba), dato che windows è dotato di driver per tali stampanti.
Q5. Che sistema da quattro soldi è questo ? Non posso stampare più di sei pagine senza incappare nell'errore "file too large".
A5. Una delle opzioni nel file /etc/printcap è collegata alla dimensione massima di un file stampabile. Il valore predefinito è di 1000 blocchi di allocazione (circa 500k). Nel caso di file PostScript e similari questo può limitare la dimensione massima dei file stampabili a 6-8 pagine inclusive di grafica. Siate certi di aver inserito la linea seguente nel file di definizione della stampante:
mx=0
La ragione principale di tutto questo è impedire che la partizione di spool sia riempita completamente.
Un altra maniera per ottenere lo stesso risultato è quella di far sì
che lpr crei un link simbolico
dalla directory di spool al file che si intende stampare invece di copiarvelo. Ma per far questo
dovete ricordare di utilizzare l'opzione -s
ogni volta che usate lpr .
Questa sezione tratta alcune cose comuni che possono andar storte nell'uso del proprio sistema di stampa.
Se la vostra stampante non funziona:
Inviate contributi e suggerimenti per questa sezione a <markk@auratek.com> (in inglese! - N.d.T.).
Questa sezione del documento contiene informazioni relative a materiale di riferimento sul sistema di stampa di Linux. Ho cercato di mantenere questa sezione dell'HOWTO quanto più focalizzata sull'argomento quanto fosse possibile. Se ritenete che qualche materiale significativo sull'argomento sia stato escluso non esitate a contattarmi.
Prima di chiedere aiuto in un gruppo USENET considerate le seguenti domande:
Se avete risposto affermativamente ad una delle domande allora potreste voler riconsiderare l'idea di postare la vostra domanda, ma, se decidete comunque di farlo, cercate di includere quante più informazioni in merito al vostro problema quanto vi sia possibile. Cercate di non scrivere cose come "Ho un problema con lpr , per favore aiutatemi". Richieste di questo tipo saranno ignorate dalla maggior parte dei lettori. Cercate anche di includere la versione del kernel del vostro sistema e gli specifici messaggi d'errore che il sistema vi ha ritornato.
comp.os.linux.*
troppe informazioni su Linuxcomp.unix.*
area di discussione relativa ad UNIX