Da una semplice stampate ad una “Smart Stampante” disponibile per ogni dispositivo

Iniziamo con un piccolo preambolo, perché il tutto è nato da un problema di stampa…

Infatti, la mia stampante HP Officejet 8600 (connessa alla rete LAN locale), passando da Windows 8 a Windows 10 su diversi computer in casa ha smesso di funzionare.

Ossia, la stampante funziona alla grande, ma, nonostante il CD originale dei driver e un po’ di prove, i computer Windows proprio non ne vogliono sapere di stampare. Da Linux invece la configurazione è facilissima.

Stanco di smanettare inutilmente e alla ricerca di un metodo non troppo macchinoso ho deciso di far fare al computer Linux il lavoro di stampare, fra l’altro quel PC lo tengo praticamente sempre acceso già per altri motivi.

Ho quindi pensato alla soluzione più facile per poter inviare i files (in PDF) al computer Linux per poterli stampare. Ho pensato a Dropbox, capace di sincronizzarli in pochi secondi, ma voi potete usare anche una cartella condivisa in locale tipo SAMBA, un disco in rete NAS o altri sistemi cloud, sempre più diffusi al giorno d’oggi.

La scelta di stampare solamente file PDF è chiara. Prima di tutto così il formato viene sempre corretto (senza eventuali errori di formattazione dati da file .docx e simili) secondariamente da Windows si può sempre scegliere l’opzione “stampa su file”, che crea in modo terribilmente facile un PDF, in ultimo la maggior parte dei file che stampo sono già in questo formato.

È qui che mi sono reso conto che un semplice programmino avrebbe potutto fare già di più rispetto a quello che mi serviva…

Questo programma è utile infatti anche se ci si trova davanti ad un computer che abbia la stampante connessa con USB e che non si riesca ad arrivarci via rete locale, potremo infatti farlo stampare a distanza senza doverci sempre inviare i files. Ciò vale anche se lavoriamo da smartphone o tablet. Sfruttando le funzionalità di Dropbox infatti possiamo caricare un file usando qualsiasi dispositivo e da qualsiasi parte del mondo. Il nostro computer poi farà il lavoro di stampa anche se la stampante non è condivisa in nessuna rete. Certo questo programma (nemmeno 15 righe di script) non è fatto per gestire gli errori, e si presuppone che abbiate accesso alla stampante per controllare lo stato di inchiostro e carta, ma permette di stampare a distanza in modo semplice. Una limitazione che ha attualmente sta nel fatto che i file da stampare non possono contenere spazi. Se il vostro file ha degli spazi rinominatelo semplicemente (chiamandolo anche solo x.pdf) e verrà stampato.

Se non vi interessa sapere come funziona lo script potete passare direttamente alla guida in 5 passi per l’installazione (più in basso).

Passiamo al programma

Da linux esiste un comando semplice e funzionale per stampare i PDF, si chiama lp. Il comando lp ha anche diverse opzioni (vedete il manuale digitando “man lp”) che permettono di scegliere la stampante, usare o no il fronte retro, selezionare un numero di pagine per foglio, la direzione di stampa (diritto o landscape) e molto altro.

Io ho semplicemente scritto un piccolo programmino in bash che ogni 10 secondi controlla se non ci sono files da stampare e se sì li stampa, dopo aver lanciato la stampa li elimina dalla cartella. Inoltre legge anche un file di impostazioni che permette di personalizzare alcune delle opzioni dette sopra. Potete semplicemente fare copia-incolla del codice qua sotto e salvarlo in un file come “printPDF.sh” ricordate però di scrivere il prercorso giusto per andare a trovare la cartella che vi interessa.

In seguito rendetelo eseguibile (usando “chmod a+x printPDF.sh”)

Ecco il file [1] e sotto ogni passaggio commentato, per chi voglia capire come funzioni:

#!/bin/bash
while [ : ]
do
filename="/home/XXX/Dropbox/DaStampare/Impostazioni.txt"
while read -r line
do
name="$line"
echo "Impostazione - $name"
done < "$filename"
for i in `find /home/XXX/Dropbox/DaStampare -name '*.pdf'`
do echo $i
lp -o fit-to-page $name $i && rm $i
done
sleep 10
done

Ecco qui le spiegazioni riga per riga.

Prima di tutto definisco che lo script è in bash (in questo modo può essere lanciato con ./nomeprogramma, dopo averlo reso eseguibile):

#!/bin/bash

