Descargar libros de texto gratuitos o cualquier libro similar.

Me dio gusto ver que los libros de texto gratuitos están disponibles para su consulta en internet. En un principio creí que se podían descargar en formato PDF pero no existe esta opción.

Y luego me dije a mi mismo … Mi mismo ¿Y si descargas las páginas del libro y generas un PDF a partir de esas imágenes?

Así que puse manos a la obra y elaboré un programita en bash para descargar los libros de texto gratuitos o cualquier libro que se presente en un formato similar.

A descargar las imágenes del libro.

Lo primero es abrir un libro.

En este enlace están disponibles los libros de primaria:

Y en este otro los de secundaria:

Inspección de la página donde se encuentra el libro para obtener la carpeta donde se almacenan las imágenes.
De esta forma encontramos la carpeta en la que están almacenadas las imágenes del libro.

Para ejemplo práctico elegí el Libro de matemáticas de primer año. Si inspeccionamos la página del libro verán que las imágenes están almacenadas en la misma carpeta y las imágenes tienen como nombre un número de 3 dígitos de este modo.

https://libros.conaliteg.gob.mx/20/c/P1MAA/000.jpg

Así que es relativamente fácil hacer un script en Bash para que haga un barrido y con wget descargar una por una las páginas del libro.

#!/bin/bash

# Descargar libro de texto
for i in {000..300}
do
  wget https://libros.conaliteg.gob.mx/20/c/P1MAA/$i.jpg
done

En realidad no se la cantidad de hojas disponibles, así que elegí un número alto. Cuando el script empiece a informar errores en las descargas sabré que ya no hay más hojas disponibles.

Descargando ando …

Ahora a encuadernar las hojas sueltas con un PDF

El archivo PDF nos va a servir para guardar todas las imágenes en un solo archivo. Esto no es algo nuevo para mí, ya había hecho algo similar en Convertir todas las imágenes de un directorio a PDF.

gm convert *.jpg -adjoin -compress JPEG libro.pdf

Si agregamos esta instrucción al final del script en bash, todo se hace en una sola ejecución. Para este ejemplo, el archivo resultante quedó en 49.7 MB ¡Excelente!

El resultado final, un pdf que contiene todas las imágenes del libro.
Este es el resultado, un pdf que contiene todas las imágenes del libro.

Enseñándole a leer al PDF.

Todo estaría bien hasta este punto, si no fuera por un comentario en Twitter de Jorge Vázquez en el que menciona que el hace algo parecido con otras herramientas y además le aplica Reconocimiento óptico de caracteres (OCR).

Y no me quise quedar atrás. El OCR le agrega una capa de texto al PDF que facilita las búsquedas. Ahora necesitaba un programa que literalmente leyera todas las hojas del libro que acabo de crear y agregara esa información al archivo PDF.

Me encontré con un programa con el nombre más simpático que puede uno encontrar: ocrmypdf y hace exactamente lo que estaba buscando. Así que después de hacer esto:

ocrmypdf -l spa libro.pdf libro-con-ocr.pdf
Con el OCR se pueden hacer búsquedas o copiar textos.
Realizar búsquedas, copiar texto ¡No problema!

Ya tenía un PDF al que le podía hacer búsquedas o seleccionar y copiar textos, claro con algunas imprecisiones ya que el OCR no es perfecto.

Conclusiones.

El mismo procedimiento se puede aplicar a todos los libros de texto (o eso espero) o a cualquier libro con una presentación similar.

Espero que esta información para descargar libros de texto gratuitos les sea de utilidad, se que es algo técnico pero a lo mejor sirve de inspiración para algo más elaborado.

¡Bendita nueva normalidad!

Automatizando la apertura de Tilix al inicio de la sesión.

Tengo que reconocer que he escrito poco últimamente. Las actualizaciones de Manjaro se han completado sin problemas, mi equipo se ejecuta suavemente y de las principales noticias del software libre creo que hay otros sitios que se encargan de eso y lo hacen muy bien.

Es parte de mi rutina abrir una ventana de Tilix y por lo general abro 3 mosaicos, en uno esta htop para monitorear mis procesos, en otra mi herramienta de Python Ping para monitorear el funcionamiento de los equipos de la red y una más vacía para teclear los comandos que necesite.

Tilix con su mosaico de terminales.
Así es más o menos como me gusta el mosaico de terminales en Tilix.

