From ef60093bae00b82d5de8fb79d8fd70dba88a0801 Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Wed, 22 May 2024 14:56:21 +0200 Subject: [PATCH] Update pypdf requirement from ==3.9.* to ==4.2.* (#4159) * Change PDF merging for compatibility with pypdf 4 * Update pypdf requirement from ==3.9.* to ==4.2.* * fix pypdf API-changes * fix missing removal of deepcopy * fix rotated PDF-backgrounds --------- Co-authored-by: Richard Schreiber --- pyproject.toml | 2 +- src/pretix/base/pdf.py | 66 ++++++++++++++++++++++-------------------- 2 files changed, 35 insertions(+), 33 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index af4e319b41..f344a93e19 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -82,7 +82,7 @@ dependencies = [ "pycountry", "pycparser==2.22", "pycryptodome==3.20.*", - "pypdf==3.9.*", # wait for https://github.com/py-pdf/pypdf/issues/2642 + "pypdf==4.2.*", "python-bidi==0.4.*", # Support for Arabic in reportlab "python-dateutil==2.9.*", "pytz", diff --git a/src/pretix/base/pdf.py b/src/pretix/base/pdf.py index fc5adbe651..27a8ae3942 100644 --- a/src/pretix/base/pdf.py +++ b/src/pretix/base/pdf.py @@ -1093,32 +1093,33 @@ class Renderer: output = PdfWriter() for i, page in enumerate(new_pdf.pages): - bg_page = copy.deepcopy(self.bg_pdf.pages[i]) + bg_page = self.bg_pdf.pages[i] bg_rotation = bg_page.get('/Rotate') if bg_rotation: + # page.merge_page loses /Rotate on page2 so we need to manually add it as a transformation # /Rotate is clockwise, transformation.rotate is counter-clockwise - t = Transformation().rotate(bg_rotation) - w = float(page.mediabox.getWidth()) - h = float(page.mediabox.getHeight()) + t = Transformation() + w = bg_page.mediabox.width + h = bg_page.mediabox.height if bg_rotation in (90, 270): # offset due to rotation base if bg_rotation == 90: - t = t.translate(h, 0) + t = t.rotate(270).translate(0, w) else: - t = t.translate(0, w) + t = t.rotate(90).translate(h, 0) # rotate mediabox as well - page.mediabox = RectangleObject(( - page.mediabox.left.as_numeric(), - page.mediabox.bottom.as_numeric(), - page.mediabox.top.as_numeric(), - page.mediabox.right.as_numeric(), + bg_page.mediabox = RectangleObject(( + bg_page.mediabox.left.as_numeric(), + bg_page.mediabox.bottom.as_numeric(), + bg_page.mediabox.top.as_numeric(), + bg_page.mediabox.right.as_numeric(), )) - page.trimbox = page.mediabox + bg_page.trimbox = bg_page.mediabox elif bg_rotation == 180: - t = t.translate(w, h) - page.add_transformation(t) - bg_page.merge_page(page) - output.add_page(bg_page) + t = t.rotate(180).translate(w, h) + bg_page.add_transformation(t) + page.merge_page(bg_page, over=False) + output.add_page(page) output.add_metadata({ '/Title': str(title), @@ -1151,32 +1152,33 @@ def merge_background(fg_pdf, bg_pdf, out_file, compress): else: output = PdfWriter() for i, page in enumerate(fg_pdf.pages): - bg_page = copy.deepcopy(bg_pdf.pages[i]) + bg_page = bg_pdf.pages[i] bg_rotation = bg_page.get('/Rotate') if bg_rotation: + # page.merge_page loses /Rotate on page2 so we need to manually add it as a transformation # /Rotate is clockwise, transformation.rotate is counter-clockwise - t = Transformation().rotate(bg_rotation) - w = float(page.mediabox.getWidth()) - h = float(page.mediabox.getHeight()) + t = Transformation() + w = bg_page.mediabox.width + h = bg_page.mediabox.height if bg_rotation in (90, 270): # offset due to rotation base if bg_rotation == 90: - t = t.translate(h, 0) + t = t.rotate(270).translate(0, w) else: - t = t.translate(0, w) + t = t.rotate(90).translate(h, 0) # rotate mediabox as well - page.mediabox = RectangleObject(( - page.mediabox.left.as_numeric(), - page.mediabox.bottom.as_numeric(), - page.mediabox.top.as_numeric(), - page.mediabox.right.as_numeric(), + bg_page.mediabox = RectangleObject(( + bg_page.mediabox.left.as_numeric(), + bg_page.mediabox.bottom.as_numeric(), + bg_page.mediabox.top.as_numeric(), + bg_page.mediabox.right.as_numeric(), )) - page.trimbox = page.mediabox + bg_page.trimbox = bg_page.mediabox elif bg_rotation == 180: - t = t.translate(w, h) - page.add_transformation(t) - bg_page.merge_page(page) - output.add_page(bg_page) + t = t.rotate(180).translate(w, h) + bg_page.add_transformation(t) + page.merge_page(bg_page, over=False) + output.add_page(page) output.write(out_file)