From 881aeaab5d90307f5b1284901cc745478c4e874e Mon Sep 17 00:00:00 2001 From: Selene Corbineau Date: Thu, 28 May 2026 09:49:42 +0200 Subject: [PATCH] Initial script, ugly but functional --- foliator.py | 70 +++++++++++++++++++++++++++++++++++++++++++++++++++++ shell.nix | 11 +++++++++ 2 files changed, 81 insertions(+) create mode 100755 foliator.py create mode 100644 shell.nix diff --git a/foliator.py b/foliator.py new file mode 100755 index 0000000..90b12c1 --- /dev/null +++ b/foliator.py @@ -0,0 +1,70 @@ +#!/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") diff --git a/shell.nix b/shell.nix new file mode 100644 index 0000000..d917189 --- /dev/null +++ b/shell.nix @@ -0,0 +1,11 @@ +let + pkgs = import {}; + python3Packages = pkgs.python3Packages; +in +pkgs.mkShell { + packages = [ + (pkgs.python3.withPackages (pythonPackages: with python3Packages; [ + pypdf + ])) + ]; +}