
En este cuarto artículo tiene como objetivo comentar el script en Python que hará la función de servidor de escaneado en la Raspberry Pi. La segunda parte habla sobre como convertir este script en un servicio de Linux.
En los artículos anteriores se configuró CUPS y se programó el script del servidor de impresión de PDF. Ahora ya contamos con opciones para imprimir desde ordenadores y dispositivos móviles, pero aún no podemos utilizar todo el potencial de la impresora multifunción ya que aún no podemos utilizar la función de escaneado. Para solucionar este problema, el siguiente script crea un sencillo servidor web, muy parecido al que se utilizó en el artículo anterior para el servidor de impresión, con el que realizar un escaneado del documento que se encuentre en la bandeja de escaneado. Una vez que el escaneado llega a su fin, el servidor web envía al cliente un archivo de imágen en formato TIFF con el documento escaneado.
NOTA: La parte en HTML ha sido modificada por problemas con el CMS. Recomiendo descargar el ZIP (al final del artículo) y consultar la versión correcta. Este problema ha sido solucionado.
Nota: Se ha corregido un problema importante que permitía la ejecución de código aleatorio a través de una petición POST especial.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 |
#!/usr/bin/env python # -*- coding: utf-8 -*- from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler from os import chdir,system import cgi,time # You have to edit the HTML code if you change one of them! selColorOps=['Color','Gray'] qualityOps=['100','300','600','1200'] class StoreHandler(BaseHTTPRequestHandler): def do_POST(self): form = cgi.FieldStorage( fp=self.rfile, headers=self.headers, environ={'REQUEST_METHOD':'POST', 'CONTENT_TYPE':self.headers['Content-Type'], }) #SPECIFIC PRINTING CODE if form.getvalue('selcolor') in selColorOps: opColor= form.getvalue('selcolor') else: opColor = "Gray" if form.getvalue('Quality') in qualityOps: opQuality = form.getvalue('Quality') else: opQuality = "100" t=time.time() localfilename=time.strftime("%b%d%Y%H%M%S", time.gmtime(t)) localfilepath="/tmp/"+localfilename+"_scan.tiff" scanner="$(scanimage --list-devices | sed -n 1p | cut -c9-29)" # COJE EL PRIMER ESCANER DE LA LISTA #print "scanimage -d %s --mode %s --resolution %s --format tiff > %s"%(scanner,opColor, opQuality,localfilepath) system("scanimage -d %s --mode %s --resolution %s --format tiff > %s"%(scanner,opColor, opQuality,localfilepath)) scanfile=open(localfilepath,"r") data=scanfile.read() scanfile.close() system("rm %s"%localfilepath) self.respondImage(data) def do_GET(self): response = """ <body> <form enctype="multipart/form-data" method="post"> <p>Escanear en: </p> <p> <input type="radio" name="selcolor" value="Color"> Color<br> <input type="radio" name="selcolor" value="Gray" checked> Blanco y negro<br> </p> <p> Seleccione la calidad del escaneado: <select name="Quality"> <option value="100">100ppp</option> <option value="300" selected>300ppp</option> <option value="600">600ppp</option> <option value="1200">1200ppp</option> </select> </p> <p><input type="submit" value="Escanear"></p> </form> </body></html> """ self.respond(response) def respond(self, response, status=200): self.send_response(status) self.send_header("Content-type", "text/html") self.send_header("Content-length", len(response)) self.end_headers() self.wfile.write(response) def respondImage(self, response, status=200): self.send_response(status) self.send_header("Content-type","image/tiff") self.send_header("Content-length", len(response)) self.end_headers() self.wfile.write(response) def main(): try: server = HTTPServer(('', 1479), StoreHandler) #print 'started httpserver...' chdir("/tmp") server.serve_forever() except KeyboardInterrupt: print '^C received, shutting down server' server.socket.close() if __name__ == '__main__': main() |
En el script anterior se utilizan los siguientes módulos de Python:
La funcionalidad del script anterior es muy similar a la que se explico en el artículo anterior. El script inicia el servidor de escaneado en el puerto 1479, que se queda esperando a recibir una petición. Si se desea realizar un escaneado, el usuario debe abrir un navegador y escribir en la barra de direcciones web la dirección IP de la Raspberry Pi y el puerto en el que está alojado el servidor (debería ser algo así 100.101.102.103:1479 siendo 100.101.102.103 la dirección IP de la Raspberry Pi) realizando una petición . Una vez que se recibe la petición desde el cliente, se lanza la función do_GET que responde al cliente con lo que tengamos en esa función. A continuación el usuario puede, o no, contestar a lo que acabamos de enviarle usando una petición tipo POST. En caso de que ocurra, esta petición se procesará en la función do_POST y se realizaran las operaciones necesarias y se enviará de vuelta al usuario la imagen escaneada, si ha habido algún problema, la imágen devuelta será de 0 bytes. A continuación se explica esto un poco más pormenorizado.
En el script anterior el main() inicializa el servidor web y la clase StoreHandler contiene las tres funciones (do_POST, do_GET y respond) que implementan la funcionalidad del servidor web.
El script anterior lo he situado en /opt/pyscan/scanserver.py (solo se puede acceder a este directorio como superusuario). Os recomiendo utilizar el mismo directorio que yo si queréis utilizar el script para convertirlo en servicio de GNU/Linux sin modificar nada.
En esta ocasión, para dar compatibilidad a vuestro escáner primero debe ser reconocido y estar configurado (si fuese necesario) en el sistema en el que se implemente el servidor de impresión (en este caso en la Raspberry Pi). A continuación se puede averiguar si vuestra impresora es reconocida por el sistema con el siguiente comando (en modo superusuario):
1 |
scanimage -L |
Nota: Dispositivos webcam y algunos otros también son reconocidos como dispositivos válidos. Esto obliga a obtener el nombre del dispositivo a mano en caso de que tengais más de un dispositivo compatible (en la Raspberry Pi, no existia ningún otro, por lo que este detalle no se tiene en cuenta)
Para obtener todas las opciones con las que el sistema permite trabajar al escanear documentos con un dispositivo determinado se puede utilizar el siguiente comando:
1 |
scanimage --help -d DEVICE |
Sustituyendo DEVICE por el dispositivo que se quiera utilizar como impresora obtenemos la ayuda y las opciones para ese dispositivo.
Una vez que se conocen estos datos, es necesario editar do_GET para que se muestren las opciones correspondientes al escáner que se desea configurar en la interfaz web y luego es necesario modificar do_POST para que se lean las opciones y se genere el comando de escaneado de forma correcta.
En la función do_POST se reciben todas las opciónes de configuración del escaneado (blanco y negro o color, resolución…). Es importante generar bien el comando de escaneado y guardar el fichero generado al escanear para poder enviarlo de vuelta.
En el script el archivo escaneado se guarda en un archivo en el que el nombre es generado a partir de la fecha y hora actual (para evitar problemas) y se escribe en el directorio /tmp.
1 2 3 |
t=time.time() localfilename=time.strftime("%b%d%Y%H%M%S", time.gmtime(t)) localfilepath="/tmp/"+localfilename+"_scan.tiff" |
Para escanear desde consola se puede utilizar algo como lo siguiente:
1 |
scanimage -d DEVICE --mode MODE --resolution DPI --format FORMAT > OUTPUT_FILE |
El parámetro -d nos permite seleccionar el dispositivo con el que se va a escanear. El parámetro mode nos permite decidir si deseamos escanear en color (Color) o en blanco y negro (Gray), el parámetro resolution nos permite seleccionar la resolución (en DPI) con la que escanear, el parámetro format nos permite seleccionar el formato de salida. Un ejemplo concreto podría ser algo como lo siguiente:
1 |
scanimage -d epson2:libusb:001:005 --modegray --resolution 100 --format tiff > /tmp/scan.tiff |
.El siguiente script debe guardarse en /etc/init.d/scanweb.sh para que funcione (Al final del artículo está el archivo ZIP con todos los archivos y la estructura de directorios)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
#! /bin/sh ### BEGIN INIT INFO # Provides: Scan_web_daemon # Required-Start: $networking # Required-Stop: # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Very simple python scan webserver # Description: This web server is used to use a scanner connected to this computer. ### END INIT INFO # Author: Draft Ideader # Web: drafidea.tk #It needs root privileges PIDFILE="/var/run/pyscan.pid" case "$1" in start) echo STARTING SCANNING ON WEB DAEMON if [ -f $PIDFILE ]; then #Comprobar si existe el pid pid=`cat $PIDFILE` if kill -0 &>1 > /dev/null $pid; then echo DAEMON ALREADY RUNNING exit 1 fi rm $PIDFILE fi start-stop-daemon --make-pidfile --pidfile $PIDFILE --start --background --exec /opt/pyscan/scanserver.py ;; stop) echo STOPING SCANNING ON WEB DAEMON if [ -f /tmp/scandaemon.pid ]; then start-stop-daemon --stop --pidfile $PIDFILE rm $PIDFILE else echo DAEMON IS NOT RUNNING fi ;; *) echo "Usage: scanweb {start|stop}" >&2 exit 3 ;; esac : |
Para dar de alta el servidor de escaneado como servicio, lo que implica que el script en Python del servidor de impresión se lance al iniciar la Raspberry Pi, se debe ejecutar en ese directorio el siguiente comando:
1 |
update-rc.d scanweb.sh defaults |
Automáticamente creará enlaces simbólicos a los niveles de ejecución (runlevels) correspondientes.
Si en algún momento deseas dar de baja el servicio y que por lo tanto NO se ejecute al inicio deberías usar el siguiente comando:
1 2 |
rm scanweb.sh update-rc.d scanweb.sh remove |
Ficheros del servidor: Archivos del servidor de escaneado v2
Ante cualquier duda, sugerencia, mejora o queja podéis dejarla en los comentarios.
Este es el último artículo de este proyecto. Los anteriores puedes encontrarlos aquí:
Bibliografía:
http://www.linuxtopia.org/online_books/programming_books/python_programming/python_ch36s02.html
http://www.stuffaboutcode.com/2012/06/raspberry-pi-run-program-at-start-up.html
En este tercer artículo se tratará la realización de un script sencillo en Python que hará la función de servidor de impresión de archivos PDF en la Raspberry Pi. La segunda parte habla sobre como convertir este script en un servicio de Linux.
Una vez que contamos con nuestro CUPS instalado y funcionando en la Raspberry Pi, ya podemos imprimir desde los ordenadores de nuestra red. El problema reside es que actualmente contamos en nuestra vida cotidiana con muchos dispositivos en los que no podemos configurar CUPS para imprimir como por ejemplo móviles y tablets. Para dar capacidades de impresión a estos dispositivos se ha realizado el script que se comenta a continuación, aunque actualmente cuenta con la restricción de que solo se permite la impresión de archivos PDF.
A continuación se muestra el script del servidor de impresión web (Al final del artículo está el archivo PDF con todos los archivos y la estructura de directorios). Debe tenerse en cuenta que el script está escrito de forma que tenga compatibilidad únicamente con la impresora multifunción DX4800 (en la descripción aparece como DX6000). Para que el script funcione con otros modelos de impresora más adelante se tratará que cosas deberían cambiarse y como obtener la información de las opciones disponibles.
NOTA: La parte en HTML ha sido modificada por problemas con el CMS. Recomiendo descargar el ZIP (al final del artículo) y consultar la versión correcta. Este problema ha sido solucionado.
Nota: Se ha corregido un problema importante que permitía la ejecución de código aleatorio a través de una petición POST especial.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 |
#!/usr/bin/env python # -*- coding: utf-8 -*- from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler from os import chdir,system from pyPdf import PdfFileReader import cgi,time # You have to edit the HTML code if you change one of them! selColorOps=['COLOR','MONO'] QualityOps=['PLAIN_DRAFT','PLAIN_NORMAL','PLAIN_HIGH', 'PMPHOTO_DRAFT','PMPHOTO_NORMAL','PMPHOTO_HIGH'] selPagesOps=['all','even','odd'] class StoreHandler(BaseHTTPRequestHandler): def do_POST(self): form = cgi.FieldStorage( fp=self.rfile, headers=self.headers, environ={'REQUEST_METHOD':'POST', 'CONTENT_TYPE':self.headers['Content-Type'], }) filename = form['file'].filename data = form['file'].file.read() #SPECIFIC PRINTING CODE if form.getvalue('selcolor') in selColorOps: opColor= form.getvalue('selcolor') else: opColor = "MONO" if form.getvalue('Quality') in QualityOps: opQuality = form.getvalue('Quality') else: opQuality = "PLAIN_DRAFT" if form.getvalue('selpages') in selPagesOps: opPages = form.getvalue('selpages') else: opPages = "all" t=time.time() localfilename=time.strftime("%b%d%Y%H%M%S", time.gmtime(t)) localfilepath="/tmp/"+localfilename actfile=open(localfilepath, "wb") actfile.write(data) actfile.close(); try: doc = PdfFileReader(file(localfilepath, "rb")) except: self.respond("ERROR: No es un PDF") return else: self.respond("Archivo subido: %s, imprimiendo."%filename) escaner="$(lpstat -a | sed -n 1p | cut -d ' ' -f 1)" #print "lp -d %s -o \"Quality=%s Ink/Ink=%s\" %s"%(escaner,opQuality,opColor,localfilepath) system("lp -d %s -o \"media=A4 Quality=%s page-set=%s Ink=%s\" %s"%(escaner,opQuality,opPages,opColor,localfilepath)) #print "rm %s"%localfilepath system("rm %s"%localfilepath) def do_GET(self): response = """ <html><body> <form enctype="multipart/form-data" method="post"> <p>Archivo: <input type="file" name="file"></p> <p>Imprimir en: </p> <p> <input type="radio" name="selcolor" value="COLOR"> Color<br> <input type="radio" name="selcolor" value="MONO" checked> Blanco y negro<br> </p> <p> Seleccione la calidad de la impresion: <select name="Quality"> <option value="PLAIN_DRAFT" selected>Borrador (se ve bien)</option> <option value="PLAIN_NORMAL">Normal</option> <option value="PLAIN_HIGH">Alta</option> <option value="PMPHOTO_DRAFT">Borrador foto</option> <option value="PMPHOTO_NORMAL">Normal foto</option> <option value="PMPHOTO_HIGH">Alta foto</option> </select> </p> <p> Seleccione las paginas a imprimir: <select name="selpages"> <option value="all" selected>Todas</option> <option value="odd">Impares</option> <option value="even">Pares</option> </select> </p> <p><input type="submit" value="Subir"></p> </form> </body></html> """ self.respond(response) def respond(self, response, status=200): self.send_response(status) self.send_header("Content-type", "text/html") self.send_header("Content-length", len(response)) self.end_headers() self.wfile.write(response) def main(): try: server = HTTPServer(('', 1478), StoreHandler) #print 'started httpserver...' chdir("/tmp") server.serve_forever() except KeyboardInterrupt: print 'shutting down server' server.socket.close() if __name__ == '__main__': main() |
En el script anterior se utilizan los siguientes módulos de Python:
El script anterior lo que hace básicamente es iniciar el servidor de impresión en el puerto 1478, que se queda esperando a recibir una petición. Si se desea imprimir un documento PDF el usuario debe abrir un navegador y escribir en la barra de direcciones web la dirección IP de la Raspberry Pi y el puerto en el que está alojado el servidor (debería ser algo así 100.101.102.103:1478 siendo 100.101.102.103 la dirección IP de la Raspberry Pi) realizando una petición . Una vez que se recibe la petición desde el cliente, se lanza la función do_GET que responde al cliente con lo que tengamos en esa función. A continuación el usuario puede, o no, contestar a lo que acabamos de enviarle usando una petición tipo POST. En caso de que ocurra, esta petición se procesará en la función do_POST y se realizaran las operaciones necesarias y enviando de vuelta al usuario información indicando si ha habido algún problema o no. A continuación se explica esto un poco más pormenorizado.
En el script anterior el main() inicializa el servidor web y la clase StoreHandler contiene las tres funciones (do_POST, do_GET y respond) que implementan la funcionalidad del servidor web.
El script anterior lo he situado en /opt/pyprint/printserver.py (solo se puede acceder a este directorio como superusuario). Os recomiendo utilizar el mismo directorio que yo si queréis utilizar el script para convertirlo en servicio de GNU/Linux sin modificar nada.
Básicamente para dar compatibilidad a vuestra impresora se debe averiguar que opciones os da el comando lp para imprimir. Esto se puede averiguar escribiendo en la terminal del ordenador donde la impresora lo siguiente:
lpoptions -d $(lpstat -a|sed -n 1p|cut -d ‘ ‘ -f 1)
Con el comando lpoptions -d IMPRESORA se listan todas las opciones que permite utilizar el driver que este cargado para esa impresora. Con el comando lpstat -a se listan todas las impresoras conectadas al equipo. Con sed -n 1p se imprime la primera linea de la salida estándar. Con cut -d ‘ ‘ -f 1 se parte la cadena que recibe utilizando como separador un espacio en blanco y el parámetro -f 1 indica que nos interesa escribir en la salida el primer elemento en los que se dividió la cadena de entrada. La línea vertical | se conoce como pipe y lo que hace es concatenar las operacioes (se ejecuta la primera, lo que escribe la primera se le pasa a la segunda)
Una vez que se conocen estos datos, es necesario editar do_GET para que se muestren las opciones correspondientes a la impresora que se quiere configurar y luego es necesario modificar do_POST para que se lean las opciones de forma correcta y se genere el comando de impresión de forma correcta.
En la función do_POST se recibe el fichero que se quiere imprimir y todos las opciónes de configuración de la impresora. Es importante generar bien el comando de impresión y guardar el fichero recibido para imprimirlo luego.
En el script el archivo PDF se guarda en un archivo en el que el nombre es generado a partir de la fecha y hora actual (para evitar problemas) y se escribe en el directorio /tmp.
1 |
t=time.time() |
1 |
localfilename=time.strftime("%b%d%Y%H%M%S", time.gmtime(t)) |
1 |
localfilepath="/tmp/"+localfilename actfile=open(localfilepath, "wb") |
1 |
actfile.write(data) |
1 |
actfile.close(); |
Para imprimir desde consola se puede utilizar en linux el comando lp. Este comando es el que he utilizado para imprimir en la Raspberry Pi.
1 |
lp -d IMPRESORA -o "media=MEDIA Quality=CALIDAD page-set=PAGINAS Ink=TINTA" FICHERO |
El parámetro -d permite seleccionar la impresora, se debe escribir el nombre. El parámetro -o permite establecer las opciones, que deben ir entre comillas (las que aparecen en el listado de lpoptions). El último parámetro (obligatorio) es el fichero a imprimir. Un ejemplo sería el siguiente:
1 |
lp -d EPSON_DX6000 -o "media=A4 Quality=PLAIN_DRAFT page-set=ALL Ink=MONO" miarchivo.pdf |
El siguiente script debe guardarse en /etc/init.d/printweb.sh para que funcione (Al final del artículo está el archivo ZIP con todos los archivos y la estructura de directorios).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
#! /bin/sh ### BEGIN INIT INFO # Provides: Print_web_daemon # Required-Start: $networking # Required-Stop: # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Very simple python PDF print webserver # Description: This web server is used to print PDF in this machine. ### END INIT INFO # Author: Draft Ideader # Web: drafidea.tk #It needs root privileges PIDFILE="/var/run/pyprint.pid" case "$1" in start) echo STARTING PRINTING ON WEB DAEMON if [ -f $PIDFILE ]; then #Comprobar si existe el pid pid=`cat $PIDFILE` if kill -0 &>1 > /dev/null $pid; then echo DAEMON ALREADY RUNNING exit 1 fi rm $PIDFILE fi start-stop-daemon --make-pidfile --pidfile $PIDFILE --start --background --exec /opt/pyprint/printserver.py ;; stop) echo STOPING SCANNING ON WEB DAEMON if [ -f $PIDFILE ]; then start-stop-daemon --stop --pidfile $PIDFILE rm $PIDFILE else echo DAEMON IS NOT RUNNING fi ;; *) echo "Usage: printweb {start|stop}" >&2 exit 3 ;; esac : |
Para dar de alta el servidor de impresión como servicio, lo que implica que el script en Python del servidor de impresión se lance al iniciar el sistema en la Raspberry Pi, se debe ejecutar en ese directorio el siguiente comando:
1 |
update-rc.d printweb.sh defaults |
Automáticamente creará enlaces simbólicos a los niveles de ejecución (runlevels) correspondientes.
Si en algún momento deseas dar de baja el servicio y que por lo tanto NO se ejecute al inicio deberías usar el siguiente comando:
1 2 |
rm printweb.sh update-rc.d printweb.sh remove |
En el siguiente artículo se tratara el script para el servidor de escaneado.
Ficheros del servidor: Archivos del servidor de impresión de PDF v2
Ante cualquier duda, sugerencia, mejora o queja podéis dejarla en los comentarios.
A continuación puedes encontrar los artículos de este proyecto:
Bibliografía:
http://www.linuxtopia.org/online_books/programming_books/python_programming/python_ch36s02.html
http://stackoverflow.com/questions/13146064/simple-python-webserver-to-save-file
http://www.stuffaboutcode.com/2012/06/raspberry-pi-run-program-at-start-up.html
En esta nueva entrada, empezaremos explicando como configurar el servidor de impresión CUPS en la Raspberry Pi y a continuación como añadir la impresora en red en Windows y Linux.
Para comenzar, es necesario instalar CUPS, para ellos en una terminal con privilegios de root ejecutamos lo siguiente:
apt-get install cups
Una vez que la instalación finalice es necesario acceder al menú de configuración de CUPS para añadir la impresora que queremos compartir:
En primer lugar debemos asegurarnos de que la impresora está encendida y conectada a la Raspberry Pi por uno de los puertos USB.
Ahora debemos comenzar a configurar CUPS, para ello tenemos varias opciones para acceder a la web de gestión: podemos acceder desde la propia Raspberry Pi desde entorno gráfico (usando un navegador cualquiera), desde consola (usando el navegador elinks) o sino desde otro ordenador conectado a la misma red. En mi caso he elegido la tercera opción por ser la más rápida y sencilla.
Para acceder a la web de gestión de CUPS es necesario saber que dirección IP tiene asignada la Raspberry Pi (se podría averiguar desde la propia Raspberry Pi con el comando ifconfig o desde la web de gestión del router). En mi caso la Raspberry tiene asignada una IP estática para evitar problemas.
Una vez que tenemos la IP debemos abrir un navegador en un ordenador de la misma red y escribir en la barra de direcciones la dirección IP de la Raspberry Pi, a continuación escribir unos dos puntos («:») y a continuación el número de puerto en la que está escuchando la web de gestión de CUPS (631) quedando algo similar a lo siguiente:
123.456.789:631
Siendo 123.456.789 la dirección IP de la Rasbperry Pi
Debería cargarse en el navegador una página similar a la siguiente
Para añadir la impresora debemos pulsar en el enlace que pone «Adding printer and classes« (Añadir impresoras y clases) como se ve en la imagen anterior.
A continuación debemos seleccionar la opción «Add printer« (Añadir impresora) e introducir las credenciales de superusuario para poder añadir y configurar la nueva impresora.
A continuación nos aparece un asistente muy sencillo en el que seleccionar la impresora que queremos configurar, ponerle un nombre y establecerla como compartida, seleccionar el controlador adecuado y establecer la configuración por defecto.
Una vez realizados estos pasos, nos aparecerá la pantalla de gestión de la impresora y su cola de impresión. La dirección de este panel es a donde deberemos enviar los documentos que deseemos imprimir (Esta es la razón por la que resulta útil tener una IP estática, de este modo nunca cambia esta dirección).
Con estos pasos ya tenemos a nuestra impresora en red, esperando a que los documentos lleguen para ser impresos. Pero nos falta añadir esta impresora al resto de ordenadores de la red. Empezaremos añadiendo la impresora a en un sistema GNU/Linux.
En GNU/Linux es casi automático, debemos entrar en la web de gestión de CUPS en el ordenador en el que queremos añadir nuestra impresora en red usando la siguiente dirección:
localhost:631
A continuación debemos pulsar en «Add printers and classes« (añadir impresoras y clases), poner nuestra contraseña de superusuario y en la siguiente pantalla seleccionar «Find new printers« (Buscar nuevas impresoras).
Ahora saldrá un listado en el que debería aparecer la impresora configurada en la Raspberry Pi. Debemos seleccionar esa impresora y configurarla siguiendo los mismos pasos que cuando se configuró en la Raspberry con un único cambio: no debemos compartirla por red («Share this printer» debe estar desmarcado).
Una vez realizados todos los pasos la impresora debería estar lista para imprimir. Para probar que funciona puedes imprimir un documento de prueba desde el ordenador y debería aparecer la nueva impresora en el menú de selección de impresora
NOTA: Hemos añadido la impresora como impresora local enlazada a la impresora en red de modo que el trabajo duro se realiza en nuestro ordenador. También se podría enlazar directamente la impresora en red, pero la Raspberry tiene poca potencia para procesar algunos documentos y se puede volver muy lento (basado en mi experiencia)
Para añadir la impresora en Windows debemos instalar en primer lugar los drivers de nuestra impresora. Para instalarlos se puede utilizar el disco de instalación de la impresora o buscar los drivers en la web del fabricante.
Una vez instalados los controladores, debemos abrir la ventana «Impresoras y faxes». Para abrirlo pulsamos en Inicio y seleccionamos la opción «Impresoras y faxes«.
En la ventana de «Impresoras y faxes«, pulsamos en la opción «Agregar una impresora«, la cual abrirá un asistente.
Seguimos las instrucciones del asistente y debemos seleccionar la opción «Una impresora de red o una impresora conectada a otro equipo«.
En la siguiente pantalla debemos seleccionar la opción «Conectarse a una impresora en internet o en su red doméstico u organización« y debemos escribir la dirección de la impresora (es la dirección que se indicó al inicio de este artículo).
A continuación se debe seleccionar el modelo de la impresora, los cuales solo aparecerán si la impresora es compatible con su sistema operativo o han sido instalados de antemano.
En la siguiente pantalla, se pregunta si se desea establecer la impresora que acabamos de añadir como predeterminada.
La nueva impresora aparecerá en la ventana «Impresoras y faxes»
Por último se podría hacer una prueba de impresión desde cualquier programa.
En el próximo artículo se explicará un script en Python para imprimir archivos PDF de forma remota, muy útil para imprimir desde una tablet, un móvil o cualquier dispositivo que tenga un navegador web.
Ante cualquier duda, error, mejora o queja vuestros comentarios son bienvenidos.
A continuación puedes encontrar los artículos de este proyecto: