Script que imprimeix un PDF a quatre planes per full


Nosaltres, ben mirat, no som més que paraules.

         MIQUEL MARTÍ I POL

Advertència

Aquest script no té cap garantia: si el feu servir, n’assumiu plenament el risc (ONLY AT YOUR RISK).

Introducció

Quan tractava d’imprimir un document PDF per les dues cares pel vell procediment d’imprimir primer les pàgines parelles en ordre invers i, després, les senars, em vaig adonar que Evince no m’ho permetia. Vaig buscar, aleshores, la solució que em va semblar més fàcil i em vaig instal·lar l’Acroread; aquest, des del menú d’impressió, permetia fer el que jo volia… en teoria, només, perquè, en realitat, no reeixia mai a imprimir el grup de pàgines en ordre invers.

Com de costum, ho vaig consultar a Google, i aquest em va trobar un petit article on s’explicava com aconseguir el que jo volia amb un paquet d’utilitats anomentat PSUTILS. Després d’instal·lar-me aquest paquet i de fer-hi un parell d’assajos, vaig comprendre que aquella era la solució més directa al meu problema i que, a més, superava les meues expectatives. I vaig decidir transformar la solució en un script que us presente a continuació.

Script: pdf4cares


#!/bin/bash

################################################################
# #
# Script: pdf4cares #
# Versió i data: 0.40 2007-02-06 #
# Autor: Giorgio Grappa #
# #
# Finalitat: Imprimir un arxiu PDF a dues cares per pàgina, #
# per les dues cares, en una impressora que només #
# imprimeix per una cara. #
# Sintaxi: pdf4cares #
# Requisits: psutils instal·lat; treballar des del mateix #
# directori en què es troba l'arxiu PDF a imprimir. #
# Valor retornat: cap. #
# #
################################################################


################################################################
# #
# SEGMENT PRINCIPAL #
# #
################################################################

# [1]
# Llista els PDF en el directori de treball
# o atura l'script si no n'hi ha cap
total_PDFs=`ls | grep .pdf | wc -l`
echo

if [ "$total_PDFs" -gt 0 ] # Si hi ha arxius PDF en aquest directori,
then # en fa un lista;
echo " Arxius PDF en aquest directori: " $total_PDFs
echo
ls *.pdf
else # En cas contrari, emet un missatge d'avís
# i atura l'script.
echo " No hi ha cap arxiu PDF en aquest directori."
echo " Fi del procés."
echo
exit
fi
echo

# [2]
# Demana i llegeix el nom de l'arxiu a imprimir
echo
echo " Quin arxiu voleu imprimir a 2 planes per cara?"
echo " (SENSE l'extensió .pdf)?"
read ARXIU
echo

# [3]
# Genera el nom de l'arxiu .pdf
ARXIU_PDF=$ARXIU.pdf

# [4]
# Comprova si existeix l'arxiu a imprimir
if [ ! -f "$ARXIU_PDF" ] ; then
echo
echo "ATENCIÓ: l'arxiu $ARXIU_PDF no existeix."
echo "Fi del procès."
exit
fi

# [5]
# Genera els noms dels arxius auxiliars
ARXIU_PS=/tmp/$ARXIU.ps
ARXIU_2_PLANES_PER_PAGINA=/tmp/$ARXIU.2ppp.ps
SERIE_PARELLS=/tmp/$ARXIU.2ppp_parells.ps
SERIE_SENARS=/tmp/$ARXIU.2ppp_senars.ps


# [6]
#
# GENERA ELS ARXIUS AUXILIARS
#

# [6.1]
# Transforma l'arxiu PDF al format PostScript
pdf2ps $ARXIU_PDF $ARXIU_PS

# [6.2]
# Genera un document que té dues planes per pàgina
psnup -2 $ARXIU_PS $ARXIU_2_PLANES_PER_PAGINA

# [6.3]
# Separa les pàgines parelles (-e) i i n'inverteix l'ordre (-r)
psselect -e -r $ARXIU_2_PLANES_PER_PAGINA $SERIE_PARELLS

# [6.4]
# Separa les pàgines senars (-o)
psselect -o $ARXIU_2_PLANES_PER_PAGINA $SERIE_SENARS


# [7]
#
# IMPRIMEIX EL TREBALL
#

# [7.1]
# Imprimeix les pàgines parelles
lp $SERIE_PARELLS

# [7.2]
# Demana donar la volta als fulls
echo
echo "####################################################################"
echo
echo " EN ACABAR LA PRIMERA SÈRIE,"
echo " TORNEU A POSAR ELS FULLS EN LA SAFATA DE LA IMPRESSORA"
echo " I PREMEU ENTER"
echo
echo "####################################################################"
echo
read Seguir

# [7.3]
# Imprimeix les pàgines senars
lp $SERIE_SENARS

# [8]
# Esborra els arxius .ps auxiliars
for Arxiu in "$ARXIU_PS" "$ARXIU_2_PLANES_PER_PAGINA" "$SERIE_PARELLS" "$SERIE_SENARS"; do
rm $Arxiu
done

Instal·lació de l’script

Abans poder fer servir l’script, necessitem, com ja hem apuntat, instal·lar el paquet PSUTILS, a no ser que ja el tinguem en el nostre sistema. Si aquest no és el cas, l’instal·larem amb:

sudo apt-get update
sudo apt-get install psutils

Després, copiarem l’script a un arxiu que anomenarem “pdf4cares” i el guardarem en un directori que es trobe definit en el PATH del sistema (suggeriment: ~/bin o ~/scripts, si els teniu definits, o algun lloc similar). A continuació, donarem a aquest arxiu permís d’execució:

sudo chmod a+x pdf4cares

I ara ja estem en condicions de fer servir el nostre script. Com?

