"Después del juego es antes del juego"
Sepp Herberger

viernes, 25 de abril de 2025

Aplicación web local para OCR de documentos.

Muchas veces nos preguntan como convertir un documento escaneado o fotografiado en texto. Aunque hay diversas herramientas gratuitas basadas en Tesseract OCR con el tiempo he visto que los más sencillo es una aplicación web local para toda nuestra red. La solución viene de manos de ScribeOCR.

El interfaz es muy sencillo, nos deja subir uno o varios ficheros con la imagen, hacer algunos ajustes sobre el idioma y la calidad y con "Recognize" lanzar el proceso de reconocimiento.





Una vez concluido nos marca con un resaltado el texto extraído y desde ahí podemos descargarlo en diversos formatos:



El fichero descargado puede abrirse con el editor correspondiente (yo he usado formato .txt), donde aparece el texto bruto ya reconocido (con sus deficiencias que habrá que corregir a mano, como podemos apreciar):

Veamos ahora como se instala ScribeOCR. Lo ideal es hacerlo en un servidor o máquina que esté accesible de forma continua en nuestra red:
# apt-get install npm
# mkdir /opt
# cd /opt
# git clone --recursive https://github.com/scribeocr/scribeocr.git
# cd scribeocr
# npm i
Una vez instalado podemos lanzarlo a mano con:
# npx http-server /opt/scribeocr -p 8081
Ahí nos mostrará con un mensaje que está escuchando en el puerto web 8081. Si abrimos ese puerto en un navegador con http://ip-maquina:8081 tendremos acceso al interface web y podremos realizar el proceso de OCR desde cualquier sitio de la red. Evidentemente tener que levantar a mano el servidor web con ScribeOCR es un fastidio, mejor invocarlo mediante un servicio systemd:
# cat /etc/systemd/system/http-server.service
[Unit]
Description=HTTP Server using npx
After=network.target

[Service]
Type=simple
User=root
ExecStart=/usr/bin/npx http-server /opt/scribeocr -p 8081
WorkingDirectory=/opt/scribeocr
Restart=always
RestartSec=3

[Install]
WantedBy=multi-user.target
Una vez creado el fichero .service, activamos el servicio:
# systemctl daemon-reload
# systemctl enable http-server.service
# systemctl start http-server.service
# systemctl status http-server.service
Y ya tenemos listo el servicio de OCR en red para uso del público en general.

miércoles, 9 de abril de 2025

Hacer funcionar DNIe en Ubuntu.

De vez en cuando un usuario me pide utilizar el DNIe en los sistemas Ubuntu. Dado que no existe un único paquete que resuelva todos los pasos de forma automática me hice una guia:

1. Instalación de software básico.

Los primeros paquetes a instalar son:
# apt-get install  pcscd pcsc-tools libccid libnss3-tools
Luego debemos instalar el paquete libpkcs11-dnie, que se descarga desde https://www.dnielectronico.es/.
# dpkg -i libpkcs11-dnie_X.Y.Z_amd64.deb
La versión X.Y.Z depende de nuestra versión de Ubuntu, cada cual que ponga la que le corresponde. Para Xubuntu 22.04 es 1.6.8. En mi caso tengo un repositorio reprepro privado para mi red, de tal manera que subo alli los paquetes sueltos que descargo. En este escenario puedo instalar el paquete con apt-get:
# apt-get update
# apt-get install libpkcs11-dnie
Una vez instalado todo, metememos el DNIe en el lector y vemos si es detectado con:
# pcsc_scan
Si todo ha ido bien deberia mostrarse información sobre como el lector detecta el DNIe español.

2. Lectores Smartcad Probados.

