viernes, 14 de junio de 2019

Escanear fotos y texto hasta obtener un PDF de calidad suficiente

En este caso hablamos de un manual de diagnóstico editado en 1979, con una fotos y claves de identificación que utilizamos continuamente en el laboratorio. Como es natural, con tanto uso en un lugar no demasiado limpio —se trata de identificación de helmintos en muestras fecales— el manual está cada vez peor, no solo por la edad, si no también por el uso. Es un libro descatalogado, así que no hay manera de volverlo a adquirir. Para no perderlo, se nos ha ocurrido escanearlo y conservar una versión en PDF en color. El equipamiento disponible para hacerlo es una Canon i-sensys MF421dw, que escanea de maravilla. Lo ideal sería recortar el libro y escanearlo desde el cargador automático con lo que obtendríamos directamente un PDF. Sin embargo, no queremos destruir aun más el manual, así que hubo que escanearlos página a página. Además, como el manual tiene un formato B5, aproximadamente, luego habrá que recortar, así que la idea es escanear en formato jpg para manipular las imágenes en bloque con imagemagick; bajo esas circunstancias, la impresora-escáner genera una imagen jpg de cada página. Extraídas todas las páginas nos enfrentamos a 178 imágenes jpg, con un tamaño de 2480x3504 píxeles, 300 puntos por pulgada. Va a ser más complejo que una simple conversión como la que hacíamos aquí. Problemas:
1. Ese tamaño se ajusta a un A4, sobra márgenes por todos los lados hasta acercarnos a la página original. Hay que recortar
2. La mitad están dadas la vuelta, ya que el escaneo se hace más fácilmente rotando las impares, debido a la estructura de la impresora. Hay que rotar la mitad de las páginas
3. Hay que convertir una serie de imágenes a un fichero PDF sin perder calidad


Primero hacemos una copia de las imágenes, por que escanear ha llevado el 97% del tiempo y no queremos repetir. Basándonos en imagemagick para hacer cambios en bloque, y por orden:

1. Recortar: cuando se escanea un libro no salen todas las páginas iguales. Sobre el A4 que escanea la máquina, unos van unos milímetros más hacía aquí o allá. Revisando varias muestras a lo largo de las imágenes con Gimp, nos queda un área de recorte de 1890x2815 para evitar perder información (aproximadamente 16x24 cm; más grande que un A4 2014 —148x210— y menos que un B5 —176x250—; seguramente en el año 1979 las ISOs no perseguían a las imprentas. Las medidas estándar se pueden comprobar aquí). Además hay que recortar 20 puntos por arriba y 20 por la izquierda. El comando para realizar esto en bloque es

convert *.JPG -crop 1890x2815+20+20 output.jpg

Este comando utiliza convert para recortar (crop) un rectángulo de 1890 píxeles de ancho y 2815 de alto, recortando 20 pixeles a la izquierda y 20 arriba. El JPG inicial va en mayúsculas por que la impresora extrae los ficheros con la extensión en mayúsculas.

2. Rotar: solo hay que rotar las páginas impares, así que las separé en un directorio diferente. Seguro que con un script de bash se podría evitar este paso, pero así somos más rápidos, efectivos —cumplimos el objetivo— y eficientes —se usan menos recursos, es decir, gastamos menos el cerebro—. Eso sí, hay que evitar un cambio de nombre, ya que es muy importante mantener el orden de los ficheros (output-0.jpg, output-1.jpg...). Comando:

convert *.jpg -rotate "180" -set filename:basename "%[basename]" "%[filename:basename].jpg"

De esta manera  -rotate "180" las gira 180º y -set filename:basename "%[basename]" "%[filename:basename].jpg hace que sobreescribamos los ficheros —por eso hacemos primero una copia de seguridad; nunca se sabe lo que puede pasar—.

3. Conversión de 178 ficheros jpg a un PDF:

convert *.jpg -density 300 -size 1890x2815 test.pdf

Inicialmente ejecuté así para conservar el tamaño, pero no es necesario; si ponemos solamente

convert *.jpg test.pdf

