emacs-orgmode
[Top][All Lists]
Advanced

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

Link type for pdf-tools annotations


From: Juan Manuel Macías
Subject: Link type for pdf-tools annotations
Date: Thu, 08 Feb 2024 22:13:50 +0000

Hi,

Many times I need to "save" an annotation point in the pdf-tools
annotations buffer. So I defined a new link type and the function to
store it. The link is stored with the structure:

[[pdf-annot:/path/to/file.pdf::annotation-date][file-name.pdf (annot. on p. 
page-number)]]

The link opens the PDF and jumps to the specific annotation. A screenshot:

https://i.imgur.com/hw96NfD.png

I share the code here in case it is useful to someone:

#+begin_src emacs-lisp

  (defun my-org-pdf-annot-store-link ()
    (when (equal (format "%s" major-mode) "pdf-annot-list-mode")
      (let* ((pdf-buf pdf-annot-list-document-buffer)
             (pdf-file (buffer-file-name pdf-buf))
             (annot (pdf-annot-getannot (tabulated-list-get-id) pdf-buf))
             (date (pdf-annot-print-property annot 'modified))
             (page (save-excursion
                     (beginning-of-line)
                     (re-search-forward "\\(^\s+\\)\\([[:digit:]]+\\)" nil t)
                     (match-string 2)))
             (link (concat "pdf-annot:" pdf-file "::" date))
             (desc (format "%s (annot. on p. %s)" (file-name-nondirectory 
pdf-file) page)))
        (org-link-store-props
         :type "pdf-annot"
         :link link
         :description desc))))

  (org-link-set-parameters
   "pdf-annot"
   :follow (lambda (path)
             (let ((a (if (string-match "::\\(.+\\)" path)
                          (match-string 1 path)
                        (error "no annotation date")))
                   (file-path (replace-regexp-in-string "::.+" "" path)))
               (find-file file-path)
               (pdf-annot-list-annotations)
               (let ((anot-buf (format "*%s's annots*"
                                       (file-name-sans-extension
                                        (buffer-name)))))
                 (with-current-buffer anot-buf
                   (save-excursion
                     (goto-char (point-min))
                     (re-search-forward a nil t)
                     (call-interactively 
#'pdf-annot-list-display-annotation-from-id))))))
   :store #'my-org-pdf-annot-store-link)

#+end_src

Best regards,

Juan Manuel 

-- 
Juan Manuel Macías -- Composición tipográfica, tratamiento de datos, diseño 
editorial y ortotipografía




reply via email to

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