Proceso completo de digitalización de libros

Tengo un monton de libros digitales que he estado imprimiendo para encuadernar. El problema es que algunos de estos libros son digitalizaciones de baja calidad, donde ambas páginas aparecen juntas, o,libros en posición horizontal que no resulta cómodo de trabajar al momento de pasarlo a cuadernillo.

***Querida lectora o lector, debo advertirte que esta información ha ido evolucionando y pronto se creará una nueva entrada con el proceso terminado y explicado de mejor manera.  La razón para no eliminar o cambiar toda la entrada, es debido a que este post es un documento experimental, donde muestra el proceso de creación y aprendizaje.

Uno de los grandes problemas que veo en el mundo de la informática, es que no se enseña la forma de aprender, ver los errores y aciertos de otros, en la mayoría de los casos es muy nutritivo, espero de corazón que pienses similar y que esta información te pueda servir.***

<!–
se trabaja de esta forma para agregar indices
Alistar PDF’s

–>

Temas a Tratar

  1. Alistar PDF’s
  2. Procesamiento de imagenes
    1. Automatizacion
    2. Estudiemos el codigo
  3. Trabajando con Scantailor
  4. Procesamiento con OCR
    1. OCRFeeder
    2. Lios
  5. Otros links

Alistar PDF’s

Como decia, tengo un monton de PDF’s dando vueltas por allí y varios de ellos están con problemas para encuadernar o para ser liberados con el apellido de digital, para esto lo primero será seleccionar y juntar todos los PDF’s que serán trabajados en una carpeta, revisar que la extensión sea la misma para todos, cambiar los espacios en el nombre por un guión bajo (_) y por ultimo colocar cada PDF en una carpeta. Como las ultimas dos instrucciones son repetitivas, las vamos a automatizar con el siguiente codigo:

~$ rename -v 's/ /_/g' *pdf
~$ for file in *.pdf
>do
>mkdir ${file/pdf/}
>mv $file ${file/pdf/}
>done

El codigo rename y el loop for lo explico en esta otra entrada. Pero a grandes rasgos se podría traducir como:

Cambia de nombre de espacio a guion bajo y muestra el cambio en la pantalla.

por cada archivo que sea pdf, crea una carpeta con el mismo nombre, pero sin extension y después mueve el archivo a la carpeta recien creada.

Con esto podemos trabajar en cada uno de los archivos, lo que continua es el camino y aprendizaje que tuve para poder realizar el trabajo.

Procesamiento de imagenes

Para trabajar los archivos, necesito llevar los PDFs a imagenes, por lo mismo, lo primero que realicé, fue buscar información en la red, es así como llegué a este foro (convertir pdf a jpg), en él dan a conocer 2 herramientas: ImageMagick y pdfimages. El primero es un conjunto de herramientas, al realizar man imagemagick en la terminal, lo primero que nos muestra es:

ImageMagick – es un paquete de software gratuito para la creación, modificación y visualización de imágenes de mapa de bits.

De este paquete utilizaremos convert. La segunda herramienta es un poderoso script que analiza las imagenes dentro del pdf y luego las extrae en diferentes formatos (para saber más instalar pdfimages, manual1, manual2). Al buscar en su manual (man pdfimages) nos aparece:

pdfimages – Extractor de imágenes en formato PDF (version 3.03)

Siguiendo las recomendaciones del foro, utilice pdfimages para libros escaneados, con la siguiente estructura

pdfimages -j libro_completo.pdf nombre_imagenes

Notese que el nombre de las imagenes no contiene extensión, puesto que el -j le informa al programa que debe entregarlos en jpg. Para este tipo de documentos, viene muy bien este script, puesto que toda la página es una imagen, pero para libros que son una composición de imagenes, solo extrae las imagenes por separado y sin el texto.
Para casos como estos es recomendable usar convert con con sus diferentes opciones, pero el resultado no fue el esperado, las imagenes resultantes son de mala calidad. Probe comprimiendo la imagen con ps2pdf, pero no genera ningún cambio. Con un libro en específico no me generó un error al utilizar convert:

$~ convert Libro_problematico.pdf libro_imagen.jpg
como resultado me dio:
**** Error: stream operator isn't terminated by valid EOL. Output may be incorrect.

Al no poder trabajar con este pdf, generé un nuevo documento, es decir, imprimí el documento problemático en un nuevo pdf, la calidad es relativamente la misma, pero al momento de usar convert no me genera problemas… o eso creia.

Mientras buscaba soluciones, me recomendaron pasar las imagenes a la extensión .tif puesto que mantiene la resolución de la imagen, pero al escribir el código convert Libro_problematico.pdf libro_imagen.tif el resultado era una sola imagen con extensión .tif con la portada del documento.

Ahora estoy probando otra estrategia, dividir el libro en pdf’s de cada hoja, esto lo logré con la herrmaienta pdftk, con la opción burst que permite dividir las hojas, el código utilizado fue:

pdftk Libro_problematico.pdf burst.

