Link to page inside PDF

Submitted by WayneK on 2020/02/27 17:26
I want to place a link in InfoQube that opens a PDF to a specific page.
 
This was discussed a couple of years ago (Universal Links):
 
Was suggested it should be possible by appending a code to the pdf URL
 
I've repeatedly tried to make this work but never have been able to. 
 
Does anyone have a suggestion on how it can be done?
 
Wayne

Comments

It might be difficult.  To open a PDF file on a specific page you need to add a command line parameter to the link, I don't know how easy this is in IQ.  It is easy enough in ConnectedText but takes one line of scripting which some people find difficult.
 
The other problem is that different PDF readers like different parameters.
 
For instance in Adobe Acrobat the line should read :-
 
"C:\mypath\myfile.pdf page=133
 
to open the PDF file on page 133.
 
But for the free version of PDF-XChange the parameter is :-
 
"C:\mypath\myfile.pdf $P 133
 
to open 'myfile.pdf' on page 133.
 
So the parameter is dependent on the type of PDF reader you have installed which is out of Pierre's control.
 

You could call a simple batch file or Autohotkey script with the file path and page number as parameter. Then if you changed to a different pdf reader, it would be a simple matter of changing a single line of code in that script. Here's a thread discussing it for Autohotkey.

LeftEccoForIQ

2020/02/28 10:55

In reply to by LeftEccoForIQ

In fact, I haven't found any indication that IQ currently supports file links with parameters out of the box.
 
But I found this information on how to create your own protocol to launch an app with parameters on Windows.

Thanks for the additional details.
 
Looks to be beyond my capabilities.  I did get links from PDFs to InfoQube items to work, though.
 
For me, it looks like options are:
 
1) Extract the relevant pages as a separate file for InfoQube to link to.
 
2) Have a two-step link: 1) InfoQube link to file; 2) Internal PDF bookmark to page
 
 
Wayne
 

LeftEccoForIQ

2020/02/29 15:34

In reply to by WayneK

One other way that springs to mind: If you wouldn't mind permanently running an Autohotkey script  in the background, it could monitor your Windows clipboard and whenever you copy a path to a pdf file followed by a (page) number to the clipboard, it could open your pdf at that page. I could cook something up for you.

WayneK

2020/03/01 01:07

In reply to by LeftEccoForIQ

LeftEcco,
 
Thank you for the generous offer but I don't want to trouble you when I'm not sure I would follow through and use the set up.  I already have a problem with running a couple of text monitoring programs and don't think I want to add another to the mix right now.
 
Wayne
 

The Zetero with zotfile and mdnotes extension may give you what you need.

The combination can be used to extract highlighted notes from a PDF file with links to the originating pages. The link/call is in Adobe Acrobat format. You can copy these extractions to any editor. I have used them in Scrivener and Word, but they should also work in IQ editor (I haven’t tried it). Apparently these extracts can also be in markdown file format.

I don’t know how to run multiple instances of Acrobat so I needed to close the acrobat to click on a new link to another page. However, if you use foxit pdf reader and configure it to have multiple instances, then you can click it away…

Zetero beta has a built-in PDF viewer. These generated links work with the built-in viewer. In fact, that is probably what I will use going forward. You can still highlight and annotate outside zetero if you like...

It behaves differently for web and local files

For web, this works fine in Chrome, Firefox but not Edge:

http://www.africau.edu/images/default/sample.pdf#page=2

In v118g, you can hold the Shift key to show the Open With dialog and choose a browser

For local files however you can create the link in IQ but the #page=2 ending is ignored. I haven't found a way to pass it to the browser

If you hold Shift (or have show open with enabled), on some version of Windows, the dialog shows and selecting Chrome DOES open it to page 2 as it should. Windows 10 does not and shows a silly "You'll need a new store app" dialog

I'll keep trying

n.b. the web links do work in Edge, but is in conflict with a new Edge feature to resume PDF to previous page setting (LOL). Turn off "PDF view settings" to make it work

 I am sure you are right about web. I kept most of my files local and some in the cloud. I don’t use browser for reading PDF files. I use local desktop programs.

For the PDF files I have stored in Zotero (locally). Zetero with add-on I had described above can generate  text highlighted in the PDF with associated links.
I just test it: I copy the a couple segments of text (with links) and pasted them in an infoqube doc.. Clicking on links (in the browser mode of infoq doc), I was taking to desired pages in the Zotero internal PDF viewer. When I reconfig zetero with either foxit or adobe, infoq would direct me to the correct page in the respective pdf reader.

Give it a try. For me, this combination really enhanced the power of InfoQube for me. I try to read “key” books in PDF format so I can highlight and annotate easily. I even covert most of my epub, awz books to PDF (via Calibre). I still read some books in kindle, but if the book is worth a 2nd read, I will read it in PDF.

Note: the Zotero internal PDF reader is only available in its beta version.

 

Fri 10/24/25 Update

Never found a definitive solution. 

