Pues ya tengo también el escaneado de documentos vía web en la red casera. Y estoy que no me lo creo de lo fácil que ha sido.
Una vez que he conseguido que la instalación del escáner en red sea una realidad y no me vuelva más loco de lo habitual quería obtenerlo también empleando el navegador, por ver si podía ser incluso más sencillo de integrar en los sistemas que utilizar los programas habituales de escritorio de Linux.
Y buscando he encontrado una aplicación web que hace justamente eso que estaba buscando: scanservjs. La he instalado y la he retocado un poco para que tenga un frontal web como los otros y el resultado de uso es fascinante:
Tiene todo lo que esperas de la aplicación de escaneado, proceso y guardado de resultados. Como se han instalado las aplicaciones tesseract-ocr e imagemagick -entre otras- se puede obtener documentos en PDF con texto o distintos formatos de imagen.
Los archivos están disponibles para descarga directa:
Y como es posible escanear páginas por lotes, con aviso manual si es preciso o alimentador si el escáner lo soporta, está tan bien pensando que si el formato es de imagen las diferentes exploraciones las guarda en un zip. Si es un PDF (con soporte de OCR o no) lo descarga en un documento con varias páginas.
Nota: Un detalle que me he encontrado es que el programa pierde los cambios en la configuración de manera que cada vez que abres la página (nueva) aparecen todos los valores para el entorno inglés, incluyendo el OCR. De momento no es molesto porque son un par de clicks para cambiarlo pero …
Y añadido: creo que es cosa de Firefox y sus complementos de privacidad porque de momento no parece que ocurra lo mismo con Chromium.
El dispositivo del escáner si es USB
Mucho tuve que estar buscando hasta que llegué a entender qué era necesario hacer para que los permisos fuesen los correctos.
Cuando el escáner es de tipo USB el sistema no garantiza de buenas que tenga siempre el mismo archivo de dispositivo por lo que los permisos quedan siempre mal y no asignados al grupo scanner que es al que todos se enganchan.
Para ello tuve que añadir un archivo a la configuración de udev de manera que siempre que apareciese el dispositivo de escaneado lo pusiese bajo el grupo indicado.
El archivo está en /etc/udev/rules.d/scanner.rules y es el siguiente:
ACTION!="add", GOTO="scanner_end_rules" ENV{libsane_matched}=="yes", OWNER="saned", GROUP="scanner" LABEL="scanner_end_rules"
Viene a decir que si la acción no es añadir (add) pase al final del archivo indicado con la etiqueta scanner_end_rules y que en caso contrario tiene que comprobar la variable de entorno libsane_matched; si contiene el valor yes entonces el propietario del fichero será saned y el grupo scanner.
La variable de entorno mencionada es inicializada por las reglas incluidas en el paquete sane y similares. En mi caso, al ser un Epson Perfection 2400 Photo, la variable se encuentra en las reglas de /lib/udev/rules.d/60-libsane.rules:
# Wildcard: for some Epson SCSI scanners ATTRS{type}=="3", ATTRS{vendor}=="EPSON", ATTRS{model}=="SCANNER*", ENV{libsane_matched}="yes"
Una vez añadido se puede forzar la relectura de estas reglas empleando el programa udevadm. Luego pasamos a comprobar cómo se han aplicado los cambios:
$ sudo udevadm control --reload-rules $ lsusb Bus 002 Device 004: ID 04b8:0142 Seiko Epson Corp. GT-F730 [GT-S630/Perfection V33/V330 Photo] ... $ ls -ltra /dev/bus/usb/002/ total 0 drwxr-xr-x 4 root root 80 feb 21 18:52 .. crw-rw-r-- 1 root root 189, 129 feb 21 18:52 002 crw-rw-r-- 1 root root 189, 128 may 5 12:36 001 drwxr-xr-x 2 root root 100 may 5 13:00 . crw-rw-rw- 1 saned scanner 189, 131 may 5 13:00 004
Apache2 haciendo de proxy
En principio es bastante sencillo; se emplea el módulo mod_proxy de toda la vida apuntando a la IP y al puerto de escucha del servicio scanservjs y el único detalle especial ha sido activar una directiva para que algunos URL generados pasasen directamente y no diesen un error 404 en el propio servidor web.
Curiosamente eran los URL de los archivos así que sí que tenían importancia.
<VirtualHost *:80>
ServerName scanner.home
ServerAdmin root@home
AllowEncodedSlashes NoDecode
ProxyPreserveHost On
ProxyPass "/" "http://127.0.0.1:8088/" nocanon
ProxyPassReverse "/" "http://127.0.0.1:8088/"
LogLevel info
ErrorLog /var/log/apache2/scanner.home/error.log
CustomLog /var/log/apache2/scanner.home/access.log combined
</VirtualHost>