Ús de l’script

  1. Comproveu que la impressora està preparada.
  2. Entreu en consola i situeu-vos en el directori on es troba l’arxiu PDF que voleu imprimir.
  3. Executeu l’scritp sense cap argument: pdf4cares.
  4. Apareixerà en pantalla un llistat amb els arxius PDF presents en aquell directori, i l’script us demanarà que introduiu el nom del que voleu imprimir. Si no hi hagués cap arxiu PDF en el directori, l’script emetria un avís i s’aturaria.
  5. Escriviu el nom de l’arxiu a imprimir, però SENSE l’extensió (sense el “.pdf”), i premeu ENTER.
  6. Després de comprovar que l’arxiu existeix, l’script prepara una sèrie d’arxius intermedis (cosa d’uns segons) i comença a imprimir la primera sèrie de planes.
  7. En acabar d’imprimir-se la primera sèrie, agafeu el bloc de fulls i el torneu a posar a la safata de la impressora. Fet açò, premeu ENTER per a continuar el procés.

ATENCIÓ

Aquest script ha estat provat només amb una impressora (la HP LaserJet 1010, per a ser exactes): si manera d’agafar els fulls, escriure’ls i dipositar-los a la safata no són les mateixes, el resultat final podria ser incorrecte (les pàgines a cada cara del full podrien no correspondre’s). En aquest cas, hauríeu d’adaptar alguns passos a la secció “# GENERA ELS ARXIUS AUXILIARS”, o, probablement, a la secció “# IMPRIMEIX EL TREBALL”. Llegiu l’apartat següent per comprende’n el perquè i el com.

Breu descripció del funcionament intern de l’script

Per tal de facilitar-ne la descripció, he dividit l’scritp en 8 seccions, numerades de [1] a [8] (i que, en una versió posterior, m’agradaria transformar en funcions… però encara no ho sé fer!).

Secció [1] Comprova l’existència d’arxius PDF en el directori de treball. Si no n’hi ha cap, emet un missatge d’avís i atura l’script; en cas contrari, els llista.

Secció [2] Demana el nom de l’arxiu que volem imprimir i el guarda a la variable ARXIU. És molt important escriure’l sense l’extensió PDF, ja que aquesta s’afegirà automàticament en el següent pas per comprovar l’existència de l’arxiu i, si hem introduït l’extensió, no es reconeixerà l’arxiu.

Secció [3] Genera el nom complet de l’arxiu, afegint-li l’extensió .pdf, i el guarda a ARXIU_PDF.

Secció [4] Comprova que l’arxiu a imprimir (ARXIU_PDF) existeix en el directori de treball: si no existeix, atura l’scritp.

Secció [5] Genera els noms dels arxius auxiliars que es faran servir. Aquests estaran en format PostScritp (que perment la seua manipulació molt còmodament) i es desaran al directori /tmp (per tal d’evitar possibles problemes amb els permisos d’escriptura en el directori on es troba el PDF original); seran esborrats després d’acabar d’imprimir.

Secció [6] Aquesta secció és el cor de l’script. Fa servir tres programes del paquet PSUTILS per tal de generals els arxius auxiliars: crea una versió PostScript de l’arxiu a imprimir amb pdf2ps(i la guarda a ARXIU_PS); a partir de l’anterior, crea, amb psnup, una versió que presenta dues planes @mdash;reduïdes@mdash; en cada cara (ARXIU_2_PLANES_PER_PAGINA); finalment, amb psselect, separa en dos arxius distins les planes parelles @mdash;en ordre invers@mdash; i les senars (SERIE_PARELLS i SERIE_SENARS).

Secció [7] Imprimeix la sèrie de pàgines parelles, demana que tornem a posar els full en la safata de la impressora i, finalment, imprimeix la sèrie de pàgines senars.

Secció [8] Esborra els arxius auxiliars que havia creat a /tmp.

Com he dit abans, si la vostra impressora treballa en una manera diferent, podríeu necessitar fer alguns canvis. El més senzill seria canviar l’ordre en què s’imprimeixen les dues parts i fer que comence per les senars; només us caldrà anar a la secció [7] i canviar l’ordre en què es troben les seccions [7.1] i [7.3]

Si això no funciona, torneu a deixar-ho en l’ordre original i fixeu-vos en la secció [6]. En els punts [6.3] i [6.4] tenim l’ordre psselect amb diferents opcions; doncs, bé, esborreu l’opció -r del punt [6.3] i passeu-la al psselect del punt [6.4]. Si encara no queda perfecte, proveu a tornar a canviar l’ordre d’impressió, tal i com apareix en el paràgraf anterior.

Si amb cap dels canvis anteriors aconseguiu el resultat esperat, ho sent, però ja no se m’acut res més. De fet, l’ordre que vaig trobar en l’article que vaig consultar no funcionava bé en la meua impressora i el vaig haver de canviar per adaptar-lo; per això crec que alguna de les combinacions descrites us hauria de funcionar.

Anuncis

Quant a Giorgio Grappa

Algú fa cas de les coses que els blocaires escriuen sobre ells mateixos? El comentari més sincer que he llegit als "about me" és aquell de: "si vols saber res de mi, pots llegir el meu bloc."
Aquesta entrada ha esta publicada en Uncategorized. Afegeix a les adreces d'interès l'enllaç permanent.

Deixa un comentari

Fill in your details below or click an icon to log in:

WordPress.com Logo

Esteu comentant fent servir el compte WordPress.com. Log Out / Canvia )

Twitter picture

Esteu comentant fent servir el compte Twitter. Log Out / Canvia )

Facebook photo

Esteu comentant fent servir el compte Facebook. Log Out / Canvia )

Google+ photo

Esteu comentant fent servir el compte Google+. Log Out / Canvia )

Connecting to %s