Suggested Zotero solution doesn't work for me because I rely heaving on my PDF program (Bluebeam Revu) to do markups with toolsets, layers, etc.  Zotero viewer isn't going to have the power I need.

Workaround #1:  Two-step navigation #1.  

• Put PDF link in InfoQube that includes PDF page number.  
• Open the PDF and navigate to correct page.  (input page or number or use bookmark inside PDF)
• Con: Extra steps to navigate to target
• Con: If you rely on page number navigation, the page number references have to be updated when reference file changes.

• Con: If you relay on internal bookmarks in the PDF, these can become difficult to navigate if there are a lot of bookmarks in the file.  

• Conclusion: Page number reference works ok if you're linking to a file that doesn't change (eg a book) but isn't tenable for files that change. 

Workaround #2: Two-step navigation #2.  

• My PDF program DOES have links to individual pages in other pdf's.  
• Create InfoQube link to a pdf "link file" which in turn links to the target destination 

• Con: takes much more time to create links.  

• Conclusion: extra steps to create links are probably too much trouble

Workaround #3: Create individual PDF reference files

• Create a separate PDF file for each individual topic.

• Create InfoQube links to individual topics.

• Conclusion: solves direct link problem but works only on files you create.  Doesn't work for books and articles.

Side note: how do I get the editor to use single-line spacing?  It goes randomly from single-line to double-line and  I can't figure out how to control  it

Wayne

 

Hi Wayne,

• My PDF program DOES have links to individual pages in other pdf's.  
• Create InfoQube link to a pdf "link file" which in turn links to the target destination 

Can you report back what this link looks like. I should be able to generate it directly...

Pierre,

I'll show you how it works in Revu step by step and you can tell me if you need something more.

1) The target file has to be open Revu but once created, the link works even if the target file is closed

2) Create flag and right-click>edit action.

3) This pops up a dialogue that lets you set a "jump" to another file from a pull down list.  This list is populated by currently open files.  I have selected one of the other open files and selected page 2:

4) This creates a link to page 2 of the other file.  The link is activated by clicking on the lightning bolt on the flag:

5) You can also link to a specific spot on a page be selecting "Place" instead of "Page", then drawing a rectangle on the page where you want the link to go to.

 

6) The second screen cap above shows the coordinates and file name for the target.

If I hover over the link, it displays a truncated path:

That's all I can see to pass on.  I looked at properties for the link flag but it didn't have any link info.

I don't think it's necessary to try to link to a specific spot on a page.  A page link is good enough.  I provided the spot link because it had some coordinate info that might help you.

I asked ChatGPT how Revu does it.  Sometimes ChatGPT has useful info (and sometimes not!).  You can delete this post to de-clutter the thread if you want.

Short version: Bluebeam isn’t doing anything “proprietary” here—it’s using standard PDF link annotations and destinations. You can create the same kind of links with any PDF library. Here’s how it works and what to look for if you ever inspect the objects.

How links to pages/places work in PDFs

1) Link = an annotation with an action

  • A PDF page has an /Annots array. Each entry can be a /Subtype /Link annotation with:
    • /Rect [x1 y1 x2 y2] → the clickable box (in page user units)
    • /A << … >> → the action to perform when clicked

2) Two key actions

  • /GoTo (same document):
    /A << /S /GoTo /D <destination> >>
  • /GoToR (other document):
    /A << /S /GoToR /F <file spec> /D <destination> /NewWindow true|false >>
    • /F can be a relative or absolute file spec. Relative paths are common in workflows that keep PDFs together.

3) Destinations (the “place” part)
A destination tells the viewer where and how to display a page. Two flavors:

  • Explicit destination array (most precise):
    • [/XYZ left top zoom] → exact coordinates & zoom
    • [/Fit] → whole page
    • [/FitH top] → fit width, scroll to Y
    • [/FitV left] → fit height, scroll to X
    • [/FitR left bottom right top] → fit a rectangle
  • Named destination (indirection that survives page reordering):
    • The doc has a Names tree (/Names/Dests) that maps a string name (e.g., "Page12Top") to an explicit destination.
    • The link then uses /D (name) instead of the array. Viewers resolve the name to the array.

Bluebeam’s “Places,” bookmarks, and hyperlinks typically compile down to either a named destination or an explicit array.

Coordinate system you’re asking about

  • Units: PDF user space units (points). 1 point = 1/72 inch.
  • Origin: bottom-left of the page’s current user space.
  • Transforms: Page rotation (/Rotate) and page boxes (/CropBox, /MediaBox) matter. Annotations are specified in default user space; viewers apply page rotation/crop. If your page is rotated 90°, the annotation rect still uses the unrotated coordinate system—viewers handle it at render time.
  • XYZ destination fields:
    • left = X coordinate
    • top = Y coordinate (still measured from the bottom in PDF space; the name “top” is historical—think “set the top edge to this Y”)
    • zoom = e.g., 1.0 for 100%. null (or omitted) means “don’t change current zoom.”

Handy conversion (for scanned pages):
If you know scan DPI and pixel coordinates:
points = pixels * 72 / DPI

