Pues no. NO es tan sencillo como configurar las opciones de la impresora con el número de departamento que corresponda. La sesión de usuario del sistema es única y genérica para todos los docentes (usuario «profesor»), por lo que comparten escritorio y configuraciones en cada ordenador. Aunque luego se trabaja con credenciales personales la configuración de las impresoras quedaría con el último código introducido por el profesor: Si no lo «limpian» o cierran la sesión el siguiente «listo» cargará la copias a la cuenta del anterior.
En MsWindows y utilizando los drivers empresariales funciona: dejar el código en blanco fuerza la aparición de un diálogo del sistema instándote a introducirlo cada vez que imprimes algo. Desde Linux no existe esa funcionalidad, así que me puse creativo…
Solución: utilizar el procesado de «filtros» del subsistema de impresión CUPS para incrustar un script que forzara la petición al usuario de su código de la impresora y lo sustituyera en el archivo a imprimir. La verdad es que venía funcionado sin problema desde hace 10 años pero en septiembre de 2024 dejó de hacerlo. Dejo a cualquier interesado una solución provisional (adapta las variables XAUTHORITY, XDG_RUNTIME_DIR y DBUS_SESSION_BUS_ADDRESS a tu usuario)
#!/bin/bash
# DESCRIPCIÓN: Filtro para la solicitud del código de departamento al imprimir
# MODELO: Diseñado para las impresoras Toshiba e-studio
# AUTOR: David Martín Pascual <davidmartin@colegiopablovi.es>
# VERSIÓN: 2.3 - 10 de octubre de 2024
# DEPURACIÓN: /var/log/cups/error_log
# PARÁMETROS: NºTrabajo, Usuario, Título, NºCopias, Opciones, [ archivo ]
# REQUIERE:
# Tener instalado zenity (apt-get install zenity)
# Autorizar a los usuarios 'root' y 'lp' a acceder a la sesión gráfica
# añadiendo 'xhost +si:localuser:lp +si:localuser:root' al fichero
# '/etc/X11/35x11-common_xhost-local'
# Configurar el uso de este script como filtro en el fichero PPD de la
# impresora (están en /etc/cups/ppd/) añadiendo la siguiente línea
# '*cupsFilter: "application/vnd.cups-postscript 0 /usr/lib/cups/filter/depcode"'
# antes de la sección 'Installable Option'
# Copiar este fichero 'depcode' a la carpeta '/usr/lib/cups/filter' con el
# mismo propietario y permisos que el resto de ficheros allí contenidos.
# Configurar la impresora para utilizar el 'Código de Departamento' y
# asignarle como valor por defecto '00000' o no lo pedirá de forma interactiva.
# Reiniciar el servicio CUPS y la sesión del usuario antes de probar.
# 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 at <http://www.gnu.org/licenses/> for
# more details.
export DISPLAY=":0.0"
export XAUTHORITY="/home/profesor/.Xauthority"
export XDG_RUNTIME_DIR="/run/user/1000"
export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus
# Al generarse un error emitimos el mensaje apropiado
function ControlError() {
CODIGO_ERROR=$?
echo "DEBUG depcode: Nº[$1], Usu[$2], Tít[$3], Cop[$4], Opc[$5], Err[$CODIGO_ERROR]" >&2
if [ $CODIGO_ERROR -gt 0 ] ; then
case $CODIGO_ERROR in
2) TEXTO="Cancelado por el usuario" ;;
3) TEXTO="El código bebe contener exactamente 5 dígitos" ;;
4) TEXTO="El código bebe contener sólo números" ;;
5) TEXTO="El código introducido no es correcto" ;;
143) TEXTO="Cancelado desde la cola de impresión" ;;
*) TEXTO="ERROR nº: $CODIGO_ERROR" ;;
esac
zenity --error --title="Impresora" --text="$TEXTO" --display=:0
exit 1
fi
exit 0
}
trap 'ControlError $1' 0 1 2 3 15
# Obtención del código de impresión a través de un formulario emergente
CODIGO=`zenity --password --title="Código de impresión" 2>/dev/null`
[ $? -eq 1 ] && exit 2
[ ${#CODIGO} -ne 5 ] && exit 3
[ -z "${CODIGO##*[!0-9]*}" ] && exit 4
[ "$CODIGO" == "00000" ] && exit 5
DC1=`echo ${CODIGO} | cut -c1`
DC2=`echo ${CODIGO} | cut -c2`
DC3=`echo ${CODIGO} | cut -c3`
DC4=`echo ${CODIGO} | cut -c4`
DC5=`echo ${CODIGO} | cut -c5`
SDC1="s/DCDigit1 0/DCDigit1 ${DC1}/g"
SDC2="s/DCDigit2 0/DCDigit2 ${DC2}/g"
SDC3="s/DCDigit3 0/DCDigit3 ${DC3}/g"
SDC4="s/DCDigit4 0/DCDigit4 ${DC4}/g"
SDC5="s/DCDigit5 0/DCDigit5 ${DC5}/g"
# Procedemos a la inserción del nuevo código en el fichero (o desde stdin)
if [ -f "$6" ] ; then
sed -e "${SDC1}" -e "${SDC2}" -e "${SDC3}" -e "${SDC4}" -e "${SDC5}" $6
else
sed -e "${SDC1}" -e "${SDC2}" -e "${SDC3}" -e "${SDC4}" -e "${SDC5}" -
fi