forked from CGM_Public/pretix_original
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 <schreiber@rami.io>
This commit is contained in:
@@ -82,7 +82,7 @@ dependencies = [
|
|||||||
"pycountry",
|
"pycountry",
|
||||||
"pycparser==2.22",
|
"pycparser==2.22",
|
||||||
"pycryptodome==3.20.*",
|
"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-bidi==0.4.*", # Support for Arabic in reportlab
|
||||||
"python-dateutil==2.9.*",
|
"python-dateutil==2.9.*",
|
||||||
"pytz",
|
"pytz",
|
||||||
|
|||||||
@@ -1093,32 +1093,33 @@ class Renderer:
|
|||||||
output = PdfWriter()
|
output = PdfWriter()
|
||||||
|
|
||||||
for i, page in enumerate(new_pdf.pages):
|
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')
|
bg_rotation = bg_page.get('/Rotate')
|
||||||
if bg_rotation:
|
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
|
# /Rotate is clockwise, transformation.rotate is counter-clockwise
|
||||||
t = Transformation().rotate(bg_rotation)
|
t = Transformation()
|
||||||
w = float(page.mediabox.getWidth())
|
w = bg_page.mediabox.width
|
||||||
h = float(page.mediabox.getHeight())
|
h = bg_page.mediabox.height
|
||||||
if bg_rotation in (90, 270):
|
if bg_rotation in (90, 270):
|
||||||
# offset due to rotation base
|
# offset due to rotation base
|
||||||
if bg_rotation == 90:
|
if bg_rotation == 90:
|
||||||
t = t.translate(h, 0)
|
t = t.rotate(270).translate(0, w)
|
||||||
else:
|
else:
|
||||||
t = t.translate(0, w)
|
t = t.rotate(90).translate(h, 0)
|
||||||
# rotate mediabox as well
|
# rotate mediabox as well
|
||||||
page.mediabox = RectangleObject((
|
bg_page.mediabox = RectangleObject((
|
||||||
page.mediabox.left.as_numeric(),
|
bg_page.mediabox.left.as_numeric(),
|
||||||
page.mediabox.bottom.as_numeric(),
|
bg_page.mediabox.bottom.as_numeric(),
|
||||||
page.mediabox.top.as_numeric(),
|
bg_page.mediabox.top.as_numeric(),
|
||||||
page.mediabox.right.as_numeric(),
|
bg_page.mediabox.right.as_numeric(),
|
||||||
))
|
))
|
||||||
page.trimbox = page.mediabox
|
bg_page.trimbox = bg_page.mediabox
|
||||||
elif bg_rotation == 180:
|
elif bg_rotation == 180:
|
||||||
t = t.translate(w, h)
|
t = t.rotate(180).translate(w, h)
|
||||||
page.add_transformation(t)
|
bg_page.add_transformation(t)
|
||||||
bg_page.merge_page(page)
|
page.merge_page(bg_page, over=False)
|
||||||
output.add_page(bg_page)
|
output.add_page(page)
|
||||||
|
|
||||||
output.add_metadata({
|
output.add_metadata({
|
||||||
'/Title': str(title),
|
'/Title': str(title),
|
||||||
@@ -1151,32 +1152,33 @@ def merge_background(fg_pdf, bg_pdf, out_file, compress):
|
|||||||
else:
|
else:
|
||||||
output = PdfWriter()
|
output = PdfWriter()
|
||||||
for i, page in enumerate(fg_pdf.pages):
|
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')
|
bg_rotation = bg_page.get('/Rotate')
|
||||||
if bg_rotation:
|
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
|
# /Rotate is clockwise, transformation.rotate is counter-clockwise
|
||||||
t = Transformation().rotate(bg_rotation)
|
t = Transformation()
|
||||||
w = float(page.mediabox.getWidth())
|
w = bg_page.mediabox.width
|
||||||
h = float(page.mediabox.getHeight())
|
h = bg_page.mediabox.height
|
||||||
if bg_rotation in (90, 270):
|
if bg_rotation in (90, 270):
|
||||||
# offset due to rotation base
|
# offset due to rotation base
|
||||||
if bg_rotation == 90:
|
if bg_rotation == 90:
|
||||||
t = t.translate(h, 0)
|
t = t.rotate(270).translate(0, w)
|
||||||
else:
|
else:
|
||||||
t = t.translate(0, w)
|
t = t.rotate(90).translate(h, 0)
|
||||||
# rotate mediabox as well
|
# rotate mediabox as well
|
||||||
page.mediabox = RectangleObject((
|
bg_page.mediabox = RectangleObject((
|
||||||
page.mediabox.left.as_numeric(),
|
bg_page.mediabox.left.as_numeric(),
|
||||||
page.mediabox.bottom.as_numeric(),
|
bg_page.mediabox.bottom.as_numeric(),
|
||||||
page.mediabox.top.as_numeric(),
|
bg_page.mediabox.top.as_numeric(),
|
||||||
page.mediabox.right.as_numeric(),
|
bg_page.mediabox.right.as_numeric(),
|
||||||
))
|
))
|
||||||
page.trimbox = page.mediabox
|
bg_page.trimbox = bg_page.mediabox
|
||||||
elif bg_rotation == 180:
|
elif bg_rotation == 180:
|
||||||
t = t.translate(w, h)
|
t = t.rotate(180).translate(w, h)
|
||||||
page.add_transformation(t)
|
bg_page.add_transformation(t)
|
||||||
bg_page.merge_page(page)
|
page.merge_page(bg_page, over=False)
|
||||||
output.add_page(bg_page)
|
output.add_page(page)
|
||||||
output.write(out_file)
|
output.write(out_file)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user