Cross-file links (Revu → other PDF)

A typical remote link action looks like:

/A <<
 /S /GoToR
 /F (..\Maps\Sanborn_1911.pdf)
 /D [12 0 R /XYZ 245 612 1.25]   % or a named dest instead of the array
 /NewWindow true
>>

   /F can be a path or a file spec object. Relative paths are best if you move folders around together.

   /D can be an explicit array (like above) or a name (e.g., (Sheet9Corner)).

What Bluebeam adds on top

   Revu’s UI lets you set a hyperlink “Page Only,” “Page with Zoom,” “Snapshot View,” etc. Those map to the /Fit* or /XYZ destination types behind the scenes.

   If you export markups (XFDF), the link regions and targets are described there; when saved back to PDF, they’re standard /Link annotations.

   For resilience, Revu often prefers named destinations for intra-document navigation so links don’t break if pages move.

Programmatic examples (language-agnostic idea + a few concrete snippets)

Conceptual steps (any language / library):

   Open PDF; get target page object.

   Define a destination:

       explicit: PdfExplicitDestination.createXYZ(page, x, y, zoom) (library naming varies)

       or create a named destination and register it in the Names tree.

   On the source page, add a /Link annotation with /Rect and set its /A to /GoTo or /GoToR.

Java (iText 7):

PdfDocument pdf = new PdfDocument(new PdfReader(src), new PdfWriter(dest));
// Destination inside same doc
PdfExplicitDestination dest = PdfExplicitDestination.createXYZ(
   pdf.getPage(5), 245, 612, 1.25f);

// Link annotation rectangle on source page
PdfLinkAnnotation link = new PdfLinkAnnotation(new Rectangle(100, 100, 200, 20));
link.setAction(PdfAction.createGoTo(dest));
pdf.getPage(1).addAnnotation(link);

// Cross-document link
PdfLinkAnnotation ext = new PdfLinkAnnotation(new Rectangle(100, 150, 200, 20));
ext.setAction(PdfAction.createGoToR("Sanborn_1911.pdf",
   PdfExplicitDestination.createFit(pdf.getPage(12))));
pdf.getPage(1).addAnnotation(ext);
pdf.close();

Python (pypdf) – supports internal links; for external GoToR you may need to craft the action dict manually:

from pypdf import PdfReader, PdfWriter
from pypdf.generic import DictionaryObject, NameObject, ArrayObject, NumberObject, FloatObject, TextStringObject

reader = PdfReader("source.pdf")
writer = PdfWriter()
for p in reader.pages:
   writer.add_page(p)

# Build a /GoToR action manually
action = DictionaryObject()
action.update({
   NameObject("/S"): NameObject("/GoToR"),
   NameObject("/F"): TextStringObject("Sanborn_1911.pdf"),
   NameObject("/D"): ArrayObject([
       # destination form: [page_index /XYZ left top zoom]
       NumberObject(11), NameObject("/XYZ"),
       FloatObject(245), FloatObject(612), FloatObject(1.25)
   ]),
   NameObject("/NewWindow"): NameObject("true"),
})

# Add a link annotation on page 1
annot = DictionaryObject()
annot.update({
   NameObject("/Type"): NameObject("/Annot"),
   NameObject("/Subtype"): NameObject("/Link"),
   NameObject("/Rect"): ArrayObject([NumberObject(100), NumberObject(100),
                                     NumberObject(300), NumberObject(120)]),
   NameObject("/A"): action
})
page = writer.pages[0]
if "/Annots" in page:
   page["/Annots"].append(annot)
else:
   page[NameObject("/Annots")] = ArrayObject([annot])

with open("out.pdf", "wb") as f:
   writer.write(f)

JavaScript/TypeScript (pdf-lib) – internal links are straightforward; external GoToR may require low-level object tweaks similar to the Python example.
Practical tips for accuracy (esp. with historical scans)

   Lock zoom with /XYZ for repeatable “view framing”; leave zoom null if you want viewer to keep the user’s current zoom.

   Rotation gotchas: If a page has /Rotate 90, your clickable /Rect still uses the unrotated coordinate system; test after saving.

   Crop vs media box: If you link to a coordinate near the page edge and later change the crop, your “place” can shift visually.

   Prefer named destinations when you expect to reorder pages; let links point to names, and just update the name’s definition once.

   Relative paths for /GoToR so your pack-and-go folders keep working across machines.

If you want to inspect what Revu wrote

Open the PDF with a tool like qpdf or pdftk (dump data) and search for:

   /Subtype /Link

   /A << /S /GoTo or /A << /S /GoToR

   /D [ (explicit dest arrays)

   /Names → /Dests (named destinations)

That will show you the exact coordinates, zoom, and file specs Bluebeam encoded.

If you tell me which direction you want to go (e.g., “I want to generate hundreds of cross-file hotspots from a CSV of coordinates”), I can sketch a small, ready-to-run script in your preferred language that emits /GoToR links using the exact coordinate math you need.

How do I ?