Esto lo hacía todos los días, así que un buen dia, le invertí un poco de tiempo a la apertura de Tilix con esta configuración desde el inicio con aceptables resultados.

Crear un archivo Bash.

Lo primero que se me ocurrió fue hacer un archivo Bash que luego mandaría llamar desde el inicio de sesión de XFCE y así lo hice.

El archivo Bash no es complicado, le agregué algunas pausas, porque noté que si no lo hacía, en lugar de abrir una sola ventana con sus mosaicos correspondientes abría ventanas individuales.

#!/bin/bash
  
tilix -w /home/usuario/scripts/ -e ./python_ping3.py &
sleep 4
tilix -a session-add-right -x "htop" &
sleep 4
tilix -a session-add-down & 
sleep 4

En el código se pueden ver varios parámetros que se pueden utilizar al momento de ejecutar tilix, como establecer su posición o de una vez, ejecutar algún comando o script.

A veces me sigue mostrando un par de ventanas individuales, pero luego lo que hago es arrastrar las ventanas hacía la otra, hasta dejar el arreglo como me gusta.

Ejecutar el script al iniciar la sesión en XFCE.

Con el script listo, lo único que falta es que se ejecute al iniciar la sesión, para eso arrancamos el programa Sesión e inicio y lo agregamos a la lista.

Ejecutar el script en bash al iniciar la sesión.

Y con eso queda automatizada la tarea.

¡Saludos y hasta la próxima!

Buscar y eliminar archivos en una sola línea con find.

find es de esos comandos en linux que demuestran el poder de la terminal de Linux. Se que a veces no parece lo más intuitivo, pero si se domina correctamente, una sola línea en la terminal ahorra mucho tiempo.

Tratando de economizar algo de espacio en varios discos duros me encontré con esos archivitos Thumb.db. Estos archivos generados automáticamente (creo que desde Windows XP) contienen las miniaturas de las imágenes de una carpeta. Entiendo que tienen su propósito, pero en Linux no los ocupo.

Menciono a los archivos Thumb.db como ejemplo, pero este consejo se puede aplicar a cualquier grupo de archivos que pueda encontrar find.

Busca y encuentra.

No es mala idea primero buscar los archivos que se quieren eliminar, digo, solo por seguridad, no vaya a ser que en el primer intento se eliminen archivos que quieres conservar.

Supongamos que quieres buscar en una carpeta con Imágenes todos los archivos Thumbs.db, entonces tecleamos:

find /MiCarpetaConImagenes -name "Thumbs.db"

y te dará como resultado todos los archivos (incluyendo la ruta) que encontró.

/MiCarpetaConImagenes/Carpeta1/Thumbs.db
/MiCarpetaConImagenes/Carpeta2/Thumbs.db
/MiCarpetaConImagenes/Carpeta3/Thumbs.db
.
.
.
/MiCarpetaConImagenes/CarpetaN/Thumbs.db

Si todo parece correcto, entonces pasamos al siguiente paso.

Busca y destruye.

Si quieres eliminar los archivos que encontraste, entonces agrega esto al final de tu comando de búsqueda.

-exec rm -rf {} \;

De esa forma, la instrucción quedaría más o menos así:

find /MiCarpetaConImagenes -name "Thumbs.db" -exec rm -rf {} \;

Y si ejecutan la búsqueda nuevamente, lo más probable es que ya no arroje resultados, pues porque esos archivos ya fueron eliminados.

La opción delete.

En las versiones más modernas de find existe la opción -delete que borra los archivos que encuentra, pero si no funciona, pueden usar el consejo anterior.

Dicho esto, en lugar de agregar la opción -exec con sus argumentos, basta con incluir la opción -delete para borrar los archivos y si quieres ver cuales son los archivos eliminados añade la opción -print.

find /MiCarpetaConImagenes -name "Thumbs.db" -delete -print

Busca y actúa

Como verán find abre un montón de posibilidades. Se pueden buscar archivos para borrarlos, copiarlos, moverlos, jugar con expresiones regulares, bueno, lo que guste y mande. Hay una parte de búsqueda y otra de acción. Lo que quieran hacer con los archivos es posible.

Eliminar archivos de respaldo antiguos

Por ejemplo, se me ocurrió incluir en mi script de respaldos una rutina que elimine los archivos con una antigüedad mayor de 90 días.

find /CarpetaRespaldos/ -type f -mtime +90 -delete -print

El manual de find es muy completo, se los dejo para futuras referencias.

Imagen de David Pennington en Unsplash.