emacs-orgmode
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Link to open PDF at a specific page


From: Georges Ko
Subject: Link to open PDF at a specific page
Date: Sat, 14 Nov 2020 16:46:24 +0800
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/27.1 (windows-nt) Hamster/2.0.0.1

Hi,

I'd like to open a PDF file to a specific page from a link, using the
default PDF viewer in Windows (same as w32-shell-execute "open"), which
opens a browser.

With a browser, I can open it with this HTML link:

  <a href="file:///c:/a/b/c/file.pdf#page=4">Page 4</a>

This link as an Org mode link doesn't work:

  file:///c:/a/b/c/file.pdf#page=4

as "#page=4" is interpreted as part of the filename by w32-shell-execute.

If I modify org-file-apps for PDF to:

("\\.pdf::\\([0-9]+\\)\\'" . "browser file:///%s#page=%1")

and if the Org link is:

  file:///c:/a/b/c/file.pdf::4

it doesn't work because the argument passed to browser is:

  file:///"c:/a/b/c/file.pdf"#page=4

A quick workaround is to modify org-open-file by removing
shell-quote-argument, from:

  (shell-quote-argument (convert-standard-filename file))

to

  (convert-standard-filename file)

to get the following string, which correctly opens page 4.

  "file:///c:/a/b/c/file.pdf#page=4"

If I export the file as HTML, it is output as:

  <a href="file:///c:/a/b/c/file.pdf#MissingReference">...</a>

so I modified org-html-link from:

  (concat raw-path
          "#"
          (org-publish-resolve-external-link option path t))

to

  (concat raw-path
          "#"
          (let ((r (org-publish-resolve-external-link option path t)))
            (or (and (string= r "MissingReference")
                     (string-match "\\.pdf\\'" path)
                     (string-match "[0-9]+" option)
                     (format "page=%s" option))
                r)))

which generates the wanted HTML link:

  <a href="file:///c:/a/b/c/file.pdf#page=4">...</a>

Is there any way less quick & dirty to achieve this?

Thanks!






reply via email to

[Prev in Thread] Current Thread [Next in Thread]