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:
Raphael Michel
2024-05-22 14:56:21 +02:00
committed by GitHub
parent 49c4cc639f
commit ef60093bae
2 changed files with 35 additions and 33 deletions

View File

@@ -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)