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.

No hay comentarios:

Publicar un comentario