Come stampare tanti file pdf velocemente? Semplice c’è la bash :)

Questa sera avevo voglia di stampare alcuni, tanti, file pdf. Questi file contenevano dei test a crocette a me utili per valutare la mia preparazione scolastica.

Generalmente per stampare si apre il file con un qualsiasi lettore pdf (il mio preferito è Okular) e poi si lancia la stampa.
Però dovere aprire tutti i file uno alla volta…selezionare stampa, selezionare la stampante e poi inviare la stampa è noioso e dispendioso in termini di tempo. Tanto più che volevo fare una stampa fronte e retro e la mia stampante non possiede il dispositivo per fare la stampa fronte-retro automatica. Quindi dovevo anche selezionare le pagine pari da stampare, indicare l’ordine inverso di stampa, lanciare la stampa, reinserire i fogli nel cassetto della stampante e dunque di nuovo stampa->seleziona pagine dispari, controllare che sia in ordine e poi stampare. Una rottura di scatole…

Beh per fortuna con bash tutte queste cose si risolvo facilmente tramite un banale script e un comando molto, molto utile: lp, presente nel pacchetto di CUPS (per gli utenti Fedora basta aver installato il pacchetto rpm cups).

Con lp è possibile inviare tramite la linea di comando un qualsiasi file supportato da CUPS ad una stampante collegata e configurata correttamente. Ad esempio si possono stampare agilmente file di testo, immagini, file PostScript e appunto file PDF semplicemente con:

$ lp file.pdf

In tal caso si invia il file di nome file.pdf alla stampante predefinita di sistema per la stampa.

Esiste anche un altro comando simile a lp che si chiama lpr, quest’ultimo offre però meno opzioni ed in genere si preferisce l’uso di lp.

Dalla manpage di lp si può capire tutta la sua potenzialità. A me interessavano in particolar modo le opzioni per indicare la stampante differente da quella predefinita di sistema e per poter stampare le pagine pari o dispari anche in ordine inverso se necessario.
Dunque tramite questo comando:

$ lpstat -p -d
la stampante Cups-PDF è in attesa.  Abilitata da gio 04 ago 2011 20:00:43 CEST
la stampante EPSON-AL-M2000 è in attesa.  Abilitata da gio 04 ago 2011 21:07:57 CEST
        la stampante è adesso in linea.
la stampante EPSON-Epson-Stylus-SX110 è disabilitata da lun 13 giu 2011 14:33:21 CEST -
        Unplugged or turned off
la stampante Stylus-COLOR-680 è disabilitata da lun 21 giu 2010 13:30:13 CEST -
        Unplugged or turned off
destinazione predefinita di sistema: Cups-PDF

Si possono vedere le stampanti installate, configurate e disponibili sul sistema ed anche la stampante predefinita (nel mio caso Cups-PDF).

Le opzioni del comando lp utili per la stampa delle pagine pari o dispari o per cambiare l’ordine di stampa si passano con l’opzione -o, dunque:

-o page-set=odd      # stampa pagine dispari
-o page-set=even     # stampa pagine pari
-o outputorder=reverse # stampa in ordine inverso

Dunque posso procedere così se voglio stampare con EPSON-AL-M2000, prima le pari in ordine inverso:

$ lp -d EPSON-AL-M2000 -o outputorder=reverse -o page-set=even file.pdf

Quando ha finito metto i fogli nel cassetto apposito con la faccia “bianca” rivolta al lato corretto e poi stampo le dispari:

$ lp -d EPSON-AL-M2000 -o page-set=odd file.pdf

Come si può vedere l’opzione -d serve ad indicare la stampante che si desidera utilizzare.

E ora per automatizzare il tutto? Facile, mi sono creato uno script bash, eccolo:

#!/bin/bash - 
#===============================================================================
#
#          FILE:  printquickly.sh
# 
#         USAGE:  ./printquickly.sh [filename]
# 
#   DESCRIPTION:  Print file quickly from bash
# 
#        AUTHOR: Mario Santagiuliana (M.S.), mario at marionline.it
#       COMPANY: marionline.it
#       CREATED: 04/08/2011 20:15:15 CEST
#
# This program is free software: you can redistribute it and/or modify it under
# the terms of the GNU General Public License as published by the Free Software
# Foundation, either version 3 of the License, or (at your option) any later
# version.
#
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
# details.
#
# You should have received a copy of the GNU General Public License along with
# this program.  If not, see .
#
#===============================================================================

PRINTER=EPSON-AL-M2000

printquickly() {
        echo -e -n "Process file: $1 [y/...]?"
        read a
        if [[ $a = 'y' || $a = '' ]]; then 
                echo -e "...print the even pages in reverse order..."
                lp -d $PRINTER -o outputorder=reverse -o page-set=even $1
                echo -e -n "> Moved printed papers in the printer tray so I can print odd pages [y/...]?"
                read b
                if [[ $b = 'Y' || $b = '' ]]; then
                        echo -e "..print the odd pages in normal order..."
                        lp -d $PRINTER -o page-set=odd $1
                fi
        fi
        echo
}

if [[ $1 ]]; then
        printquickly $1
else
        for file in *; do
                printquickly $file
        done
fi

Se non gli indico nessun file per la stampa in automatico cerca di stampare tutti i file della directory in cui si trova.
Inoltre attende un mio comando per partire con la stampa delle pagine dispari 🙂

Ovviamente lo script può essere migliorato e potenziato, per ora mi va bene così.

Della documentazione utile sull’uso dei comandi lp e lpr può essere trovata qui sul sito di cups.org.
Un’altra pagina che può risultare interessante è questa.

E buona stampa 🙂

P.S. perdonate eventuali errori di Inglese…

Privacy Preference Center