2021/09/05

Jugando con PDFs

Hace mucho mucho tiempo, bue, ni tanto, 2017, resolví un problema, relacionado con la impresión de documentos, en particular de pdfs, dos páginas por hoja en modo landscape y doble faz.

¿Cuál era el problema? Que al doblar la hoja al medio se te rompe el orden de las hojas. 

cuadernillo
cuadernillo
 

Para resolverlo escribí un programita en C para que, dada una cantidad de hojas a imprimir y un comienzo, genere la secuencia que luego te sirve para usar en la impresora o en un convertidor de pdfs.

Por ejemplo, si querés imprimir las ocho primeras páginas en dos hojas, la secuencia es 8,1,2,7,6,3,4,5

 

Páginas por hoja y orientación
Páginas por hoja y orientación
 

Si quisieras saltearte las cuatro primeras y dárselo a la impresora, a la que le dijiste que imprima en doble faz y dos páginas por hoja: 12,5,6,11,10,7,8,9

 

Páginas y orden
Páginas y orden
 

Este recurso medio que ha dejado de servirme, en parte por imprimo cada vez menos y en parte por que veo cada vez menos...

Claramente esto sólo sirve para impresiones, carece completamente de utilidad en un pdf para leer, pero es útil quizás tener un pdf listo para imprimir en estas condiciones. Se puede usar la impresión a pdf o convert y un poco de bash:

for PAGE in 8 1 2 7 6 3 4 5; do
   ORDER="ORDER page_$PAGE.png "
done
convert $ORDER output.pdf

Ojo con que no hayan espacios en los nombres de las imágenes.

No generalicé el problema a imprimir en una o más de dos hojas porque... no recuerdo, quedó ahí, la lógica hardcodeada.


Hace menos tiempo, a ciertas personas relacionadas, les ha ocurrido que han necesitado imprimir, fundamentalmente apuntes fotocopiados que vienen de a dos páginas por hoja y desean tenerlo en una página por hoja, ya sea impreso o en un pdf, más cuando hay rotaciones. Lo contrario a lo anterior.

Para ello elaboré unos scripts utilizando pdf2ppm que en Linux Mint/Ubuntu está provisto por poppler-utils. Lo que hace pdf2ppm es extraer de un pdf cada página pedida a una imagen png, tanto entera como un región.

La idea entonces es tomar una hoja, obtener las medidas y luego partir por la mitad, ya sea vertical u horizontal según la orientación del documento de entrada. Luego ir extrayendo de cada página cada hoja.

Si mirás los scripts en github, podrás apreciar que hay dos extracciones:

# extract half of the pages
pdftoppm -x 0 -y 0 -W "$WIDTH" -H "$HEIGHT" -png input.pdf page0

# extract the other half
pdftoppm -x "$WIDTH" -y 0 -W "$WIDTH" -H "$HEIGHT" -png input.pdf page1


Luego, podría haber alguna rotación, para ello hay que agregar  

# rotate pages
DIR=90
for PNG in $(ls *png | sort  ); do
  convert -rotate $DIR $PNG $PNG
  DIR=$(( $DIR * -1 ))
done

No llega a ser una FSM, se arregla con el truquito de multiplicar por -1. Fijate que el orden de la salida del ls es el natural, a diferencia de la generación del orden:

INPUT_PNG=$(ls *png | sort -t "-" -k 2 )

Esto es por que hay dos lotes de páginas, el orden está dado por los números a la derecha del "-".

Relacionado con el cuardernillo, hay que reordenar. Lo más sencillo que se me ocurrió fué renombrar los archivos, esta vez sí usando una FSM:

# resort pages
STATE="invert0"
for PNG in $(ls *png | sort -t "-" -k 2 ); do
  case $STATE in
    "invert0")
      mv $PNG tmp
      PREV="$PNG"
      STATE="invert1"
    ;;
    "invert1")
      mv "$PNG" "$PREV"
      mv tmp "$PNG"
      STATE="skip0"
    ;;
    "skip0")
      STATE="skip1"
    ;;
    "skip1")
      STATE="invert0"
    ;;
  esac
done

Y eso es todo, si surge algúna nueva complicación, cuando la resuelva la agregaré al código. Te anticipo que cualquier complicación debe ser regular, esto es, si hay páginas rotadas arbitrariamente la resolución deberá ser manual.




No hay comentarios:

Publicar un comentario