He trabajado con estos lectores verificando que funcionan:
  • SCM Microsystems Inc. SCR 3310 [CCID Interface] 00 00. Es el lector oficial que regalaba el Ministerio del Interior. En lsusb se muestra como "04e6:5116 SCM Microsystems, Inc. SCR331-LC1 / SCR3310 SmartCard Reader".
  • Generic Smart Card Reader Interface [Smart Card Reader Interface] (20070818000000000) 00 00. Este lector es un lector común clonico. Se detecta por lsusb como "0bda:0165 Realtek Semiconductor Corp."
  • Teclados HP: 03f0:104a HP, Inc HP USB Smartcard CCID Keyboard. Son unos teclados con lector SmartCard integrado que nos mandaron a los centros hace años. Se detecta como "0: Hewlett Packard HP USB Smartcard CCID Keyboard [HP Smartcard Keyboard] (15082100001733) 00 00"

3. Configuración de navegadores.

Con instalar los paquetes anteriores no es suficiente. Hay que configurar los navegadores web para que detecten y manejen el DNIe. Además esta configuración no es general de la máquina: hay que hacerla para cada usuario vaya a usar el DNIe.

Se puede hacer de dos maneras: con ratón entrando en la configuración del navegador o mediante comandos. Yo prefiero usar los comandos porque es mucho más rápido.

3.1. Configuración de Google Chrome.

Configuración gráfica:
  • Configuración > Configuración > Configuración avanzada > Privacidad y seguridad > Más > Gestionar certificados -> PIN DNIe -> Desbloquear
  • Entidades Emisoras -> Importar -> /usr/share/libpkcs11-dnie/ac_raiz_dnie.crt -> Aceptar -> Confiar en todo -> Aceptar
Configuración mediante comandos:
  • Cerrar chrome "pkill --oldest chrome".
  • Instalar libreria dnie en home usario:
    # mkdir -p $HOME/.pki/nssdb
    # modutil -force -add "DNI-e" -libfile /usr/lib/libpkcs11-dnie.so -dbdir sql:$HOME/.pki/nssdb
    # modutil -list -dbdir sql:$HOME/.pki/nssdb
    
  • Instalar certificado DG Policia:
    # certutil -A -n "DNIe" -t "CT,C,C" -i /usr/share/libpkcs11-dnie/AC\ RAIZ\ DNIE\ 2.crt -d $HOME/.pki/nssdb
    # certutil -L -d sql:$HOME/.pki/nssdb
    

3.2. Configuración de Firefox.

Configuración gráfica:
  • Privacidad y seguridad -> Dispositivos de seguridad -> Cargar -> Nombre DNIe y añadimos la ruta del Archivo del módulo: /usr/lib/libpkcs11-dnie.so -> Aceptar
  • Ver certificados (no seria necesario seguramente, el certificado de la DG Policia ya viene de serie) -> Autoridades -> pinchamos en Importar: /usr/share/libpkcs11-dnie/AC\ RAIZ\ DNIE\ 2.crt -> Aceptar -> Confiar en todo -> Aceptar
Configuración mediante comandos:
  • Cerrar firefox: "pkill --oldest firefox"
  • Instalar libreria dnie en todos los perfiles firefox del home del usuario.
    # rm -f /tmp/pkcs11.txt
    # echo "library=/usr/lib/libpkcs11-dnie.so" >> /tmp/pkcs11.txt
    # echo "name=DNI-e" >> /tmp/pkcs11.txt
    # perfiles=$(ls $HOME/.mozilla/firefox/ | grep .default)
    # for i in $perfiles; do
        cp /tmp/pkcs11.txt $HOME/.mozilla/firefox/$i/pkcs11.txt
      done
    # find $HOME/.mozilla/firefox | grep pkcs11.txt
    
  • Instalar certificado DG Policia en todos los perfiles firefox del home del usuario: no es necesario, viene de serie en Firefox. Podemos confirmar que está con el comando:
    # for i in $(ls $HOME/.mozilla/firefox/ | grep .default) ; do
       certutil -L -d $HOME/.mozilla/firefox/$i
    done
    
AVISO: Firefox es mas propenso a tener errores leyendo el DNIe que Google Chrome. Si operando con él no funciona o no es detectado, se recomienda cerrar el navegador y empezar de nuevo.

4. Bonus Track: Autofirma y ConfiguradorFNMT.

