#!/usr/bin/env python3 from pypdf import PaperSize, PdfReader, PdfWriter, Transformation import math input_pdf = PdfReader("to_foliate.pdf") num_A5 = math.ceil(len(input_pdf.pages)/4.0) * 2 # First pretend to be printing on A5 paper writer = PdfWriter() for i in range(num_A5): dpage = writer.add_blank_page(width=PaperSize.A5.height, height=PaperSize.A5.width) ipage = input_pdf.pages[i] ipage.mediabox = dpage.mediabox if i % 2 == 0: # Even pages are filled right to left ipage.add_transformation(Transformation().translate(PaperSize.A6.width, 0)) dpage.merge_page(ipage) # Now for the fun part: work backwards to fill the remaining pages for j in range(len(input_pdf.pages) - num_A5): dpage = writer.pages[num_A5 - 1 - j] ipage = input_pdf.pages[num_A5+j] ipage.mediabox = dpage.mediabox if (num_A5 - 1 - j) % 2 == 1: ipage.add_transformation(Transformation().translate(PaperSize.A6.width, 0)) dpage.merge_page(ipage) writer.write("output_A5.pdf") w2 = PdfWriter() if(num_A5 % 4 == 2): writer.add_blank_page(width=PaperSize.A5.height, height=PaperSize.A5.width) writer.add_blank_page(width=PaperSize.A5.height, height=PaperSize.A5.width) num_A5 += 2 for i in range(0, num_A5-3, 4): dpage_r = w2.add_blank_page(width=PaperSize.A4.width, height=PaperSize.A4.height) dpage_v = w2.add_blank_page(width=PaperSize.A4.width, height=PaperSize.A4.height) print(i) top_pr = writer.pages[i] top_pv = writer.pages[i+1] bot_pr = writer.pages[i+2] bot_pv = writer.pages[i+3] top_pr.mediabox = dpage_r.mediabox bot_pr.mediabox = dpage_r.mediabox top_pv.mediabox = dpage_v.mediabox bot_pv.mediabox = dpage_v.mediabox bot_pr.add_transformation(Transformation().translate(0, PaperSize.A5.width)) bot_pv.add_transformation(Transformation().translate(0, PaperSize.A5.width)) dpage_r.merge_page(top_pr) dpage_r.merge_page(bot_pr) dpage_v.merge_page(top_pv) dpage_v.merge_page(bot_pv) w2.write("output.pdf")