+def build_nup4_output(writer, pages_to_add, crop_at_page, zoom_at_page, args_print_margin, args_analyze, canvas_class):
+ print("-n: building 4-input-pages-per-output-page book")
+ print(f"-m: applying printable-area margin of {args_print_margin}cm")
+ if args_analyze:
+ print("-a: drawing page borders, spine limits")
+ printable_margin = args_print_margin * POINTS_PER_CM
+ printable_scale = (A4_WIDTH - 2 * printable_margin)/A4_WIDTH
+ spine_part_of_page = (SPINE_LIMIT / A4_HALF_WIDTH) / printable_scale
+ bonus_shrink_factor = 1 - spine_part_of_page
+ pages_to_add, new_i_order = resort_pages_for_nup4(pages_to_add)
+ nup4_position = 0
+ page_count = 0
+ is_front_page = True
+ for i, page in enumerate(pages_to_add):
+ if nup4_position == 0:
+ new_page = pypdf.PageObject.create_blank_page(width=A4_WIDTH, height=A4_HEIGHT)
+ corrected_i = new_i_order[i]
+ nup4_inner_page_transform(page, crop_at_page[corrected_i], zoom_at_page[corrected_i], bonus_shrink_factor, printable_margin, printable_scale, nup4_position)
+ nup4_outer_page_transform(page, bonus_shrink_factor, nup4_position)
+ new_page.merge_page(page)
+ page_count += 1
+ print(f"merged page number {page_count} (of {len(pages_to_add)})")
+ nup4_position += 1
+ if nup4_position > 3:
+ ornate_nup4(writer, args_analyze, is_front_page, new_page, printable_margin, printable_scale, bonus_shrink_factor, canvas_class)
+ writer.add_page(new_page)
+ nup4_position = 0
+ is_front_page = not is_front_page
+