Org-mode mailing list
 help / color / mirror / Atom feed
From: Georges Ko <gko@gko.net>
To: emacs-orgmode@gnu.org
Subject: Link to open PDF at a specific page
Date: Sat, 14 Nov 2020 16:46:24 +0800
Message-ID: <yqc2amtzkuxzz.fsf@gko.net> (raw)

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	other threads:[~2020-11-14  8:47 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-11-14  8:46 Georges Ko [this message]
2020-11-14 11:34 ` Jean Louis

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://orgmode.org

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=yqc2amtzkuxzz.fsf@gko.net \
    --to=gko@gko.net \
    --cc=emacs-orgmode@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

Org-mode mailing list

This inbox may be cloned and mirrored by anyone:

	git clone --mirror https://orgmode.org/list/0 list/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 list list/ https://orgmode.org/list \
		emacs-orgmode@gnu.org
	public-inbox-index list

Example config snippet for mirrors.
Newsgroups are available over NNTP:
	nntp://news.yhetil.org/yhetil.emacs.orgmode
	nntp://news.gmane.io/gmane.emacs.orgmode


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git