home · contact · privacy
Add option to keep mediabox intact.
authorPlom Heller <plom@plomlompom.com>
Sat, 4 Apr 2026 04:41:49 +0000 (06:41 +0200)
committerPlom Heller <plom@plomlompom.com>
Sat, 4 Apr 2026 04:41:49 +0000 (06:41 +0200)
bookmaker.py

index bc26619b932c3c1dde7ae1d3f419ca9ef7291f70..d524783abb562e3ed58a75fdadacb1af9a1ee7f8 100755 (executable)
@@ -97,6 +97,7 @@ def parse_args():
     parser.add_argument("-s", "--symmetry", action="store_true", help="alternate horizontal crops between odd and even pages")
     parser.add_argument("-n", "--nup4", action='store_true', help="puts 4 input pages onto 1 output page, adds binding cut stencil")
     parser.add_argument("-a", "--analyze", action="store_true", help="in --nup4, print lines identifying spine, page borders")
+    parser.add_argument("-k", "--keep_mediabox", action="store_true", help="keep non-A4 page shapes")
     parser.add_argument("-m", "--print_margin", type=float, default=0.43, help="print margin for --nup4 in cm (default 0.43)")
     return parser.parse_args()
 
@@ -267,7 +268,7 @@ def normalize_pages_to_A4(pages_to_add):
         page.cropbox = page.mediabox
 
 
-def collect_per_page_crops_and_zooms(args_crops, args_symmetry, pages_to_add):
+def collect_per_page_crops_and_zooms(args_crops, args_keep_mediabox, args_symmetry, pages_to_add):
     crop_at_page = [PageCrop()] * len(pages_to_add)
     if args_crops:
         for c_string in args_crops:
@@ -282,6 +283,14 @@ def collect_per_page_crops_and_zooms(args_crops, args_symmetry, pages_to_add):
                     crop_at_page[page_num] = page_crop.give_mirror()
                 else:
                     crop_at_page[page_num] = page_crop
+    elif args_keep_mediabox:
+        for page_num, page in enumerate(pages_to_add):
+            crop_at_page[page_num] = PageCrop(page.mediabox.left / POINTS_PER_CM,
+                                              page.mediabox.bottom / POINTS_PER_CM,
+                                              (0.01 + A4_WIDTH - page.mediabox.right) / POINTS_PER_CM,
+                                              (0.01 + A4_HEIGHT - page.mediabox.top) / POINTS_PER_CM)
+            if args_symmetry and not page_num % 2:
+                crop_at_page[page_num] = crop_at_page[page_num].give_mirror()
     return crop_at_page
 
 
@@ -441,8 +450,9 @@ def main():
     rotate_pages(args.rotate_page, pages_to_add)
     if args.nup4:
         pad_pages_to_multiple_of_8(pages_to_add)
-    normalize_pages_to_A4(pages_to_add)
-    crop_at_page = collect_per_page_crops_and_zooms(args.crops, args.symmetry, pages_to_add)
+    if not args.keep_mediabox:
+        normalize_pages_to_A4(pages_to_add)
+    crop_at_page = collect_per_page_crops_and_zooms(args.crops, args.keep_mediabox, args.symmetry, pages_to_add)
     writer = pypdf.PdfWriter()
     if args.nup4:
         build_nup4_output(writer, pages_to_add, crop_at_page, args.print_margin, args.analyze, Canvas)