Cleanup by introducing foliate, blit_to_A4

This commit is contained in:
Selene Corbineau 2026-05-29 17:55:00 +02:00
parent 881aeaab5d
commit 53aa2d20d4

View file

@ -1,12 +1,19 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
import argparse
from pypdf import PaperSize, PdfReader, PdfWriter, Transformation from pypdf import PaperSize, PdfReader, PdfWriter, Transformation
import math import math
input_pdf = PdfReader("to_foliate.pdf") # 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 num_A5 = math.ceil(len(input_pdf.pages)/4.0) * 2
writer = append_to
# First pretend to be printing on A5 paper
writer = PdfWriter()
for i in range(num_A5): for i in range(num_A5):
dpage = writer.add_blank_page(width=PaperSize.A5.height, dpage = writer.add_blank_page(width=PaperSize.A5.height,
@ -19,7 +26,6 @@ for i in range(num_A5):
0)) 0))
dpage.merge_page(ipage) dpage.merge_page(ipage)
# Now for the fun part: work backwards to fill the remaining pages # Now for the fun part: work backwards to fill the remaining pages
for j in range(len(input_pdf.pages) - num_A5): for j in range(len(input_pdf.pages) - num_A5):
dpage = writer.pages[num_A5 - 1 - j] dpage = writer.pages[num_A5 - 1 - j]
@ -29,42 +35,37 @@ for j in range(len(input_pdf.pages) - num_A5):
ipage.add_transformation(Transformation().translate(PaperSize.A6.width, ipage.add_transformation(Transformation().translate(PaperSize.A6.width,
0)) 0))
dpage.merge_page(ipage) dpage.merge_page(ipage)
return writer
writer.write("output_A5.pdf") # 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
w2 = PdfWriter() for k in range(0, L, 2):
if(num_A5 % 4 == 2): if(k%4 == 0): # Open up a new sheet
writer.add_blank_page(width=PaperSize.A5.height, front_page = writer.add_blank_page(width=PaperSize.A4.width,
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) height=PaperSize.A4.height)
back_page = writer.add_blank_page(width=PaperSize.A4.width,
dpage_v = w2.add_blank_page(width=PaperSize.A4.width,
height=PaperSize.A4.height) height=PaperSize.A4.height)
print(i) front = input_pdf.pages[k]
top_pr = writer.pages[i] back = input_pdf.pages[k+1] if (k+1<L) else create_blank_page(None, PaperSize.A5.width, PaperSize.A5.height)
top_pv = writer.pages[i+1]
bot_pr = writer.pages[i+2] front.mediabox = front_page.mediabox
bot_pv = writer.pages[i+3] back.mediabox = back_page.mediabox
top_pr.mediabox = dpage_r.mediabox if(k%4 == 0): # Translate to bottom half of page
bot_pr.mediabox = dpage_r.mediabox front.add_transformation(Transformation().translate(0, PaperSize.A5.width))
back.add_transformation(Transformation().translate(0, PaperSize.A5.width))
top_pv.mediabox = dpage_v.mediabox front_page.merge_page(front)
bot_pv.mediabox = dpage_v.mediabox back_page.merge_page(back)
return writer
bot_pr.add_transformation(Transformation().translate(0, PaperSize.A5.width)) input_pdf = PdfReader("to_foliate.pdf")
bot_pv.add_transformation(Transformation().translate(0, PaperSize.A5.width)) a5 = foliate_A6(input_pdf)
a5.write("output_A5.pdf")
dpage_r.merge_page(top_pr) a4 = blit_to_A4(a5)
dpage_r.merge_page(bot_pr) a4.write("output_A4.pdf")
dpage_v.merge_page(top_pv)
dpage_v.merge_page(bot_pv)
w2.write("output.pdf")