#!/usr/bin/env python3 import argparse import os.path import subprocess SIGNATURE = ( 15, 0, 13, 2, 1, 14, 3, 12, 11, 4, 9, 6, 5, 10, 7, 8, ) SIGNATURE_32 = ( 15, 0, 31, 16, 1, 14, 17, 30, 13, 2, 29, 18, 3, 12, 19, 28, 11, 4, 27, 20, 5, 10, 21, 26, 9, 6, 25, 22, 7, 8, 23, 24, ) SIGNATURE_64 = ( 63, 0, 61, 2, 1, 62, 3, 60, 59, 4, 57, 6, 5, 58, 7, 56, 55, 8, 53, 10, 9, 54, 11, 52, 51, 12, 49, 14, 13, 50, 15, 48, 47, 16, 45, 18, 17, 46, 19, 44, 43, 20, 41, 22, 21, 42, 23, 40, 39, 24, 37, 26, 25, 38, 27, 36, 35, 28, 33, 30, 29, 34, 31, 32, ) def get_parser(): parser = argparse.ArgumentParser() parser.add_argument( "--file", '-f', help="Name of the PDF file", ) parser.add_argument( "--double", "-d", action="store_true", help="Put two signatures on 4 A4 sheet. Pages will be a " "multiple of 32", ) parser.add_argument( "--quadruple", "-q", action="store_true", help="Put four signatures on 8 A4 sheet. Pages will be a " "multiple of 64", ) parser.add_argument( "pagespec", help="Page selection. At the moment only '-' is supported" ) return parser def main(): parser = get_parser() args = parser.parse_args() pspec = args.pagespec.split('-') try: start = int(pspec[0]) end = int(pspec[1]) except ValueError: parser.print_usage() except IndexError: parser.print_usage() if args.double: signature = SIGNATURE_32 elif args.quadruple: signature = SIGNATURE_64 else: signature = SIGNATURE sig_len = len(signature) pages = [str(i) for i in range(start, end+1)] if len(pages) % sig_len != 0: empty = sig_len - len(pages) % sig_len pages = pages + ["{}"] * empty rearranged = [] while pages: for i in signature: rearranged.append(pages[i]) pages = pages[sig_len:] base, ext = os.path.splitext(args.file) out_fname = base + '-book' + ext subprocess.run([ 'pdfjam', '--nup', '2x2', #'--no-tidy', '-o', out_fname, args.file, ','.join(rearranged) ]) if __name__ == "__main__": main()