Skip to content

Incorrect links to points on pages having different heights #3347

@ikseek

Description

@ikseek

Description of the bug

Having a document with pages of a different height I try to create a link from a rectangle on one page to a rectangle on another.
When links are created to places on pages of equal heights, all works fine.
When links are created to places on pages of different heights, viewers jump to an offset position on that page.
Empirically I found that this offset is the difference of source and destination page heights.

Is that intended?
In the example I'm attaching, I added a convert function, but why do I need it, shouldn't insert_link calculate it automatically?

To reproduce the problem open the document with higher zoom level (300%) and click rectangles, notice that following links do not bring next rectangle into top-level corner of the viewport.
Replace target point (to_rect.top_left) with commented out convert call to see workaround that fixes it.
Tested in Mac OS Preview, Chrome PDF and https://mozilla.github.io/pdf.js/web/viewer.html viewers.

How to reproduce the bug

import os

import fitz


def convert(link_page_size, target_page_size, point):
    return fitz.Point(point.x, point.y + link_page_size.y - target_page_size.y)


doc = fitz.open()
doc.new_page(width=500, height=800)
doc.new_page(width=800, height=500)
rects = [
    (0, fitz.Rect(10, 20, 50, 40), fitz.utils.getColor('red')),
    (0, fitz.Rect(300, 350, 400, 450), fitz.utils.getColor('green')),
    (1, fitz.Rect(20, 30, 40, 50), fitz.utils.getColor('blue')),
    (1, fitz.Rect(350, 300, 450, 400), fitz.utils.getColor('black'))
]

for page, rect, color in rects:
    doc[page].draw_rect(rect, color=color)

for (from_page, from_rect, _), (to_page, to_rect, _) in zip(rects, rects[1:] + rects[:1]):
    doc[from_page].insert_link({
        'kind': 1,
        'from': from_rect,
        'page': to_page,
        'to': to_rect.top_left,
        # 'to': convert(doc[from_page].mediabox_size, doc[to_page].mediabox_size, to_rect.top_left),
    })

doc.save("out.pdf")
os.system("open out.pdf")

PyMuPDF version

1.24.1

Operating system

MacOS

Python version

3.12

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions