Cookie

TheJoe.it Into the (open) source

31mag/130

Stampare senza driver, con upload di file su server Linux

Attenzione!

Questo articolo è stato scritto nel 2013, potrebbero esserci stati sviluppi circa l'argomento trattato.
In caso di dubbi lasciate un commento in fondo all'articolo.
Grazie.

canon-pixma-mp495

Nell'articolo di oggi mi occupo di stampa. Dopo essermi confrontato con le esigenze più disparate della clientela, sono arrivato a teorizzare l'idea che l'utente (utonto) debba avere per forza tutto già pronto. Meno programmi o driver avrà da installare, più sarà contento e meno tedierà chi ha altro da fare.

L'illuminazione mi è venuta spulciando fra le impostazioni della stampante che abbiamo in ufficio. In uno dei menù vedo che è possibile caricare il PDF da stampare sulla memoria interna della stampante per stamparlo automaticamente.

Niente driver (la stampante è di rete), niente formattazioni particolari, solo l'upload. Allora ho pensato che non sarebbe stato difficile fare la stessa cosa con una stampante collegata tramite USB o seriale a un computer, senza condividerla (servirebbero i driver). E infatti è stato semplice.

Per l'esperimento di oggi servono almeno due computer, connessi sulla LAN, di cui uno collegato e configurato per stampare localmente (che chiameremo server). Inoltreremo il PDF al server tramite interfaccia web, perché più intuitiva e l'utente familiarizza prima. Quindi il computer collegato alla stampante dovrà fare da print-server e da web-server.

Qualche parola su CUPS...

Do per assodato che venga utilizzato un server Linux allo scopo. Per chi ancora non conoscesse CUPS si faccia un giro su Wikipedia o nel sito ufficiale del progetto CUPS (Common Unix Printing System). Basti sapere che tutti i processi di stampa su Linux (che io sappia) sono gestiti da CUPS, un server di stampa installato sul PC. Tutti. Per chi non lo sapesse, con CUPS, le stampanti e i lavori di stampa sono facilmente amministrabili tramite interfaccia web. È sufficiente inserire nella url bar "http://localhost:631". Da quella pagina potremo amministrare le stampanti, i lavori di stampa, installare o rimuovere una stampante, in pratica qualsiasi cosa vogliamo fare della stampante lo possiamo fare oltre che con i tool appositamente sviluppati per ogni distribuzione, anche da interfaccia web. Questo rende molto più semplice la configurazione ad esempio di un server di stampa. Ed è proprio il nostro caso.

La finestra amministrazione stampanti

CUPS: la finestra amministrazione stampanti

Per quanto riguarda l'installazione di CUPS facciamo riferimento alla guida di Ubuntu, è comunque l'unico sistema per stampare con Linux, quindi ogni distribuzione avrà CUPS all'interno dei propri repository. Solitamente è incluso di default nella distribuzione.

Ora passiamo al webserver, useremo Apache con supporto al PHP. Anche in questo caso la guida di Ubuntu è molto dettagliata, e prende in considerazione il maggior numero di scenari e problematiche che un utente può incontrare installando Apache. L'installazione di PHP invece ve la spiego io.

Occorre installare PHP5 e un pacchetto che permetta a PHP di comunicare con Apache. Da terminale:

sudo apt-get install php5 libapache2-mod-php5

Apache dovrà poi essere riavviato perché si "accorga" che ora ha il supporto al PHP. Sempre da terminale:

sudo /etc/init.d/apache2 restart

Inseriamo la password e confermiamo. Ora testiamo se veramente le cose sono andate per il verso giusto. Creiamo il file "/var/www/phpinfo.php" al cui interno inseriamo il seguente codice:

<? phpinfo(); ?>

Apriamo un browser e nella url bar scriviamo "http://localhost/phpinfo.php". Dovrebbe apparire una pagina simile alla seguente.

PHP installato e funzionante

PHP installato e funzionante

Bene, ora abbiamo anche un webserver funzionante. Dobbiamo creare uno script che permetta l'upload del PDF sul server. Per prima cosa creiamo la form in HTML:

<html>
<body>

<form action="upload_file.php" method="post"
enctype="multipart/form-data">
<label for="file">Filename:</label>
<input type="file" name="file" id="file">
<input type="submit" name="submit" value="Upload!">
</form>

</body>
</html>

form

La form richiama il file "upload_file.php", il cui contenuto è il seguente:

<?php
$allowedExts = array("pdf");
$extension = end(explode(".", $_FILES["file"]["name"]));
if ((($_FILES["file"]["type"] == "application/pdf"))
&& ($_FILES["file"]["size"] < 2000000)
&& in_array($extension, $allowedExts))
  {
  if ($_FILES["file"]["error"] > 0)
    {
    echo "Return Code: " . $_FILES["file"]["error"] . "<br>";
    }
  else
    {
    echo "Upload: " . $_FILES["file"]["name"] . "<br>";
    echo "Type: " . $_FILES["file"]["type"] . "<br>";
    echo "Size: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
    echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br>";

    if (file_exists("upload/" . $_FILES["file"]["name"]))
      {
      echo $_FILES["file"]["name"] . " already exists. ";
      }
    else
      {
      move_uploaded_file($_FILES["file"]["tmp_name"],
      "upload/" . $_FILES["file"]["name"]);
      echo "Stored in: " . "upload/" . $_FILES["file"]["name"];
      }
    }
  }
else
  {
  echo "Invalid file";
  }
?>

Alla quinta riga avrete notato che ho impostato un limite massimo per la dimensione del PDF. Questo può essere anche tranquillamente rimosso, e modificato il file "php.ini" in modo da lasciar caricare anche i PDF più pesanti. Non dimentichiamoci che tutto avviene in locale all'interno di una LAN. Creiamo inoltre la directory "upload", dove verrà caricato il file.

Se l'upload va a buon file lo script ci mostrerà cosa è stato caricato, il tipo di file, la dimensione e dove è salvato sul server, altrimenti restituisce "Invalid file".

script_ok

Ora che il primo file è stato caricato dovremo fare in modo che tutto il contenuto della directory "upload" venga stampato, e poi spostato in una directory di backup che verrà svuotata giornalmente (non vogliamo intasare di file il server, vero?). Chiamerò la directory di backup "deposito", posizionata all'interno della directory radice. Per tutti gli automatismi useremo Cron.

Aggiungiamo le seguenti righe in fondo al file di crontab ("crontab -e").

# print server
* * * * * lpr /var/www/uploader/upload/* | sleep 30; mv /var/www/uploader/upload/* /var/www/uploader/deposito/
0 4 * * * rm -Rf /var/www/uploader/deposito/*

Il primo comando crontab controlla ogni minuto la directory "upload", stampa ogni file al suo interno e sposta tutto il contenuto nella directory "deposito". Il secondo cancella tutti i file contenuti nella directory "deposito" alle 4 di ogni notte.

About

Mantengo questo blog a livello amatoriale dal 2009. Sono appassionato di grafica, tecnologia, software Open Source. Fra i miei articoli non sarà difficile trovarne circa la musica, ed alcuni di riflessioni personali, ma preferisco indirizzare la linea del blog principalmente verso la tecnologia. Per informazioni contattami.

Commenti (0) Trackback (0)

Ancora nessun commento.


Leave a comment

Ancora nessun trackback.