40 lines
820 B
Python
Executable File
40 lines
820 B
Python
Executable File
#!/usr/bin/env python
|
|
|
|
'''
|
|
usage: booklet.py my.pdf
|
|
|
|
Creates booklet.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).
|
|
'''
|
|
|
|
import sys
|
|
import os
|
|
|
|
from pdfrw import PdfReader, PdfWriter, PageMerge
|
|
|
|
|
|
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)
|
|
ipages = PdfReader(inpfn).pages
|
|
|
|
# Make sure we have an even number
|
|
if len(ipages) & 1:
|
|
ipages.append(None)
|
|
|
|
opages = []
|
|
while len(ipages) > 2:
|
|
opages.append(fixpage(ipages.pop(), ipages.pop(0)))
|
|
opages.append(fixpage(ipages.pop(0), ipages.pop()))
|
|
|
|
opages += ipages
|
|
|
|
PdfWriter().addpages(opages).write(outfn)
|