#!/usr/bin/env python3 import os import sys from math import ceil from PyPDF2 import PdfReader, PdfWriter def main(): def print_help(): print('bookletify') print() print('USAGE') print(' bookletify [OPTIONS] file') print() print('DESCRIPTION') print(' Rearranges the pages of a pdf in order to print it as is (double') print(' sided, flipped on the short edge) so that you can take it, cut ') print(' in half and close it like you would do with a book. The result ') print(' will be the original pdf in the correct order, with the size of ') print(' half a page') print(' Especially useful to print pdfs to A5 size on A4 paper') print() print('OPTIONS') print(' -h print help') print(' -q do not print anything to stdout') def parse_argv(): opts = { "h": False, "q": False, } filename = None if len(sys.argv) < 2: opts["h"] = True for arg in sys.argv[1:]: if arg.startswith('-'): for opt in opts: if opt in arg: opts[opt] = True elif not filename: filename = arg return (opts, filename) def info(text = '', end='\n'): if not opts["q"]: print(text, end=end) def prog(curr, max_val): # Overrides the current terminal line with a progressbar filled at curr/max_val perc = float(curr) / float(max_val) remaining = f'{curr:{len(str(max_val))}d}/{max_val}' (cols, _) = os.get_terminal_size() max_width = cols - len(remaining) - 3 size = min(max_width, max_val, 80) bar = int(perc * size) end = '\n' if curr == max_val else '' info("\r|" + ("\u2588" * bar) + "_" * (size - bar) + "| " + remaining, end) (opts, input_name) = parse_argv() if opts["h"] or not input_name: print_help() exit(0) if not os.path.isfile(input_name): print(f'file {input_name} does not exist') exit(1) output_name = f'{input_name}-rearranged' if (input_name.endswith('.pdf')): output_name = f'{input_name[0:-4]}-rearranged.pdf' # Read the input reader = PdfReader(input_name) # Write the result to a file middle = PdfWriter() info("Loading...") n = len(reader.pages) # Set m as the smallest multiple of 4 bigger or equal to n m = ceil(n / 4) * 4 for i in range(n): prog(i, m) middle.add_page(reader.pages[i]) for i in range(m - n): prog(n + i, m) middle.add_blank_page() prog(m, m) output = PdfWriter() info() info("Rearranging...") for i in range(int(m / 4)): mod = i * 2 prog(i * 4, m) output.add_page(middle.pages[m - 1 - mod]) prog(i * 4 + 1, m) output.add_page(middle.pages[mod]) prog(i * 4 + 2, m) output.add_page(middle.pages[1 + mod]) prog(i * 4 + 3, m) output.add_page(middle.pages[m - 2 - mod]) prog(m, m) info() info("Saving...") output.write(output_name) info("Done!") info() if __name__ == "__main__": main()