From: Plom Heller Date: Mon, 6 Apr 2026 01:09:41 +0000 (+0200) Subject: Actually normalize pages by zoom and not just by mediabox resizing. X-Git-Url: https://plomlompom.com/repos/booking/%22https:/validator.w3.org/condition?a=commitdiff_plain;ds=sidebyside;p=bookmaker Actually normalize pages by zoom and not just by mediabox resizing. --- diff --git a/bookmaker.py b/bookmaker.py index 8250ce8..b361cc1 100755 --- a/bookmaker.py +++ b/bookmaker.py @@ -419,8 +419,20 @@ def pad_pages_to_multiple_of_8( 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: + 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) @@ -669,10 +681,10 @@ def main( 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 args.nup4: + pad_pages_to_multiple_of_8(pages_to_add) page_croppings = collect_page_croppings(args.crops, args.keep_mediabox, args.symmetry,