Cleanup by introducing foliate, blit_to_A4
This commit is contained in:
parent
881aeaab5d
commit
53aa2d20d4
1 changed files with 66 additions and 65 deletions
131
foliator.py
131
foliator.py
|
|
@ -1,70 +1,71 @@
|
||||||
#!/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
|
||||||
|
|
||||||
|
# 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<L) else create_blank_page(None, PaperSize.A5.width, PaperSize.A5.height)
|
||||||
|
|
||||||
|
front.mediabox = front_page.mediabox
|
||||||
|
back.mediabox = back_page.mediabox
|
||||||
|
|
||||||
|
if(k%4 == 0): # Translate to bottom half of page
|
||||||
|
front.add_transformation(Transformation().translate(0, PaperSize.A5.width))
|
||||||
|
back.add_transformation(Transformation().translate(0, PaperSize.A5.width))
|
||||||
|
|
||||||
|
front_page.merge_page(front)
|
||||||
|
back_page.merge_page(back)
|
||||||
|
return writer
|
||||||
|
|
||||||
input_pdf = PdfReader("to_foliate.pdf")
|
input_pdf = PdfReader("to_foliate.pdf")
|
||||||
num_A5 = math.ceil(len(input_pdf.pages)/4.0) * 2
|
a5 = foliate_A6(input_pdf)
|
||||||
|
a5.write("output_A5.pdf")
|
||||||
# First pretend to be printing on A5 paper
|
a4 = blit_to_A4(a5)
|
||||||
writer = PdfWriter()
|
a4.write("output_A4.pdf")
|
||||||
|
|
||||||
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")
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue