Giter Club home page Giter Club logo

org-pdftools's Introduction

org-pdftools: a custom org link type for pdf-tools

This project was inspired by and built upon org-pdfview from @markus1189.

Installation

You can now install org-pdftools and org-noter-pdftools from MELPA!

https://melpa.org/packages/org-pdftools-badge.svg

https://melpa.org/packages/org-noter-pdftools-badge.svg

Run M-x pdf-tools-install after installation of pdftools if you haven’t done before.

(use-package org-noter
  :config
  ;; Your org-noter config ........
  (require 'org-noter-pdftools))

(use-package org-pdftools
  :hook (org-mode . org-pdftools-setup-link))

(use-package org-noter-pdftools
  :after org-noter
  :config
  ;; Add a function to ensure precise note is inserted
  (defun org-noter-pdftools-insert-precise-note (&optional toggle-no-questions)
    (interactive "P")
    (org-noter--with-valid-session
     (let ((org-noter-insert-note-no-questions (if toggle-no-questions
                                                   (not org-noter-insert-note-no-questions)
                                                 org-noter-insert-note-no-questions))
           (org-pdftools-use-isearch-link t)
           (org-pdftools-use-freepointer-annot t))
       (org-noter-insert-note (org-noter--get-precise-info)))))

  ;; fix https://github.com/weirdNox/org-noter/pull/93/commits/f8349ae7575e599f375de1be6be2d0d5de4e6cbf
  (defun org-noter-set-start-location (&optional arg)
    "When opening a session with this document, go to the current location.
With a prefix ARG, remove start location."
    (interactive "P")
    (org-noter--with-valid-session
     (let ((inhibit-read-only t)
           (ast (org-noter--parse-root))
           (location (org-noter--doc-approx-location (when (called-interactively-p 'any) 'interactive))))
       (with-current-buffer (org-noter--session-notes-buffer session)
         (org-with-wide-buffer
          (goto-char (org-element-property :begin ast))
          (if arg
              (org-entry-delete nil org-noter-property-note-location)
            (org-entry-put nil org-noter-property-note-location
                           (org-noter--pretty-print-location location))))))))
  (with-eval-after-load 'pdf-annot
    (add-hook 'pdf-annot-activate-handler-functions #'org-noter-pdftools-jump-to-note)))

Latest release note

Usage

In order to link a specific page of a .pdf-file in an org-file, use the following syntax:

[[pdf:~/file.pdf::3][Link to page 3]]

When browsing a pdftools-buffer you can use org-store-link (by default C-c l) to get a link to this location withing the pdf – even while marking some content in the .pdf. Then use org-insert-link (by default C-c C-l) to create a link to this page and this place on the page:

[[pdf:~/file.pdf::5++0.00;;annot-5-0][file.pdf: Page 5; Quoting: some text]]

Current features

The provided function includes:

  • [X] (Sort-of) backward compatibility with org-pdfview: simply change the link prefix from pdfview: to pdf:.
  • [X] The reason this URL prefix change was proposed is that pdftools: links can also point to pdf-occur searchs. Multi-file search is also supported.
  • [X] There is also support for pdf-isearch.
  • [X] Beyond the original link implementation that stores only file path and page number, now you can store the precise location of annotations.
  • [X] If there are selected texts on the current PDF page, it will be marked-up using pdf-tools markup functions (by default, underline) automatically and the corresponding annotation id is stored in the link.
  • HTML exported link now have a “#page=n” postfix, which should make browsers like Chrome open the corresponding page.
  • You can now customize the link description format using org-pdftools-get-desc-function
  • Added org-noter-pdftools-embed-org-note-to-pdf, org-noter-pdftools-embed-all-org-note-to-pdf to copy one or all org-noter annotation headings (the ones with a annot-id and org-pdftools link) to the corresponding PDF file.
  • Added org-noter-pdftools-embed-org-buffer-to-pdf to copy the whole org-noter buffer to a annotation in the left upper corner of the first page in the PDF.
  • Added org-noter-pdftools-jump-to-note config in the README.
  • The prefix of pdftools link can now be customized using org-pdftools-link-prefix, and the default is now set to “pdf”
  • The org-pdftools-search-string-separator is now set to ?? to avoid org fontification problem
  • You can now specify how the path of pdf is stored using two function:
  • org-pdftools-path-generator takes buffer-file-name as an argument, and output a translated path. Default to abbreviate-file-name
  • org-pdftools-path-resolver takes a translated path as an argument and translate it back to absolute path. Default to expand-file-name

Integration with org-noter

You can use the vanilla org-noter now.

  • [X] Integrate with org-noter, such that org-noter can remember the precise location (in the resolution of the exact annotation).
  • [X] Jump from a PDF annotation to a associated org-heading org-noter-sync-* and org-noter-jump-to-heading.
  • [X] Transform old org-noter notes to newer ones and sync with the corresponding PDF. org-noter-convert-old-notes
  • [-] PDF annotation will have full and synced information with the associated org-note. (Besides the note content, each annotate will record the IDs of the corresponding org heading and potentially even it’s parent org heading, such that tree-rebuild is possible.)

Planed features

This is the first step of a set of overhauls of Emacs PDF notetaking experience. The features below are planned (either in this package or as PR to other packages):

  • [-] Optionally grab image/text excerpt from the PDF and insert below the corresponding org-heading. Please refer to pdf-view-extract-region-image, not sure what’s the best way to integrate it.
  • [ ] Link export with image/text-based excerpt from the PDF.
  • [ ] (Long-term) Org <-> PDF Annotation converter.

org-pdftools's People

Contributors

charlie-gordon avatar cpbotha avatar dalanicolai avatar fbanados avatar fuxialexander avatar jgru avatar jwiegley avatar lemonbreezes avatar lytex avatar mohkale avatar smallzhan avatar stardiviner avatar torfjelde avatar xzz53 avatar zhengqunkoo avatar

Stargazers

 avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.