Para tener todo el entorno relacionado con la firma digital bien, se aconseja instalar además:
5. Scripts.

Todo lo anterior en scripts:
# cat 01-instala-software.sh 
#!/bin/bash
echo "Instalando software general. Le pediremos la contraseña de root si es necesaria"
su -c "apt-get install -y pcscd pcsc-tools libccid libnss3-tools"

echo "Instalando software especificio DNIe (paquete libpkcs11-dnie). Si no está en el repositorio puede descargarlo"
echo "    de la página de Descargas del DNIe  https://www.dnielectronico.es/portaldnie/PRF1_Cons02.action?pag=REF_1110."
echo "           Version Xubuntu 18  =   1.5.3" 
echo "           Version Xubuntu 22  =   1.6.8"
echo "    E instale el paquete .deb con dpkg -i ..."
su -c "apt-get install libpkcs11-dnie"

echo "Todo instalado puede probar si se detecta el lector y el DNIe con el comando pcsc_scan ejecutado como root."  
exit 0
Scripts para ejecutar con cada usuario que necesite tener acceso al DNIe:
# cat cat 02-configura-dnie-google-chrome.sh 
#!/bin/bash
echo "Instalando libreria y certificados en Google Chrome."
echo "Si se borra el perfil del usuario habria que reinstalar de nuevo."
echo "Cerramos google-chrome."
pkill --oldest chrome
echo ""
echo "Instalando libreria libpkcs11-dnie.so"
mkdir -p $HOME/.pki/nssdb
modutil -force -add "DNI-e" -libfile /usr/lib/libpkcs11-dnie.so -dbdir sql:$HOME/.pki/nssdb
echo ""
echo "Instalando certificado AC\ RAIZ\ DNIE\ 2.crt "
certutil -A -n "DNIe" -t "CT,C,C" -i /usr/share/libpkcs11-dnie/AC\ RAIZ\ DNIE\ 2.crt -d $HOME/.pki/nssdb
echo ""
echo "Instalado. Puede verificar que  está correcto haciendo:"
echo '     modutil -list -dbdir sql:$HOME/.pki/nssdb'
echo '     certutil -L -d sql:$HOME/.pki/nssdb'
# cat 03-configura-dnie-firefox.sh 
#!/bin/bash
echo "Instalando libreria y certificados en Firefox."
echo "Si se borra el perfil del navegador habria que reinstalar de nuevo."
echo "Cerramos Firefox."
pkill --oldest firefox

#Libreria acceso lector DNIe  - Firefox
rm -f /tmp/pkcs11.txt
echo "library=/usr/lib/libpkcs11-dnie.so" >> /tmp/pkcs11.txt
echo "name=DNI-e" >> /tmp/pkcs11.txt

echo "Instalando libreria libpkcs11-dnie.so"
perfiles=$(ls $HOME/.mozilla/firefox/ | grep .default)
for i in $perfiles
do
    cp /tmp/pkcs11.txt $HOME/.mozilla/firefox/$i/pkcs11.txt
done
echo ""

echo "No es necesario instalar certificado de la Dirección General de la Policía. Viene por defecto en Firefox."
echo ""
#Descomentar si queremos instalarlo en cualquier caso.
#perfiles=$(ls $HOME/.mozilla/firefox/ | grep .default)
#for i in $perfiles
#do
#     certutil -A -n "DNIe" -t "CT,C,C" -i  /usr/share/libpkcs11-dnie/AC\ RAIZ\ DNIE\ 2.crt -d $HOME/.mozilla/firefox/$i
#done

echo "Instalado. Puede verificar que está instalado todo haciendo:"
echo '     find $HOME/.mozilla/firefox | grep pkcs11.txt'
echo '     for i in $(ls $HOME/.mozilla/firefox/ | grep .default)'
echo '     do'
echo '        certutil -L -d $HOME/.mozilla/firefox/$i'
echo '     done'

exit 0
Creo que con esto está todo, a no ser que a alguien se le ocurra algún artefacto más relacionado con los certificados digitales.