dijous, 7 d’agost de 2014

Convertir un pdf en un llibre imprimible en A5 en GNU-Linux

Faig una petita pausa en les publicacions sobre arduino per comentar una sèrie de comandes que he fet servir força últimament.

Introducció

Fa poc, he tingut la necessitat d'imprimir alguns pdf Din-A4 en format de plec per tal de generar un dossier. Això, bàsicament, significa generar un nou pdf que, en imprimir-se a doble cara (pel cantó curt), genera un conjunt de full que si es dobleguen pel mig formen un dossier que es pot llegir com si d'un llibre (o llibreta) es tractés.

Per exemple, si tenim un pdf amb 4 fulls i imprimim a dos fulls per cara i doble cara, les pàgines ens quedaran impreses amb el següent ordre:

[1] [2] | [3] [4]

En canvi, si es converteix a plec, les pàgines queden ordenades de la següent manera:

[4] [1] | [2] [3]

D'aquesta manera, al doblegar el full en quedarà visible la pàgina [1] i, en obrir-la, tindrem la [2] a la esquerra i la [3] a la dreta per, finalment, arribar a la [4] en tancar el dossier.

Algunes impressores venen de base amb la possibilitat de fer plecs, però no es molt comú. Per un altre costat, quan estem imprimint moltes pàgines, un sol plec seria massa gruixut i es més convenient separar-ho en més d'un.  Òbviament, això implica enquadernar-ho després per unir els plecs, però això és un altre tema.

Gràcies a les eines pstools de GNU-Linux és relativament senzill d'aconseguir. Després de mirar un parell de guies (SonsoTux i La Espiral) he arribat a un shell script que fa justament això.

Arxiu .sh

 A continuació poso el codi i comento després com es fa servir (codi formatejat amb http://hilite.me/):


#!/bin/bash
if [ $# -eq 0 ]
 then
    echo "Sintaxis: $0 <arxiu pdf origen> [arxiu pdf desti] [nombre de fulls per plec]"
    exit
fi
echo "Convertint $1"
rm /tmp/duplex.ps
rm /tmp/duplex_a5.ps
pdftops $1 /tmp/duplex.ps
if [ $# -eq 3 ]
 then
    echo "plecs de $3 fulls"
    pags=$(($3*4))
    psbook -s$pags /tmp/duplex.ps | psnup -pa4 -2 > /tmp/duplex_a5.ps
 else
    psbook /tmp/duplex.ps | psnup -pa4 -2 > /tmp/duplex_a5.ps
fi
if [ $# -gt 1 ]
  then
    a=$2
else
    a=duplex_$1
fi
echo "El nou arxiu es diu $a"
ps2pdf /tmp/duplex_a5.ps $a
rm /tmp/duplex.ps
rm /tmp/duplex_a5.ps

El següent codi es pot guardar en un arxiu ".sh" per executar-lo en qualsevol moment.

Com fer-lo servir

Suposant que el guardem en un arxiu anomenat "plec.sh" per cridar-lo podem fer-ho de tres maneres:


./plec.sh arxiu_origen.pdf

Aquesta crida generarà un document anomenat "duplex_arxiu_origen.pdf" a punt per ser imprès en un únic plec. Alternativament també podem fer:


./plec.sh arxiu_origen.pdf arxiu_desti.pdf

Aquesta comanda és idèntica a l'anterior, però l'arxiu resultant es dirà "arxiu_desti.pdf". Finalment:


./plec.sh arxiu_origen.pdf arxiu_desti.pdf 8

Amb aquesta comanda no només generarem un arxiu anomenat "arxiu_desti.pdf", sinó que aquesta estarà preparat per imprimir-se en plecs de 8 fulls cadascún.

Breu explicació del funcionament

No entraré en  masses detalls. A nivell bàsic, la comanda fa els següents passos:
  1. Convertir el pdf original en un arxiu ps temporal (comanda "pdftops")
  2. Amb la comanda "psbook" reordena les pàgines en plecs (les pàgines per plec es determina amb el paràmetre "-s", si no s'especifica fa un únic plec)
  3. Un cop reordenat, la comanda "psnup -pa4 -2" converteix el pdf Din-A4 en un pdf amb dues pàgines Din-A5 per cara.
  4. Convertir el ps resultant en el pdf final (comanda "ps2pdf")

2 comentaris:

Michael P Schroeder ha dit...

De aquesta línia em sembla rareta la sintaxis: "psnup -pa4 -2". Mai es especifica que ho vols com a5.

No sé el que em perd, però com podries fer el mateix amb la diferencia de convertir-ho a b5?

Michi

Ferran Recio ha dit...

El tema de l'A5 és perquè psnup passa a dos pàgines per cara, així que l'ample de de la pàgina original A4 passa a ocupar la meitat de l'alt de la pàgina A4, per això podem dir que passa a A5. (A5 es la meitat de A4)

En quan al format B5, funcionaria si el document original fos en format B4. Però decididament no funcionaria per passar de A4 a B5 perquè la relació no és la mateixa. Potser alguna de les opcions de psnup ho permet.

En tot cas, hi ha eines en Linux per passar de estàndard A a estàndard B un PDF.