queda igual, ya que las imágenes ya tienen la densidad y resolución deseada.

Queda por decir que antes de ejecutar este último comando hay que corregir los nombres de los ficheros, por que imagemagick los ordenó al recortarlos como

output-0.jpg, 1, 2.... 10,11... 100, 101

y luego al aplicar la última conversión pone el 100 y siguientes antes que el 20, ya que ordena como cadema alfanumérica, sin considerar el valor real del número. En gnome no hay problema, ya que podemos seleccionar por bloques e introducir cambios por grupos, por ejemplo:


Y listo. Quedó perfecto como copia para el laboratorio. No puedo enseñar una copia, por que tiene derechos de autor y lo vamos a usar de manera interna como copia privada, para evitar que se destruya completamente el original, pero no se puede compartir. Sin embargo, para cuando sea necesario hacer una copia de seguridad de un manual con imágenes que se está dañando por su uso continuo, con un escáner que de calidad suficiente y convert de imagemagick lo arreglamos.
El siguiente paso sería intentar hacer OCR del texto, pero este manual es fundamentalmente foto, y no estoy seguro que sea necesario o que vaya a quedar mejor. Eso queda para un ejemplar que sea fundamentalmente texto.

miércoles, 5 de junio de 2019

DNIe en Fedora 30. Cada vez más sencillo

Hace algunos años decía en una entrada que la única necesidad de mantener un ordenador con Windows era poder utilizar los lectores de DNIe. Eso era hace mucho tiempo, y desde hace algunas distribuciones —ni me acuerdo de cuántas— tengo instalado el software necesario para poder utilizar el DNIe en Fedora. La guía más útil que he encontrado en estos días tras la instalación de Fedora 30 es la más reciente de atareao. Para nosotros los usuarios de Fedora tiene algún defectillo; atareao es usuario de Ubuntu (nada es perfecto) y en mi instalación de hoy he visto que algunos de los paquetes indicados no son necesarios, al menos en Fedora; aún así en una guía muy útil y bien documentada. Vamos a resumir los pasos necesarios para preparar el uso de un lector de DNIe (u otras tarjetas similares) en un ordenador con Fedora 30.
1. El software para Linux del DNIe lo bajamos del Cuerpo Nacional de Policía. La versión disponible en nuestro caso es un binario rpm para Fedora 28, pero funciona perfectamente.
Este software, tiene dependencias, en concreto señala:

error: Error de dependencias:
    pcsc-lite es necesario por libpkcs11-dnietif-1.5.0-1.x86_64

2. Eso nos lleva a la instalación de pcsc-lite, que en su instalación

su -c 'dnf install pcsc-lite'

instala también pcsc-lite-ccid

y luego


su -c 'dnf install libpkcs11-dnie-1.5.0-1.x86_64.rpm' # en el directorio donde lo tengáis


3. Conectamos el lector y hay que configurar Firefox. En Preferencias, Privacidad & Seguridad, Certificados, picamos en Dispositivos de seguridad.
Ahí deberemos cargar un módulo nuevo, con el nombre que nos parezca mejor y localizar el fichero libpkcs11-dnietif.so (en mi caso, instalada la versión de 64 bits, estaba en/usr/lib64; en la versión de 32 bits estará en /usr/lib)


Y listo. Podemos picar en iniciar sesión o simplemente introduciendo el DNI y picando en algún enlace que lo precise nos pide la palabra clave que protege el certificado.

Atareao indicaba la necesidad de instalar
pcsc-tools - en mi caso no ha sido necesario
pcscd - en Fedora no existe con ese nombre; es pcsc-lite
libccid - en Fedora es pcsc-lite-ccid
pinentry-gtk2 - en Fedora solo existe en repositorios pinentry-gtk y en mi caso ya estaba instalado previamente

Ha funcionado perfectamente en los dos lectores de los que dispongo, un SCM Microsystems SCR3310 v2.0 de los que regalaban con los primeros DNIs electrónicos y el C3PO LTC31 que pone mi Universidad a mi disposición.

Una necesidad menos para mantener Windows.