ricavare una copia di un libro in formato A6 da un foglio A4

per produrre una unica copia di un libro nel piccolo e comodo formato A6 (10,5×14,8 cm),non fascicolandolo in gruppetti di 4, 8 o più pagine da accostare, cucire e poi incollare, ma tagliando la mazzetta risultante dell’unica segnatura, due volte al centro (per il lungo e per il largo) per rilegarlo o farlo rilegare come meglio ci parrà, chi sia interessato, può seguire questa procedura, utilizzando soltanto software libero e un po’ d’ingegno

requisiti:

- una distribuzione linux comprensiva di
pdftk dalla versione 1.41 in poi (aventi l’opzione stamp)
Multivalent.jar (ultima versione free coi tool d’imposizione)

uso: nomescript file.pdf multivalentpath

dove nomescript è il nome che darete al file in cui salverete il codice che trovate in questa pagina (dopo averlo reso eseguibile) , file.pdf è il nome, (comprensivo dell’estensione del file) del vostro libretto pdf in formato A6 che intendete imposizionare in un foglio A4 per ricavare una copia e multivalentpath è il percorso relativo che punta a Multivalent.jar che avrete precedentenente scaricato

per poter imposizionare 4 pagine per facciata in un foglio A4, di un libretto in formato A6 – 10.5×14.8 – (il cui lato corto, la larghezza, è la metà del lato lungo di un A5 (14,8×21 cm) che a sua volta equivale alla metà di un A4 (21×29.7 cm)

serie ISO A - formati di carta standard da A4 ad A6

principi d’imposizione

per effettuare correttamente l’imposizione di 4 pagine per facciata, in un foglio A4 orientato in verticale, costituenti una singola copia di un libretto A6, occorre controllare che il numero complessivo di pagine da imposizionare, sia 8 od un suo multiplo intero

esempio: abbiamo un un libretto A6 di 16 pagine che vogliamo imposizionare, ricavandone una singola copia, in un foglio A6, o perché non abbiamo fogli A5 con cui potremmo imposizionarlo in quartini (booklet), o per risparmiare soldi quando andiamo a stampare il nostro libretto in una copisteria, potendo porre 4 pagine invece che 2 su di un foglio e quadrimezzando perciò la spesa (il nostro esempio ha solo 16 pagine, ma la logica è la stessa per libretti di 160, 320, 640 pagine, dove il risparmio è evidente, potendo avere 4 pagine su ogni facciata)

- esempio libretto A6 16 pagine

poiché il nostro libretto d’esempio ha 16 pagine, saranno 4 fogli A4 ad accoglierle (4 per facciata – fronte / retro), secondo questo ordine di imposizione

9u,8u,16,1,7u,10u,2,15,11u,6u,14,3,5u,12u,4,13
SPECIMEN-IMPOSIZIONE-A6-AFFIANCATE

dove u indica che la pagina deve essere ruotata di 180 gradi, per potersi trovarsi nella giusta posizione al momento del duplice taglio che produrra il libretto

anim-a6-ina4

l’ultima facciata dell’ultimo foglio A4, avrà, come si può vedere, le pagine 5 e 12 ruotate di 180 gradi e le pagine 4 e 13 orientate normalmente in basso.

si taglierà, dunque la mazzetta, con l’ultima pagina stampata impilata sulle altre, a metà nel senso della larghezza; quindi le due metà risultanti verranno richiuse l’una sull’altra, richiudendo la metà con le pagine capovolte su quella con le pagine disposte normalmente

last-imposed-page

ottenendo così, dopo il taglio e la sovrapposizione delle due metà, una mazzetta di fogli in formato A5 orizzontale, il primo dei quali conterrà le pagine 8; e 9 che nell’imposizione preliminare figuravano capovolte e che ora sono riportate nella giusta posizione. Questa mazzetta dovrà poi subire il secondo taglio, al centro

first-page-a6-ina4

dopodiché, come ultima operazione, il blocchetto di fogli risultanti di sinistra, verrà richiuso su quello di destra a formare finalmente il nostro libretto desiderato colle pagine in ordine sequenziale e contiguo da 1 a 16

anim-a6-sp--ina4

ma le pagine del nostro libretto, potrebbero non essere un numero multiplo intero di 8. In questo caso, occorrerà prima ggiungerne altre per raggiungere il multiplo intero di 8 più vicino 8 (es. se il nostro libretto ha 11 pagine, occorrerà aggiungerne altre 5 per arrivare a 16), o potrebbe anche darsi il caso che abbia meno di 8 pagine. Queste ventualità sono state previste e affrontate nella realizzazione dello script, che conteggia il numero di pagine del pdf e stabilisce se sono o non, 8 o meno, un suo multiplo intero o non, e in tali casi, aggiunge opportunamente il numero di pagine necessarie per poi procedere all’imposizione.

Immaginiamo ad esempio che le pagine siano 11. lo script aggiungerà le 5 che mancano, e produrrà questa sequenza d’imposizione:

9u,8u,16,1,7u,10u,2,15,11u,6u,14,3,5u,12u,4,13

in cui le pagine eccedenti il numero di quelle contenute nel nostro libretto originario (oltre la undicesima) saranno bianche
specimen-11-pages-A6

ma la corretta sequenza delle pagine non ne soffrirà, in quanto queste bianche aggiunte, si troveranno, dopo i due tagli e sovrapposizioni descritte sopra, alla fine del libro (i numeri in grigetto sono stati aggiunti solo a a scopo illustrativo e non compaiono ovviamente nei file imposizionati il cui numero di pagine non sia un multiplo intero di 8)

anim-11-sp

il file imposizionato risultante avrà il suffisso -up aggiunto al nomefile. Ad esempio il file A6.pdf diviene A6-up.pdf. Ho inoltre pensato che sarebbe stato utile, dopo l’imposizione, sovrapporre una griglia coi crocini di ritaglio, per guidare i tagli. Anche questa operazione è svolta in automatico dallo script

#!/bin/bash
#uno mio script per ricavarsi, da se stessi, 1 copia di un libro in formato A6 (10,5x14,8 cm) da un foglio A4, colle pagine organizzate in una segnatura unica da tagliare due volte (una nel senso della larghezza, l'altra della lunghezza), ottimizzando lo spazio ed evitando gli sprechi, per ottenere un libretto A6. Per utilizzo casalingo o professionale/industriale - (cavalca il cagnulin, usa Puppy Linux - http://dokupuppylinux.info - messaggio promozionale ;-)
#
############################
#
#      uso: nomescript file.pdf multivalentpath
#
############################
#
#
#
#
file=$1
multivalentpath=$2
pages="`pdftk $file dump_data | grep NumberOfPages | cut -d : -f2`"
echo $pages
halfpages="`echo -n $(( $pages / 2 ))`"
echo $halfpages
incr="$(echo "scale=0; $halfpages+1" |bc -l)"
dividedby4="$(echo "scale=0; $pages/8" |bc -l)"
lastupperpage="$(echo "scale=0; $pages-2" |bc -l)"
u="u"
#first case
h="$(pdfinfo $file | grep "Page size" | cut -d x -f1 | tr 'Page size:' ' ' | xargs)"
w="$(pdfinfo $file | grep "Page size" | cut -d x -f2  | tr 'pts' ' ' | xargs)"
echo $h
echo $w
doubleheight="$(echo "scale=0; $h * 2" |bc -l)"
doublewidth="$(echo "scale=0; $w * 2" |bc -l)"
echo $doubleheight
echo $doublewidth
if [ $(( $pages % 8 )) -eq 0 ]
then
echo " the file has already a number of pages multiple by eight"
sequence="$(for ((x=$halfpages, y=$incr, z=$pages, w=1;x>=4, y<=4, z>=2, w<=$lastupperpage;x--, y++, z--, w++)); do echo "$x$u $y$u;$z $w"; done | tr ";" "\n" | tr " " "," | awk -F "," '{ print $2 "," $1; getline; print; getline; print; getline; print $2 "," $1 }' | tr "\n" "," | cut -d "," -f 1-`seq -s, 1 $pages`)"
echo "sequence is $sequence"
java -cp "$multivalentpath"Multivalent.jar tool.pdf.Impose -verbose -dim 2x2 -paper "$doubleheight"x"$doublewidth"pt -layout "$sequence" $file

cat << EOF |uudecode
begin-base64 644 /tmp/grid.pdf
JVBERi0xLjMKJcfsj6IKNSAwIG9iago8PC9MZW5ndGggNiAwIFIvRmlsdGVy
IC9GbGF0ZURlY29kZT4+CnN0cmVhbQp4nFWPuw7CUAiGd56C2USEw+EUnsDZ
OhonbzHRwTr4+p5Wq20YgP//wuWBTFyQ+xiLwx1WbYOXJ+xQEhbcV/EIBV8g
eIWBxXYNSyfR5IIlXEkV7+CaSKz8lBtsIdydfAIFZyeTGbT7LslhjKIRhXJF
v20dSTJwg+CZKYWOPv+dJrNS9tEpVpTEP76lILfJHaYNk+TZHYJ9dBfIjRtF
/cQlSLH+SWzxy90JzgvYwBusBz89ZW5kc3RyZWFtCmVuZG9iago2IDAgb2Jq
CjE3OAplbmRvYmoKNCAwIG9iago8PC9UeXBlL1BhZ2UvTWVkaWFCb3ggWzAg
MCA1OTUgODQyXQovUGFyZW50IDMgMCBSCi9SZXNvdXJjZXM8PC9Qcm9jU2V0
Wy9QREZdCi9FeHRHU3RhdGUgOCAwIFIKPj4KL0NvbnRlbnRzIDUgMCBSCj4+
CmVuZG9iagozIDAgb2JqCjw8IC9UeXBlIC9QYWdlcyAvS2lkcyBbCjQgMCBS
Cl0gL0NvdW50IDEKPj4KZW5kb2JqCjEgMCBvYmoKPDwvVHlwZSAvQ2F0YWxv
ZyAvUGFnZXMgMyAwIFIKPj4KZW5kb2JqCjcgMCBvYmoKPDwvVHlwZS9FeHRH
U3RhdGUKL09QTSAxPj5lbmRvYmoKOCAwIG9iago8PC9SNwo3IDAgUj4+CmVu
ZG9iagoyIDAgb2JqCjw8L1Byb2R1Y2VyKEVTUCBHaG9zdHNjcmlwdCA4MTUu
MDQpCi9DcmVhdGlvbkRhdGUoRDoyMDEyMTIwMTIzNDMzNCkKL01vZERhdGUo
RDoyMDEyMTIwMTIzNDMzNCk+PmVuZG9iagp4cmVmCjAgOQowMDAwMDAwMDAw
IDY1NTM1IGYgCjAwMDAwMDA0NzIgMDAwMDAgbiAKMDAwMDAwMDU5MCAwMDAw
MCBuIAowMDAwMDAwNDEzIDAwMDAwIG4gCjAwMDAwMDAyODIgMDAwMDAgbiAK
MDAwMDAwMDAxNSAwMDAwMCBuIAowMDAwMDAwMjYzIDAwMDAwIG4gCjAwMDAw
MDA1MjAgMDAwMDAgbiAKMDAwMDAwMDU2MSAwMDAwMCBuIAp0cmFpbGVyCjw8
IC9TaXplIDkgL1Jvb3QgMSAwIFIgL0luZm8gMiAwIFIKL0lEIFso1xqpwgd/
HzDmRPwLQT3dEyko1xqpwgd/HzDmRPwLQT3dEyldCj4+CnN0YXJ0eHJlZgo3
MDEKJSVFT0YK
====
EOF

pdftk ${file%%.pdf}-up.pdf stamp /tmp/grid.pdf output gridded.pdf &&  mv gridded.pdf ${file%%.pdf}-up.pdf && echo "finished" && exit 0
else
echo "number of pages is not a multiple of 8, adding needed blank pages to complete the imposition sequence"
heightxwidth="`pdfinfo -box $file| grep MediaBox | cut -d : -f2 | awk '{print $3 FS $4}'`"
echo "%PDF-1.4
1 0 obj
<<
/CreationDate (D:20121202145344)
/Producer (text2pdf v1.1 (\251 Phil Smith, 1996))
/Title (blank.txt)
>>
endobj
2 0 obj
<<
/Type /Catalog
/Pages 3 0 R
>>
endobj
4 0 obj
<<
/Type /Font
/Subtype /Type1
/Name /F1
/BaseFont /Courier
>>
endobj
5 0 obj
<<
  /Font << /F1 4 0 R >>
  /ProcSet [ /PDF /Text ]
>>
endobj
6 0 obj
<<
/Type /Page
/Parent 3 0 R
/Resources 5 0 R
/Contents 7 0 R
>>
endobj
7 0 obj
<<
/Length 8 0 R
>>
stream
BT
/F1 10 Tf
1 0 0 1 50 798 Tm
12 TL
()'
ET
endstream
endobj
8 0 obj
44
endobj
3 0 obj
<<
/Type /Pages
/Count 1
/MediaBox [ 0 0 595 841 ]
/Kids [ 6 0 R ]
>>
endobj
xref
0 9
0000000000 65535 f 
0000000009 00000 n 
0000000132 00000 n 
0000000524 00000 n 
0000000181 00000 n 
0000000259 00000 n 
0000000330 00000 n 
0000000410 00000 n 
0000000506 00000 n 
trailer
<<
/Size 9
/Root 2 0 R
/Info 1 0 R
>>
startxref
609
%%EOF" | sed -e "s/595 841/$heightxwidth/g">/tmp/blank.pdf
fi
if [ $(( $pages / 8 )) -eq 0 ]
	then val0="`echo "scale=0; 8-$pages" | bc -l`"
else val1="`echo "scale=0; $pages/8" | bc -l`"; echo $val1
fi
if [ $(( $pages / 8 )) -eq 0 ] ; then echo "case 2: adding $val0 blank pages" ; sleep 1s && numpages=`for ((a=1; a <= $val0; a++)); do echo -n " B1 "; done` && pdftk A=$file B=/tmp/blank.pdf cat A $numpages output pagesadded.pdf && mv pagesadded.pdf $file
#new variable values for second case
unset pages
unset halfpages
unset incr
unset dividedby4
unset lastupperpage
pages="`pdftk $file dump_data | grep NumberOfPages | cut -d : -f2`"
halfpages="`echo -n $(( $pages / 2 ))`"
incr="$(echo "scale=0; $halfpages+1" |bc -l)"
dividedby4="$(echo "scale=0; $pages/8" |bc -l)"
lastupperpage="$(echo "scale=0; $pages-2" |bc -l)"

echo $pages

	else
val2="`let ADDITION=$val1+1; echo $ADDITION`"
val3="`let MULTIPLICATION=$val2*8; echo $MULTIPLICATION`"
val4="`echo "scale=0; $val3-$pages" |bc -l`"
echo " case 3: adding $val4 blank pages" ; sleep 1s


numpages="`for ((a=1; a <=  $val4; a++)); do echo -n " B1 "; done`"
echo $numpages
pdftk A=$file B=/tmp/blank.pdf cat A $numpages output pagesadded.pdf && mv pagesadded.pdf $file
fi

#new variable values for third case
unset pages
unset halfpages
unset incr
unset dividedby4
unset lastupperpage
pages="`pdftk $file dump_data | grep NumberOfPages | cut -d : -f2`"
halfpages="`echo -n $(( $pages / 2 ))`"
incr="$(echo "scale=0; $halfpages+1" |bc -l)"
dividedby4="$(echo "scale=0; $pages/8" |bc -l)"
lastupperpage="$(echo "scale=0; $pages-2" |bc -l)"

sequence="$(for ((x=$halfpages, y=$incr, z=$pages, w=1;x>=4, y<=4, z>=2, w<=$lastupperpage;x--, y++, z--, w++)); do echo "$x$u $y$u;$z $w"; done | tr ";" "\n" | tr " " "," | awk -F "," '{ print $2 "," $1; getline; print; getline; print; getline; print $2 "," $1 }' | tr "\n" ","  | cut -d "," -f 1-`seq -s, 1 $pages` | xargs)"
echo $sequence
java -cp "$multivalentpath"Multivalent.jar tool.pdf.Impose -verbose -dim 2x2 -paper "$doubleheight"x"$doublewidth"pt -layout "$sequence" $file

cat << EOF |uudecode
begin-base64 644 /tmp/grid.pdf
JVBERi0xLjMKJcfsj6IKNSAwIG9iago8PC9MZW5ndGggNiAwIFIvRmlsdGVy
IC9GbGF0ZURlY29kZT4+CnN0cmVhbQp4nFWPuw7CUAiGd56C2USEw+EUnsDZ
OhonbzHRwTr4+p5Wq20YgP//wuWBTFyQ+xiLwx1WbYOXJ+xQEhbcV/EIBV8g
eIWBxXYNSyfR5IIlXEkV7+CaSKz8lBtsIdydfAIFZyeTGbT7LslhjKIRhXJF
v20dSTJwg+CZKYWOPv+dJrNS9tEpVpTEP76lILfJHaYNk+TZHYJ9dBfIjRtF
/cQlSLH+SWzxy90JzgvYwBusBz89ZW5kc3RyZWFtCmVuZG9iago2IDAgb2Jq
CjE3OAplbmRvYmoKNCAwIG9iago8PC9UeXBlL1BhZ2UvTWVkaWFCb3ggWzAg
MCA1OTUgODQyXQovUGFyZW50IDMgMCBSCi9SZXNvdXJjZXM8PC9Qcm9jU2V0
Wy9QREZdCi9FeHRHU3RhdGUgOCAwIFIKPj4KL0NvbnRlbnRzIDUgMCBSCj4+
CmVuZG9iagozIDAgb2JqCjw8IC9UeXBlIC9QYWdlcyAvS2lkcyBbCjQgMCBS
Cl0gL0NvdW50IDEKPj4KZW5kb2JqCjEgMCBvYmoKPDwvVHlwZSAvQ2F0YWxv
ZyAvUGFnZXMgMyAwIFIKPj4KZW5kb2JqCjcgMCBvYmoKPDwvVHlwZS9FeHRH
U3RhdGUKL09QTSAxPj5lbmRvYmoKOCAwIG9iago8PC9SNwo3IDAgUj4+CmVu
ZG9iagoyIDAgb2JqCjw8L1Byb2R1Y2VyKEVTUCBHaG9zdHNjcmlwdCA4MTUu
MDQpCi9DcmVhdGlvbkRhdGUoRDoyMDEyMTIwMTIzNDMzNCkKL01vZERhdGUo
RDoyMDEyMTIwMTIzNDMzNCk+PmVuZG9iagp4cmVmCjAgOQowMDAwMDAwMDAw
IDY1NTM1IGYgCjAwMDAwMDA0NzIgMDAwMDAgbiAKMDAwMDAwMDU5MCAwMDAw
MCBuIAowMDAwMDAwNDEzIDAwMDAwIG4gCjAwMDAwMDAyODIgMDAwMDAgbiAK
MDAwMDAwMDAxNSAwMDAwMCBuIAowMDAwMDAwMjYzIDAwMDAwIG4gCjAwMDAw
MDA1MjAgMDAwMDAgbiAKMDAwMDAwMDU2MSAwMDAwMCBuIAp0cmFpbGVyCjw8
IC9TaXplIDkgL1Jvb3QgMSAwIFIgL0luZm8gMiAwIFIKL0lEIFso1xqpwgd/
HzDmRPwLQT3dEyko1xqpwgd/HzDmRPwLQT3dEyldCj4+CnN0YXJ0eHJlZgo3
MDEKJSVFT0YK
====
EOF

pdftk ${file%%.pdf}-up.pdf stamp /tmp/grid.pdf output gridded.pdf && mv gridded.pdf ${file%%.pdf}-up.pdf

echo "finished 2"
exit 0

About these ads

2 thoughts on “ricavare una copia di un libro in formato A6 da un foglio A4

  1. Ciao,
    grazie mille per la guida, sto impazzendo per cercare di impostare 16 pagine formato a6 in 2 fogli A4 stampati fronte retro!
    Purtroppo il tuo script mi restituisce un errore che non riesco a risolvere.
    Il primo era il seguente
    “cut: elenco di campi o byte non valido
    Usare «cut –help» per ulteriori informazioni.”
    Era dovuto al fatto che, alla linea 25, nel momento in cui passava xargs,+ trovava uno spazio iniziale. Ho risolto, molto grezzamenta, sostituendo la linea con questa sotto:
    w=”$(pdfinfo $file | grep “Page size” | tr -d ‘ ‘ | cut -d x -f2 | tr ‘pts ‘ ‘ ‘ | xargs)”
    Purtroppo anche dopo questa modifica lo script si blocca con il seguente errore
    ./impagina.sh: 35: ./impagina.sh: Syntax error: Bad for loop variable
    (impagina.sh è il nome con cui ho salvato il tuo script)
    Siccome non ho mai approfondito gli script in bash mi sono perso nel ciclo for e così ho lasciato perdere. Momentaneamente ho risolto con questo programma in java;
    http://jpdftweak.sourceforge.net/

    Michele

    • Ciao

      anche tu quindi come me ti sei trovato nell’esigenza di IMPOSIZIONARE 16 pagine di uno scritto di modo da poterle STAMPARE a LIBRETTO, piegando o tagliandole 2 volte, utilizzando senza sfrido, l’intera area di un foglio A4 (4 pagine per facciata).

      l’ambiente in cui il mio script è stato eleborato e testato è la bash 3.x, per l’esattezza la versione:

      GNU bash, version 3.00.16

      se mi indichi la versione della bash che usi correntemente (bash –help), posso provare a correggerlo per poterlo rendere funzionante anche in versioni più recenti della shell, anche perché altri script che posterò sono basati su principi simili

      Mi interessa anche sapere come hai ottenuto, avendo 16 pagine da imposizionare in formato A6, utilizzando due fogli A4, la sequenza:

      9u,8u,16,1,7u,10u,2,15,11u,6u,14,3,5u,12u,4,13

      (dove la u designa la rotazione di 180 gradi in senso orario)

      ovvero la formula usata in jpdftweak (che è un programma molto utile, ma che non uso tanto perché ha l’interfaccia grafica)

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...