Una de las ventajas que ofrece que tu aplicación este en el navegador es que no es necesario instalar drivers de impresoras por donde quiera que vayas poniendo la plataforma. Se genera un PDF que descargas localmente y ahora lo mandas a imprimir con tu Acrobat Reader o programas similares.
Pero este proceso en acciones repetitivas puede ser muy lento, bajas el PDF lo abres, mandas a imprimir con las opciones adecuadas, cierras PDF y vuelves a la plataforma.
Si en un día normal un cliente necesita imprimir unos 100 albaranes de salida de mercancía lo mas seguro es que te pida si existe una manera de abreviar este proceso.
CUPS al rescate
¿Que es CUPS?. CUPS es el sistema de impresión de código abierto basado en estándares desarrollado por Apple Inc. para macOS® y otros sistemas operativos similares a UNIX®. CUPS utiliza el Protocolo de impresión de Internet (IPP) para admitir la impresión en impresoras locales y de red.
Permite enviar directamente a las impresoras que tengamos instaladas en CUPS evitando el tedioso proceso que describimos antes.
Instalando CUPS
Nosotros decidimos instalar directamente CUPS en el servidor, también se puede instalar dentro de un contenedor docker, pero no se nos dio muy bien, así que seguimos los siguientes pasos, desde el terminal meter las siguientes instrucciones.
sudo apt-get install cups
sudo systemctl start cups
sudo systemctl enable cups
vamos a editar el fichero de configuración de cups
sudo nano /etc/cups/cupsd.conf
# Only listen for connections from the local machine.
Listen 631
Listen /run/cups/cups.sock
# Show shared printers on the local network.
Browsing On
BrowseLocalProtocols dnssd
# Restrict access to the server...
<Location />
Order allow,deny
Allow all
</Location>
En el tema de la seguridad tenéis que elegir vosotros, en nuestro caso lo dejamos lo mas abierto posible, para que la instalación de nuevas impresoras no fuera un problema con las restricciones.
Después de cambiar la configuración reiniciamos el servicio y comprobamos que esta funcionando correctamente.
sudo systemctl restart cups
sudo systemctl status cups
Creamos una nueva entrada en nuestro servidor dns de tipo A y esperamos que se propague.
cups.xtendoo.es a 255.255.255.255 (como ejemplo)
Nosotros usamos nginx como proxy inverso así que vamos a crear las rutas para poder acceder al servicio cups desde nuestro odoo.
sudo nano /etc/nginx/sites-available/xtendoo.es
introducimos las lineas siguientes, para que el servicio escuche en el puerto 6631
upstream cups {
server 127.0.0.1:631;
}
server {
listen 6631;
server_name cups.xtendoo.es;
location / {
proxy_pass http://cups;
proxy_set_header Host "127.0.0.1";
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
Si entramos en la dirección “cups.xtendoo.es:6631” debe de aparecernos una pantalla como esta.

Ahora debemos de agregar nuestras impresoras, para ello un par de cosas importantes antes, deben ser impresoras de red o usar un print server, en nuestro caso vamos a instalar dos impresoras Brother HL-L2370DN, le asignamos a cada una de ellas unas IP’s locales (p.e. 192.168.1.220 y 221).
Estas impresoras escuchan por el puerto 9100 por lo que tenemos que redireccionar a este puerto desde la IP publica mediante reglas NAT/PAT, por tanto escribimos las reglas en nuestro router apuntando siempre a las IP’s de las impresoras y como puerto interno siempre el 9100 pero el externo puede ser el que vosotros queráis en nuestro caso 9100 y 9101.
A modo de ejemplo.
- app/srv, puerto interno, puerto externo, protocolo, ipv4
- print 1, 9100, 9100, both, 192.168.1.220
- print 2, 9100, 9101, both, 192.168.1.220
Agregar la impresoras en CUPS
Una vez creadas las rutas para nuestras impresoras solo queda agregarlas a CUPS, desde el apartado de Administración > Añadir impresora.

Seleccionamos el protocolo AppSocket/HP JetDirect y pulsamos siguiente

En el apartado Conexión metemos: socket://nuestra_ip_publica:9100

Damos un nombre a la impresora para reconocerla dentro de nuestra red y seleccionamos “Compartir impresora”

En Marca seleccionamos “Generic” y pulsamos “Siguiente”

Seleccionamos en este caso “Generic PCL Laser Printer (en)” y pulsamos en Añadir impresora.
Estos parámetros pueden variar según los modelos de impresoras que vayamos a añadir.
Para verificar que todo funciona correctamente desde el apartado “Administrar impresoras” seleccionamos “Imprimir pagina de pruebas” y verificamos que todo este correcto.
Ahora tenemos que irnos a Odoo y preparar el sistema para que trabaje con CUPS.
Necesitamos instalar los siguientes paquetes. Nosotros usamos doodba de Tecnativa, con lo que solo tenemos que poner estos paquetes en el fichero atp_build.txt, os recomiendo dedicarles un tiempo a aprender esta maravillosa herramienta, que os hará el día a día mucho mas fácil en odoo.
build-essential
python3-dev
libcups2-dev
Necesitamos la librerías siguientes, esto es un requisito del repositorio report-print-send de OCA. Viene perfectamente especificado en el fichero requirements.txt de dicho repositorio.
pycups=1.9.74
zpl2=1.2
Para poder relacionar los documentos con las impresoras y los usuarios necesitamos un modulo que nos haga ese trabajo.
Como siempre OCA es fuente de conocimiento y soluciones, iremos a este repositorio, https://github.com/OCA/report-print-send, y lo descargaremos en nuestro odoo.
Una vez el repositorio este disponible instalaremos el siguiente modulo base_report_to_printer.

¿Que nos ofrece este modulo?
En el apartado “Ajustes” aparece un nuevo menú “Imprimiendo”, donde tenemos que dar de alta nuestro servidor CUPS, por tanto no vamos al apartado “Imprimiendo > Servidores”

Creamos nuestro servidor, el nombre que queramos lo importante es la IP donde se encuentre el servidor CUPS, y el puerto en nuestro caso abrimos en nginx el 6631, pulsamos el botón “Actualizar Impresoras” y deben de aparecer las impresoras que creamos en CUPS.

Tan solo nos queda decir que documentos queremos que sean impresos, en función del usuario que lo imprima y por que impresora debe de imprimirse. Nos vamos al apartado de “Imprimiendo > Informes”, seleccionamos el informe que queremos configurar, como ejemplo utilizaremos “Albarán de mercancía”. Editamos el informe en el apartado “Acciones especificas por usuario”

Editamos el informe en el apartado “Acciones especificas por usuario” y decimos que cuando imprima el usuario “Xtendoo”, realizamos la acción “Send to Printer” y seleccionamos la impresora por donde queremos que se imprima.

No vamos al albarán que deseamos imprimir y elegimos el informe.

Tenemos que tener nuestro impreso en la impresora sin mas intervenciones del usuario.
Referencias:
Python programer now working with odoo