En el foro del primer link, aparece una opción para generar un bucle o repetición con convert, al modificarlo para mi necesidad queda de la siguiente forma:

~$ for file in pg_0*.pdf
>do
>convert -interlace none -density 212x203 -quality 100 $file ${file/pdf/tif}
>done

La traducción del código sería:

Para los archivos escritos de esta forma
hacer
convertir con la opción ‘sin separación de rgb’ ‘tamaño de la imagen’ ‘a maxima calidad’ el $archivo y que salga con extensión tif

El resultado es una imagen por cada página.

Pd: Algunos libros necesitan mayor resolución (se ven mal), en esos casos el codigo en density cambia de “212×203” a “700×700”. Este cambio hace que cada imagen sea más grande y con ello pese más, convert no resiste archivos tan grandes, por ello debes ir probando.

Automatizacion

Como más arriba ya se crearon varias carpetas con libros en pdf, la idea ahora es automatizar el proceso para transformar a imagenes cada una de ellas. El proceso no fue tan fácil, con harta ayuda y a través de este codigo como base, se llegó a la siguiente estructura:

#!/bin/sh
for carpetas in ./*; do
tif=0
if [ -d $carpetas ]; then
echo "entrando a carpeta "$carpetas
cd $carpetas
if ls| grep -q -E [pP][dD][fF]; then
echo "se encontró pdf"
mkdir temp
for archivo in ./*; do
if file "$archivo" | grep -q TIFF; then
echo 'se han encontrado archivos tif. No se puede continuar en esta carpeta.';
rm -R temp/;
echo "volviendo a la capeta principal";
cd ..;
tif=1;
continue
else
if file "$archivo" | grep -q PDF; then
echo "burst a "$archivo;
pdftk $archivo burst output temp/pg_%04d.pdf; echo '- ok'
fi
fi
done;
if [ $tif = 0 ]; then
echo "convert (im)"
for archivo2 in ./temp/pg_*.pdf; do
if file "$archivo2" | grep -q PDF; then
convert -interlace none -density 212x203 -quality 100 $archivo2 $archivo2.tif
echo "- $archivo2"
fi
done;

echo "Guardando"
for archivo3 in ./temp/*.tif; do
echo "- $( basename -s .pdf.tif $archivo3 ).tif"
mv $archivo3 ./$( basename -s .pdf.tif $archivo3 ).tif
done
echo "Eliminando temporales";
rm -R temp/
echo "Listo!"
echo "volviendo a la capeta principal";
cd ..;
fi
else
echo "volviendo a la capeta principal";
cd ..
fi
fi
done

Estudiemos el codigo

#!/bin/sh
for carpetas in ./*; do
tif=0
if [ -d $carpetas ]; then
echo "entrando a carpeta "$carpetas
cd $carpetas
if ls| grep -q -E [pP][dD][fF]; then
echo "se encontró pdf"
mkdir temp

Lo primero le avisa al sistema que es un script.
Para cada archivo o directorios en la carpeta actual, hacer:
la constante tif igualarla a 0.
revisar si es directorio. En caso de no ser carpeta, el programa avanza con el siguiente registro. En caso de si ser directorio, el programa entra a la carpeta y revisa si hay pdfs (siendo valido que la extension este escrita con mayusculas, minusculas o combinacion de ellas).
En caso de no encontrar pdfs vuelve atrás y sigue con el siguiente registro.
En caso de encontrar pdfs, avisar que existen y crea la carpeta temp

for archivo in ./*; do
if file "$archivo" | grep -q TIFF; then
echo 'se han encontrado archivos tif. No se puede continuar en esta carpeta.';
rm -R temp/;
echo "volviendo a la capeta principal";
cd ..;
tif=1;
continue
else
if file "$archivo" | grep -q PDF; then
echo "burst a "$archivo;
pdftk $archivo burst output temp/pg_%04d.pdf; echo '- ok'
fi
fi
done;

posterior, revisa cada archivo y pregunta con el comando file si existe archivos tif. En caso de encontrar avisa la existencia, elimina la carpeta temp, vuelve a la carpeta principal, cambia la constante tif a 1 y sale del loop sin cerrar el programa.
En caso de no encontrar archivos TIFF, pregunta si el archivo seleccionado es pdf, en caso de ser lo corta con la opción burst de pdftk y lo deposita en la carpeta temp avisando que terminó.

if [ $tif = 0 ]; then
echo "convert (im)"
for archivo2 in ./temp/pg_*.pdf; do
if file "$archivo2" | grep -q PDF; then
convert -interlace none -density 212x203 -quality 100 $archivo2 $archivo2.tif
echo "- $archivo2"
fi
done;

echo "Guardando"
for archivo3 in ./temp/*.tif; do
echo "- $( basename -s .pdf.tif $archivo3 ).tif"
mv $archivo3 ./$( basename -s .pdf.tif $archivo3 ).tif
done
echo "Eliminando temporales";
rm -R temp/
echo "Listo!"
echo "volviendo a la capeta principal";
cd ..;
fi
else
echo "volviendo a la capeta principal";
cd ..
fi
fi
done

Si la constante tif es distinta a 0, significa que en la carpeta hay archivos con extensión TIFF, en caso contrario muestra en pantalla que empieza la conversión de imagen y utilizando el comando converten el loop for.
Terminado comienza el proceso de guardar.
Paraca cada archivo con extensión tif que se encuentre en la carpeta temp, mostrar en pantalla el nombre con extensión tif

Detengamonos un poco en este punto, si se percatan, en el comando convert en ningun momento se le quita la extension pdf, es decir queda pg_00xx.pdf.tif, es por ello que se utiliza el comando basename, que elimina directorios y suficos de los ficheros.

El siguiente comaando mv cambia de directorio y de extensión (con el comando filename) cada uno de los ficheros. ($archvio3 contiene el directorio, por eso se utiliza filename).
Después elimina la carpeta temp, vuelve a la carpeta principal y continua el loop.

 

Trabajando con Scantailor

Una vez trabajados los archivos y transformados a imagenes, se genera el proyecto en Scantailor. [Hasta el momento, el mejor tutorial que he encontrado está aquí, por lo que no veo necesidad de repetir algo que ya está bien explicado, sólo agrego esta entrada a la wiki de Scantailor.] El resultado queda en la carpeta “out” y el resultado son imágenes, por lo que hay que transformarlas a pdf para tener el libro final.

Para poder transformar las imagenes a pdf, utilizamos el comando convert tanto para convertir las imagenes a pdf, como comprimir el resultado a un archivo menos pesado:

convert pg_0*.tif +compress Nombre_libro.pdf

El resultado fue un error con el caché que no supe solucionar, por lo que probé el for ya utilizado con algunas variaciones:

~$ for file in pg_0*
>do
>convert $file ${file/tif/pdf}
>done

El resultado es un pdf por cada página, para poder unir los pdfs utilizamos el programa pdftk con la opción cat output para generar una única salida, el código queda de la siguiente manera:


~$ pdftk pg_0*.pdf cat output Nombre_libro.pdf

El resultado es el libro en pdf, esto no significa que esté digitalizado (que distinga las palabras) pero es un gran avance, aun queda generar el proceso de OCR (“Optical Character Recognition”) que permite que sobre la imagen quede reconocible el texto e imagenes. Y en caso de ser necesario, generar una compresión en el documento.

Hubo un caso que las imagenes no podian pasar a pdf, salia un problema de el paquete imagemagick debido al tamaño de la imagen, el problema se solucionó, bajando la resolución de salida del programa (de 600ppp a 300ppp)… para poder llegar a ese simple resultado, me embarré buscando por otros lados, es así como llegué a conocer identify un script del paquete de imagemagick, y file ambos comandos nos permiten saber las dimensiones de una imagen, la segunda opción (file) es más poderosa y útil. Por otro lado, descubrí mogrify, del mismo paquete de imagemagick, que trabaja similar a convert, con la diferencia que reemplaza el archivo original con el nuevo.

Así mismo, es importante tener en consideración las resoluciones de pantalla y de impresión, este es un tema que no domino y que se explica bien en estos link: resolución ideal para imagen impresa, tamaño de imagen, resolución y tamaño físico y Tamaño de hoja carta. El codigo utilizado para modificar la resolución fue:

~$ mogrify -resize 2551x3295 pg-0*.tif

Procesamiento con OCR

Estoy empezando a investigar sobre OCR y me genera curiosidad como se guarda la información y que formato utiliza para generar los datos. De los 6 programas que recomiendan para generar OCR, 2 quedan fuera debido a que no tienen soporte para español y 2 los deseché por no dar suficientes prestaciones, quedando LIOS (linux-intelligent-ocr-solution) y OCRFeeder programa de GNOME, ambos programas permiten generar el reconocimiento tanto a imagenes como a PDfs. Es decir, las dos son excelentes opciones para intentar meter mano.

OCRFeeder

Probaré instalando primero OCRFeeder, por que tienen un video que muestra muy poco y es el que menos me tinca.
El proceso de instalación es absurdamente fácil, lo peor es que no sale en el repositorio:

sudo apt install ocrfeeder

.
.
.
.
.
.

Lios

Aquí la instalación, en teoria, es más fácil, de la pagina de sourceforge se descarga el archivo .deb y se instala con el código:

$ sudo dpk -i archivo.deb

El problema es que la página está caida y no puedo descargarlo de esta forma, por ello me voy al repositorio en gitlab y reviso el README que me dice:

$ git clone https://gitlab.com/Nalin-x-Linux/lios-3.git
$ cd lios-3
$ sudo python3 setup.py install –install-data=/usr

La instalación ocurre sin problemas, los desarrolladores tienen una lista de videos para ayudar a los recien iniciados, no es de mucha ayuda, pero se nota más dedicación.

Continuará…

Otros links

forum.diybookscanner.org

This entry was posted in GNU/Linux. Bookmark the permalink.