62 lines
2.0 KiB
Python
Executable File
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.'
|