57 lines
1.3 KiB
Python
Executable File
57 lines
1.3 KiB
Python
Executable File
#!/usr/bin/env python
|
|
|
|
'''
|
|
usage: booklet.py [-p] 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).
|
|
|
|
The output would be using the same type of sheet
|
|
and you can get up to 3 blank sides if -p is enabled.
|
|
|
|
Otherwise the two sides in the middle will be in original page size
|
|
and you can have 1 blank sides at most.
|
|
|
|
'''
|
|
|
|
import os
|
|
import argparse
|
|
|
|
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()
|
|
|
|
|
|
parser = argparse.ArgumentParser()
|
|
parser.add_argument("input", help="Input pdf file name")
|
|
parser.add_argument("-p", "--padding", action = "store_true",
|
|
help="Padding the document so that all pages use the same type of sheet")
|
|
args = parser.parse_args()
|
|
|
|
inpfn = args.input
|
|
outfn = 'booklet.' + os.path.basename(inpfn)
|
|
ipages = PdfReader(inpfn).pages
|
|
|
|
if args.padding:
|
|
pad_to = 4
|
|
else:
|
|
pad_to = 2
|
|
|
|
# Make sure we have a correct number of sides
|
|
ipages += [None]*(-len(ipages)%pad_to)
|
|
|
|
opages = []
|
|
while len(ipages) > 2:
|
|
opages.append(fixpage(ipages.pop(), ipages.pop(0)))
|
|
opages.append(fixpage(ipages.pop(0), ipages.pop()))
|
|
|
|
opages += ipages
|
|
|
|
PdfWriter(outfn).addpages(opages).write()
|