Mercurial > hgrepos > Python2 > PyMuPDF
diff tests/test_named_links.py @ 1:1d09e1dec1d9 upstream
ADD: PyMuPDF v1.26.4: the original sdist.
It does not yet contain MuPDF. This normally will be downloaded when
building PyMuPDF.
| author | Franz Glasner <fzglas.hg@dom66.de> |
|---|---|
| date | Mon, 15 Sep 2025 11:37:51 +0200 |
| parents | |
| children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/test_named_links.py Mon Sep 15 11:37:51 2025 +0200 @@ -0,0 +1,105 @@ +import pymupdf + +import os + + +def test_2886(): + """Confirm correct insertion of a 'named' link.""" + if not hasattr(pymupdf, "mupdf"): + print(f"test_2886(): not running on classic.") + return + + path = os.path.abspath(f"{__file__}/../../tests/resources/cython.pdf") + doc = pymupdf.open(path) + # name "Doc-Start" is a valid named destination in that file + link = { + "kind": pymupdf.LINK_NAMED, + "from": pymupdf.Rect(0, 0, 50, 50), + "name": "Doc-Start", + } + # insert this link in an arbitrary page & rect + page = doc[-1] + page.insert_link(link) + # need this to update the internal MuPDF annotations array + page = doc.reload_page(page) + + # our new link must be the last in the following list + links = page.get_links() + l_dict = links[-1] + assert l_dict["kind"] == pymupdf.LINK_NAMED + assert l_dict["nameddest"] == link["name"] + assert l_dict["from"] == link["from"] + + +def test_2922(): + """Confirm correct recycling of a 'named' link. + + Re-insertion of a named link item in 'Page.get_links()' does not have + the required "name" key. We test the fallback here that uses key + "nameddest" instead. + """ + if not hasattr(pymupdf, "mupdf"): + print(f"test_2922(): not running on classic.") + return + + path = os.path.abspath(f"{__file__}/../../tests/resources/cython.pdf") + doc = pymupdf.open(path) + page = doc[2] # page has a few links, all are named + links = page.get_links() # list of all links + link0 = links[0] # take arbitrary link (1st one is ok) + page.insert_link(link0) # insert it again + page = doc.reload_page(page) # ensure page updates + links = page.get_links() # access all links again + link1 = links[-1] # re-inserted link + + # confirm equality of relevant key-values + assert link0["nameddest"] == link1["nameddest"] + assert link0["page"] == link1["page"] + assert link0["to"] == link1["to"] + assert link0["from"] == link1["from"] + + +def test_3301(): + """Test correct differentiation between URI and LAUNCH links. + + Links encoded as /URI in PDF are converted to either LINK_URI or + LINK_LAUNCH in PyMuPDF. + This function ensures that the 'Link.uri' containing a ':' colon + is converted to a URI if not explicitly starting with "file://". + """ + if not hasattr(pymupdf, "mupdf"): + print(f"test_3301(): not running on classic.") + return + + # list of links and their expected link "kind" upon extraction + text = { + "https://www.google.de": pymupdf.LINK_URI, + "http://www.google.de": pymupdf.LINK_URI, + "mailto:jorj.x.mckie@outlook.de": pymupdf.LINK_URI, + "www.wikipedia.de": pymupdf.LINK_LAUNCH, + "awkward:resource": pymupdf.LINK_URI, + "ftp://www.google.de": pymupdf.LINK_URI, + "some.program": pymupdf.LINK_LAUNCH, + "file://some.program": pymupdf.LINK_LAUNCH, + "another.exe": pymupdf.LINK_LAUNCH, + } + + # make enough "from" rectangles + r = pymupdf.Rect(0, 0, 50, 20) + rects = [r + (0, r.height * i, 0, r.height * i) for i in range(len(text.keys()))] + + # make test page and insert above links as kind=LINK_URI + doc = pymupdf.open() + page = doc.new_page() + for i, k in enumerate(text.keys()): + link = {"kind": pymupdf.LINK_URI, "uri": k, "from": rects[i]} + page.insert_link(link) + + # re-cycle the PDF preparing for link extraction + pdfdata = doc.write() + doc = pymupdf.open("pdf", pdfdata) + page = doc[0] + for link in page.get_links(): + # Extract the link text. Must be 'file' or 'uri'. + t = link["uri"] if (_ := link.get("file")) is None else _ + assert text[t] == link["kind"]
