diff --git a/src/__init__.py b/src/__init__.py index 24dcd08ab..eed27942b 100644 --- a/src/__init__.py +++ b/src/__init__.py @@ -201,6 +201,19 @@ def _as_fz_page(page): return page assert 0, f'Unrecognised {type(page)=}' +def _as_pdf_page(page): + ''' + Returns page as a mupdf.PdfPage, downcasting as required. If we fail (i.e. + page is a mupdf.FzPage(), .m_internal will be None. + ''' + if isinstance(page, Page): + page = page.this + if isinstance(page, mupdf.PdfPage): + return page + elif isinstance(page, mupdf.FzPage): + return mupdf.pdf_page_from_fz_page(page) + assert 0, f'Unrecognised {type(page)=}' + # Fixme: we don't support JM_MEMORY=1. JM_MEMORY = 0 @@ -5639,7 +5652,7 @@ def update_object(self, xref, text, page=None): new_obj = JM_pdf_obj_from_str(pdf, text) mupdf.pdf_update_object(pdf, xref, new_obj) if page: - JM_refresh_links( mupdf.pdf_page_from_fz_page(page.super())) + JM_refresh_links( _as_pdf_page(page)) def update_stream(self, xref=0, stream=None, new=1, compress=1): """Replace xref stream part.""" diff --git a/tests/resources/test_3070.pdf b/tests/resources/test_3070.pdf new file mode 100644 index 000000000..97794087c Binary files /dev/null and b/tests/resources/test_3070.pdf differ diff --git a/tests/test_general.py b/tests/test_general.py index 9eb7c51c6..01ab9fccf 100644 --- a/tests/test_general.py +++ b/tests/test_general.py @@ -794,3 +794,10 @@ def test_2957_2(): w0 = words0[i] # word before redaction bbox0 = fitz.Rect(w0[:4]).irect # its IRect coordinates assert bbox0 == bbox1 # must be same coordinates + +def test_3070(): + with fitz.open(os.path.abspath(f'{__file__}/../../tests/resources/test_3070.pdf')) as pdf: + links = pdf[0].get_links() + links[0]['uri'] = "https://www.ddg.gg" + pdf[0].update_link(links[0]) + pdf.save(os.path.abspath(f'{__file__}/../../tests/test_3070_out.pdf'))