Con le seguenti righe creo un loop infinito, alla fine del “programma” aspetto 10 secondi per evitare di sovraccaricare il sistema:

while [ : ]
do
programma
sleep 10
done

Il programma stesso va prima a leggere le impostazioni di stampa e le scrive a schermo per poterne verificare la correttezza. Per prima cosa viene definito dove si trova il file di impostazioni (scrivete su questa riga la path che vi interessa), poi viene letto riga per riga il file e scritto a schermo, ma solo l’ultima riga viene salvata nella variabile $name, poiché solo l’ultima riga ci interessa:

filename="/home/XXX/Dropbox/DaStampare/Impostazioni.txt"
while read -r line
do
name="$line"
echo "Impostazione - $name"
done < "$filename"

Ora il programma legge uno per uno tutti i files in formato pdf (quindi che finiscono per .pdf) che si trovano nella cartella indicata (modificate anche qui la path), per ogni file viene scritto a schermo il nome. Poi viene stampato e rimosso. Sotto spiegherò in dettaglio la riga centrale del programma:

for i in `find /home/XXX/Dropbox/DaStampare -name '*.pdf'`
do echo $i
lp -o fit-to-page $name $i && rm $i
done

Questa è la nostra riga chiave:

lp -o fit-to-page $name $i && rm $i

Il comando lp stampa un PDF con impostazione -o fit-to-page (che serve ad adattare eventuali pagine “fuori misura”) e continua con altre opzioni che ha trovato nell’ultima riga del file di impostazioni. In seguito $i è il nome del file che bisogna stampare.

Dopo aver lanciato la stampa (quindi dopo &&) egli rimuove il file dalla cartella in modo da rendere chiaro che questo è stato stampato e non va stampato ancora.

Nel file di impostazioni [2] (chiamato Impostazioni.txt) troviamo invece questo:

Impostazioni come segue:
1.
se vuoi fronte retro scrivi: -o sides=two-sided-long-edge
se invece vuoi una pagina scrivi: -o sides=one-sided
2.
se vuoi landscape (foglio girato) aggiungi alla riga: -o orientation-requested=4
3.
se vuoi più pagine per foglio aggiungi alla riga: -o number-up=4
puoi cambiare il 4 con uno dei seguenti numeri: 2,4,8,16

Questa è la linea di comandi, scrivili tutti qua divisi da spazi (assicurati che sia l'ultima riga del file):
-o sides=two-sided-long-edge -o number-up=2

Praticamente (anche senza istruzioni) basterebbe un programma di una riga con gli argomenti desiderati, quindi solo l’ultima riga.
Per ricordarsi però le varie impostazioni possibili ho scritto anche un testo per ricordarci quali possiamo usare.
Copiate e salvate anche questo file. Ricordate di metterlo nella cartella che avete indicato sopra nel programma in modo che possa trovarlo.

Trovandosi (nel mio caso) nella cartella Dropbox l’utente Windows (o da qualsiasi altro computer) potrà modificare le impostazioni sull’ultima riga di questo file prima di caricare il file PDF. Poi sposterà il file da stampare nella cartella Dropbox/DaStampare (dal suo computer o Smartphone ma condivisa con il computer che deve stampare) e questo verrà stampato secondo queste informazioni. Fino a quando non si cambierà a mano questo piccolo file le impostazioni resteranno invariate.

Ricapitolando (guida in 5 passi)

  1. Per prima cosa verificate che la vostra stampante funzioni dal computer Linux, così come Dropbox.
  2. Copiate il file [1] in un editor e modificate la riga 4 e 10 mettendo il percorso corretto alla vostra cartella Dropbox per la stampa, quindi salvatelo (dove volete) come remoteprint.sh
  3. Copiate file di impostazioni [2] in un editor e salvatelo nella vostra cartella dropbox per la stampa come Impostazioni.txt
  4. Aprite un terminale, spostatevi con il comando cd nella cartella dove avete salvato remoteprint.sh e rendetelo eseguibile con il comando chmod a+x remoteprint.sh
  5. Lanciate il programma con ./remoteprint.sh & (la & vi permette di chiudere il terminale dopo aver lanciato il programma e questo continuerà a funzionare), ora potete copiare un pdf nella cartella per la stampa (sia dal vostro computer che da altri) e verificare il funzionamento

Spero vi sia piaciuto questo piccolo script e che vi abbia semplificato la stampa da dispositivi che, per un motivo o per l’altro, non erano in grado di stampare. Nel caso vogliate un server piccolo ed economico un raspberry pi potrebbe essere un’idea interessante.