home · contact · privacy
Actually normalize pages by zoom and not just by mediabox resizing. master
authorPlom Heller <plom@plomlompom.com>
Mon, 6 Apr 2026 01:09:41 +0000 (03:09 +0200)
committerPlom Heller <plom@plomlompom.com>
Mon, 6 Apr 2026 01:09:41 +0000 (03:09 +0200)
bookmaker.py

index 8250ce882612834220e92c9cb24c042633b0a2b4..b361cc1be192985a848d022617712884436f3043 100755 (executable)
@@ -419,8 +419,20 @@ def pad_pages_to_multiple_of_8(
 def normalize_pages_to_a4(
         pages_to_add: list[PdfPage]
         ) -> None:
 def normalize_pages_to_a4(
         pages_to_add: list[PdfPage]
         ) -> None:
-    'Adjust pages_to_add .mediabox=.cropbox to A4, enact /Rotate inside that.'
+    'Zoom and adjust in pages_to_add .mediabox=.cropbox to A4, enact /Rotate.'
+    max_x = max(page.mediabox.right for page in pages_to_add)
+    max_y = max(page.mediabox.top for page in pages_to_add)
+    zooms = (A4_WIDTH / max_x, A4_HEIGHT / max_y)
+    offsets = {'tx': 0.0, 'ty': 0.0}
+    if zooms[0] < zooms[1]:
+        zoom = zooms[0]
+        offsets['ty'] = (A4_HEIGHT - max_y * zoom) / 2
+    else:
+        zoom = zooms[1]
+        offsets['tx'] = (A4_WIDTH - max_x * zoom) / 2
     for page in pages_to_add:
     for page in pages_to_add:
+        page.add_transformation(PdfTransformation().scale(zoom, zoom))
+        page.add_transformation(PdfTransformation().translate(**offsets))
         if '/Rotate' in page:  # TODO: preserve rotation, but in canvas?
             rotation: int = page['/Rotate']  # type: ignore
             page.rotate(360 - rotation)
         if '/Rotate' in page:  # TODO: preserve rotation, but in canvas?
             rotation: int = page['/Rotate']  # type: ignore
             page.rotate(360 - rotation)
@@ -669,10 +681,10 @@ def main(
                                                   args.page_range)
     validate_ranges(args, pages_to_add)
     rotate_pages(args.rotate_page, pages_to_add)
                                                   args.page_range)
     validate_ranges(args, pages_to_add)
     rotate_pages(args.rotate_page, pages_to_add)
-    if args.nup4:
-        pad_pages_to_multiple_of_8(pages_to_add)
     if not args.keep_mediabox:
         normalize_pages_to_a4(pages_to_add)
     if not args.keep_mediabox:
         normalize_pages_to_a4(pages_to_add)
+    if args.nup4:
+        pad_pages_to_multiple_of_8(pages_to_add)
     page_croppings = collect_page_croppings(args.crops,
                                             args.keep_mediabox,
                                             args.symmetry,
     page_croppings = collect_page_croppings(args.crops,
                                             args.keep_mediabox,
                                             args.symmetry,