Imprimir archivos en orden con lpr y Ruby

El otro día me llegó un problema interesante, tenía una colección de archivos en formato PDF que se tenían que imprimir en orden.

Bueno, al principio no sabía que tenía que ser en orden y para imprimir todos los archivos de una capeta sólo use el comando:

lpr *.pdf

Y cumplía con el objetivo de imprimir todos los archivos PDF de la carpeta, pero luego resultó que el orden de impresión era importante (para buscarlos posteriormente) y es donde el problema se complicó un poco, porque hacerlo a mano simplemente no era una opción ¡Son demasiados!.

Orden alfábetico o númerico.

El problema es que una cosa es el orden alfabético y otro muy distinto el orden numérico.

Por ejemplo, tengo esta colección de archivos:

  • 1.pdf
  • 521.pdf
  • 002.pdf
  • 11.pdf
  • 0850.pdf

El resultado de un ordenamiento estándar sería el siguiente:

archivos = ["1.pdf","521.pdf","002.pdf","11.pdf","0850.pdf"]    
puts archivos.sort
  • 002.pdf
  • 0850.pdf
  • 1.pdf
  • 11.pdf
  • 521.pdf
orden alfanumerico en ruby
Fig.1 Ejemplo de un ordenamiento estándar en Ruby.

Como pueden ver, están bien ordenados, pero de manera alfanúmerica. Es una cuestión de interpretación de los datos y generalmente el nombre de un archivo se considera un dato alfanúmerico.

Y el caso se complica aún más porque la longitud del nombre del archivo no es la misma.

Aunque es correcto no es el efecto que deseo.

La solución: Naturally

Buscando en Google dí con Naturally una gema de Ruby que se encarga de interpretar de una forma más humana este tipo de ordenamientos númericos.

Para usar Naturally primero hay que instalarlo.

gem install naturally

Y este es un ejemplo de su uso:

El resultado del ordenamiento es:

  • 1.pdf
  • 002.pdf
  • 11.pdf
  • 521.pdf
  • 0850.pdf
Resultado del ordenamiento usando Naturally.
Fig. 2. Resultado del ordenamiento usando Naturally.

Y ahora si, el orden es el que precisamente estoy buscando ¡Yeeeeeei!

A imprimir.

A estas alturas ya estaba muy cerca de la solución, ahora solo tenía que desarrollar un programa en Ruby que leyera todos los archivos PDF de una carpeta, los ordenara de forma natural y mandar imprimir cada archivo.

Al ejecutar el script empieza la impresión de los archivos PDF en la impresora predeterminada uno por uno, pero ahora en el orden que quiero.

Espero que este artículo les sea de utilidad. Todavía intuyo que es posible hacerlo en bash, pero como ya lo resolví este problema utilizando Ruby y funciona tan bien que voy a dar por cerrado el tema.

Ahora con Bash

Gracias a este comentario en google plus de Rodolfo Zola que me aclaró como resolver el mismo problema usando bash y el comando sort.

Y funciona perfectamente, sólo lo modifiqué un poco para que solamente imprimiera archivos pdf.

Actualización.

Al final me decanté por usar el script en bash, le agregué una pausa de 8 segundos (sleep 8) para no saturar la cola de impresión de la impresora de red a la que mando el trabajo y como cereza del pastel, se pueden fijar que ahora el comando lpr especifica que la impresión será en hoja tamaño carta y además hiciera un ajuste en el tamaño de la impresión con la opción fit-to-page.

Para finalizar copié el archivo printsort.sh a la carpeta /usr/bin para que lo pueda llamar a ejecución desde cualquier ubicación de mi sistema.

¡Me encantaría saber que opinas!

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.