debian-pdfrw/examples/subset_booklets.py

62 lines
2.0 KiB
Python
Executable File

#!/usr/bin/env python
'''
usage: subset_booklets.py my.pdf
Creates subset_booklets.my.pdf
Pages organized in a form suitable for booklet printing, e.g.
to print 4 8.5x11 pages using a single 11x17 sheet (double-sided).
Instead of a large booklet, the pdf is divided into several mini
booklets. The reason is: professional printing works this way:
- Print all of several mini booklets(subsets of booklet);
- Saw each mini booklet individually;
- glue them all together;
- Insert the cover.
Take a look at http://www.wikihow.com/Bind-a-Book
'''
import sys
import os
import time
from pdfrw import PdfReader, PdfWriter, PageMerge
BOOKLET_SIZE = 20
START = time.time()
def fixpage(*pages):
result = PageMerge() + (x for x in pages if x is not None)
result[-1].x += result[0].w
return result.render()
INPFN, = sys.argv[1:]
OUTFN = 'booklet.' + os.path.basename(INPFN)
ALL_IPAGES = PdfReader(INPFN).pages
print 'The pdf file '+str(INPFN)+' has '+str(len(ALL_IPAGES))+' pages.'
#Make sure we have an even number
if len(ALL_IPAGES) & 1:
ALL_IPAGES.append(None)
print 'Inserting one more blank page to make pages number even.'
NUM_OF_ITER, ITERS_LEFT = divmod(len(ALL_IPAGES), BOOKLET_SIZE)
print 'Making '+str(NUM_OF_ITER)+' subbooklets of '+str(BOOKLET_SIZE)+' pages each.'
opages = []
for iteration in range(0, NUM_OF_ITER):
ipages = ALL_IPAGES[iteration*BOOKLET_SIZE:(iteration+1)*BOOKLET_SIZE]
while len(ipages) > 2:
opages.append(fixpage(ipages.pop(), ipages.pop(0)))
opages.append(fixpage(ipages.pop(0), ipages.pop()))
# Making one more subbooklet with the left pages
ipages = ALL_IPAGES[len(ALL_IPAGES)-ITERS_LEFT:len(ALL_IPAGES)]
while len(ipages) > 2:
opages.append(fixpage(ipages.pop(), ipages.pop(0)))
opages.append(fixpage(ipages.pop(0), ipages.pop()))
if len(ipages) >= 1:
opages.append(fixpage(ipages.pop(), ipages.pop(0)))
PdfWriter(OUTFN).addpages(opages).write()
print 'It took '+ str(round(time.time()-START, 2))+' seconds to make the pdf subbooklets changes.'