Postscript, cui prodest?

Come stampare in Postscript in un sistema Linux
(anche senza una stampante Postscript)

di Giacomo Cabri
cabri@didasun1.cineca.it


Cosa è il Postscript

Il Postscript è un linguaggio di descrizione di pagina.
È forse il più versatile e amato linguaggio per stampanti, essendo diffuso in tutto il mondo. Tuttavia non gestisce solo stampanti, infatti esso dà la possibilità di "disegnare" sullo schermo del computer e su ogni tipo di dispositivo per la gestione di immagini. Il Postscript è un linguaggio interpretato e ricorda un po' il linguaggio FORTH. Diversi programmatori scrivono direttamente programmi in Postscript per molte applicazioni di disegno. Il sistema operativo NeXTSTEP utilizza il linguaggio Postscript II per gestire il video.
Tuttavia, i programmi Postscript sono solitamente dei documenti fatti per essere stampati, generati da un programma scritto in un linguaggio compilato.

Configurare una stampante Postscript virtuale

Poiché esistono molti documenti scritti in Postscript, può essere utile sapere come stamparli, dato che nel formato nativo sono difficilmente comprensibili. Grazie ad un apposito software è possibile stampare questi documenti anche su stampanti non Postscript. Con Linux è inoltre possibile creare una stampante Postscript virtuale, e lasciare che sia il sistema a gestire la traduzione.

Per prima cosa è necessario capire cosa andremo a fare. L'idea di base è che vi sia un filtro che trasforma il file scritto in linguaggio Postscript in un formato riconosciuto dalla stampante. Nel nostro caso il programma che fa da filtro si chiama ghostscript. Guardiamo insieme come possiamo utilizzarlo.
In un sistema Linux, il file che contiene la configurazione delle stampanti è /etc/printcap. Nonostante non abbia una interfaccia molto umana, non è impossibile capire come modificarlo. Partiamo da un esempio per vedere come installare una stampante Postscript virtuale. Questo è un pezzo del file printcap del mio sistema, a cui ho aggiunto la numerazione delle righe (non copiate i numeri!):

 1 # --------------------------------------
 2 #
 3 # PostScript printer; filter: ghostscript
 4 #
 5 ps|PS|PostScript printer: \
 6        :lp=/dev/lp0: \
 7        :sd=/usr/spool/lpd/jp350: \
 8        :lf=/usr/spool/lpd/jp350/errs: \
 9        :sh: \
10        :sf: \
11        :if=/usr/spool/lpd/jp350/ps-lpf:
Le prime quattro righe contengono commenti. Nella quinta vi è il nome della stampante (ps) con possibilità di definire alias (PS). Nella sesta riga viene definito il device a cui la stampante è collegata (in questo caso lp0 = LPT1 nel mio sistema). È poi necessario definire una directory di spool (dove vengono registrati i file in corso di stampa) e un file dove dirigere gli errori; nel mio caso ho creato la directory /usr/spool/lpd/jp350, come si può vedere dalle linee 7 e 8. Con i comandi sh e sf si disabilitano il banner iniziale e l'avanzamento di una pagina bianca alla fine della stampa; questi comandi non sono essenziali per stampare in Postscript, servono a me per evitare di sprecare due fogli in più per ogni stampa. Per ulteriori informazioni su sh e sf si veda il paragrafo 3.1.17 del file Printing-HOWTO. Arriviamo al bello. Con il comando if di linea 12 si può definire un file (eseguibile) che faccia da filtro. Esso prende da stdin il file da stampare, lo elabora, e restituisce su stdout i dati da mandare alla stampante. Il gioco sta nello scrivere uno script adeguato.

Qui entra in scena il ghostscript. Una verifica da fare è stabilire se la propria stampante è supportata dal programma. Con il comando "gs -h" è possibile sapere quali dispositivi vengono gestiti da ghostscript. Io ho una stampante a getto di inchiostro che lavora in emulazione HP deskjet, per cui posso utilizzare il dispositivo deskjet. Anche in questo caso diamo una occhiata al (mio) file-filtro per capire come costruirlo. Come avrete già capito l'ho chiamato ps-lpf e l'ho posto nella directory di spool della stampante. Il file si presenta così:

#!/bin/bash
gs -q -dNOPAUSE -sPAPERSIZE=a4 -sDEVICE=deskjet -sOutputFile=- -
La prima riga è essenziale per eseguire lo script. La seconda invoca l'interprete ghostscript con i seguenti parametri:
-q dice a ghostscript di non scrivere messaggi;
-dNOPAUSE definisce la variabile NOPAUSE, per evitare che ghostscript faccia una pausa tra una pagina e l'altra;
-sPAPERSIZE=a4 definisce la misura del foglio;
-sDEVICE=deskjet dice a ghostscript quale dispositivo utilizzare per la traduzione;
-sOutputFile=- definisce il file di output, nel nostro caso stdout;
- è il file di input, nel nostro caso stdin.

È possibile riutilizzare questo file cambiando solo il dispositivo (DEVICE).
Dopo aver salvato il file, è necessario settare il permesso di esecuzione del file, con il comando

chmod 755 ps-lpf
ed inoltre il proprietario del file deve essere root, cosa ottenibile eseguendo il comando
chown root.root ps-lpf
A questo punto avete nel sistema una stampante Postscript virtuale, che si chiama ps; notate che non è la stampante di default, per cui è necessario specificare la stampante ps al momento della stampa.
Se ad esempio usate lpr, la sintassi è:
lpr -Pps file.da.stampare.ps
e il vostro file.da.stampare.ps viene stampato in Postscript.

Errori più comuni


Documentazione

Questi sono i file in cui è possibile trovare ulteriori informazioni, (tra parentesi la loro locazione nella distribuzione Slackware):
Spero di essere stato utile e rimango a disposizione per chiarimenti o informazioni.