diff --git a/foliator.py b/foliator.py index 90b12c1..a023108 100755 --- a/foliator.py +++ b/foliator.py @@ -1,70 +1,71 @@ #!/usr/bin/env python3 + +import argparse from pypdf import PaperSize, PdfReader, PdfWriter, Transformation import math +# Interprets input_pdf as a list of A6 pages, and appends to append_to with +# A5 pages using the following rules: +# a. Odd/even page pairs correspond to front/back pages of a single sheet, printed +# with "mirror around **short** edge" +# b. when grouped as consecutive sequences of max_folio_size or less, the printed +# sheets can be folded in the middle and assembled as a folio +# FIXME: currently max_folio_size is ignored, and the output is one large folio. +def foliate_A6(input_pdf, max_folio_size=-1, append_to=PdfWriter()): + num_A5 = math.ceil(len(input_pdf.pages)/4.0) * 2 + writer = append_to + + 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) + return writer + +# Take an A5 printing plan, with odd/even pages being understood +# as front/back pairs of sheets, short edge mirroring. Produces an A4 printing plan +# containing two A5 panels per sheet, long edge mirroring. +def blit_to_A4(input_pdf, append_to=PdfWriter()): + L = len(input_pdf.pages) + writer = append_to + + for k in range(0, L, 2): + if(k%4 == 0): # Open up a new sheet + front_page = writer.add_blank_page(width=PaperSize.A4.width, + height=PaperSize.A4.height) + back_page = writer.add_blank_page(width=PaperSize.A4.width, + height=PaperSize.A4.height) + front = input_pdf.pages[k] + back = input_pdf.pages[k+1] if (k+1