NonGNU ELPA - pdf-tools


Support library for PDF documents
pdf-tools-1.0.tar, 2021-Dec-03, 1.13 MiB
Andreas Politz <>
Home page
Browse ELPA's repository
CGit or Gitweb

To install this package, run in Emacs:

M-x package-install RET pdf-tools RET

Full description

#+AUTHOR:    Andreas Politz


** About this package
   PDF Tools is, among other things, a replacement of DocView for PDF
   files.  The key difference is that pages are not pre-rendered by
   e.g. ghostscript and stored in the file-system, but rather created
   on-demand and stored in memory.

   This rendering is performed by a special library named, for
   whatever reason, poppler, running inside a server program.  This
   program is called ~epdfinfo~ and its job is to successively
   read requests from Emacs and produce the proper results, i.e. the
   PNG image of a PDF page.

   Actually, displaying PDF files is just one part of PDF Tools.
   Since poppler can provide us with all kinds of information about a
   document and is also able to modify it, there is a lot more we can
   do with it. [[][Watch]]

   Please read also about [[#known-problems][known problems.]]

** Features
   + View :: View PDF documents in a buffer with DocView-like
   + Isearch :: Interactively search PDF documents like any other
                buffer, either for a string or a PCRE.
   + Occur :: List lines matching a string or regexp in one or more
              PDF documents.
   + Follow ::
    Click on highlighted links, moving to some part of a different
    page, some external file, a website or any other URI.  Links may
    also be followed by keyboard commands.
   + Annotations :: Display and list text and markup annotations (like
                    underline), edit their contents and attributes
                    (e.g. color), move them around, delete them or
                    create new ones and then save the modifications
                    back to the PDF file.
   + Attachments :: Save files attached to the PDF-file or list them
                    in a dired buffer.
   + Outline :: Use imenu or a special buffer to examine and navigate
                the PDF's outline.
   + SyncTeX :: Jump from a position on a page directly to the TeX
                source and vice versa.
   + Virtual ::
    Use a collection of documents as if it were one, big single PDF.

   + Misc ::
     - Display PDF's metadata.
     - Mark a region and kill the text from the PDF.
     - Keep track of visited pages via a history.
     - Apply a color filter for reading in low light conditions.

** Installation
   The package may be installed via melpa and it will try to build the
   server part when it is activated the first time.  Though the next
   section regarding build-prerequisites is still relevant, the rest
   of the installation instructions assume a build from within a git
   repository. (The melpa package has a different directory

*** Server Prerequisites
    You'll need GNU Emacs \ge 24.3 and some form of a GNU/Linux OS.
    Other operating systems are currently not supported (patches
    welcome).  The following instructions assume a Debian-based
    system. (The prerequisites may be installed automatically on this
    kind of systems, see [[#compilation][Compilation]] .)

    First make sure a suitable build-system is installed.  We need at
    least a C/C++ compiler (both ~gcc~ and ~g++~), ~make~, ~automake~
    and ~autoconf~.

    Next we need to install a few libraries PDF Tools depends on, some
    of which are probably already on your system.
#+begin_src sh
  $ sudo aptitude install libpng-dev zlib1g-dev
  $ sudo aptitude install libpoppler-glib-dev
  $ sudo aptitude install libpoppler-private-dev
    On some older Ubuntu systems, the final command will possibly give
    an error.  This should be no problem, since in some versions this
    package was contained in the main package ~libpoppler-dev~.  Also
    note, that ~zlib1g-dev~ was for a long time called ~libz-dev~,
    which it still may be on your system.

    Debian wheezy comes with libpoppler version 0.18, which is pretty
    old.  The minimally required version is 0.16, but some features of
    PDF Tools depend on a more recent version of this library.  See
    the following table for what they are and what version they

    | You want to ...                           | Required version |
    | ... create and modify text annotations.   | \ge 0.19.4       |
    | ... search case-sensitive.                | \ge 0.22         |
    | ... create and modify markup annotations. | \ge 0.26         |

    In case you decide to install libpoppler from source, make sure
    to run its configure script with the ~--enable-xpdf-headers~

    Finally there is one feature (following links of a PDF document by
    plain keystrokes) which requires imagemagick's convert utility.
    This requirement is optional and you may install it like so:
#+begin_src sh
  $ sudo aptitude install imagemagick
**** Compiling on OS X
     Although OS X is not officially supported, it has been reported
     to have been successfully compiled.  You will need to install
     poppler which you can get with homebrew via
  $ brew install poppler automake

     You will also have to help ~pkg-config~ find some libraries by
     setting ~PKG_CONFIG_PATH~, e.g.
  $ export PKG_CONFIG_PATH=/usr/local/Cellar/zlib/1.2.8/lib/pkgconfig:/usr/local/lib/pkgconfig:/opt/X11/lib/pkgconfig
     or likewise within Emacs using `setenv`.

     After that, compilation should proceed as normal.
**** FreeBSD
     Although not officially supported, it has been reported that
     pdf-tools work well on FreeBSD.  Instead of building pdf-tools, you
     can install one of the OS packages with, e.g.
  $ pkg install pdf-tools-emacs25
     To see the current list of pdf-tools packages for FreeBSD visit
     [[][the Repology list]].

     To build pdf-tools from either melpa or directly from the source
     repository, install the dependencies with
  $ pkg install autotools gmake poppler-glib

     If you choose not to install from melpa, you must substitute
    ~gmake~ for ~make~ in the instructions below.
**** Compiling on Centos
     It is possible to compile pdf-tools on Centos. Install poppler the dependencies with:
  $ yum install poppler-devel poppler-glib-devel

**** Compiling on Fedora
  $ sudo dnf install make automake autoconf gcc gcc-c++ ImageMagick libpng-devel zlib-devel poppler-glib-devel

**** Compiling on Alpine Linux
  $ apk add build-base g++ gcc automake autoconf libpng-dev glib-dev poppler-dev

**** Compiling on Windows
     PDF Tools can be built and used on Windows using the MSYS2
     compiler. This will work with native (not cygwin) Windows builds of
     emacs. This includes the standard binaries provided by the GNU
     project, those available as MSYS2 packages and numerous third-party
     binaries. It has been tested with emacs 25.1. Instructions are
     provided under [[#compilation-and-installation-on-windows][Compilation and installation on Windows]], below.
     PDF Tools will successfully compile using Cygwin, but it will not be 
     able to open PDFs properly due to the way binaries compiled with Cygwin
     handle file paths.

*** Compilation
    :CUSTOM_ID: compilation
    Now it's time to compile the source.
#+begin_src sh
    $ cd /path/to/pdf-tools
    $ make install-server-deps # optional
    $ make -s
    The ~make install-server-deps~ command will try to install all
    necessary programs and libraries to build the package, though
    it'll only work, if ~sudo~ and ~apt-get~ are available.

    This should compile the source code and create a Emacs Lisp
    Package in the root directory of the project. The configure script
    also tells you at the very end, which features, depending on the
    libpoppler version, will be available.  These commands should give
    no error, otherwise you are in trouble.
**** Compilation and installation on Windows
      If using the GNU binaries for Windows, support for PNG and zlib
      must first be installed by copying the appropriate dlls into
      emacs' ~bin/~ directory. Most third-party binaries come with this
      already done.

      First, install [[][install MSYS2]] and update
      the package database and core packages using the instructions
      provided. Then, to compile PDF tools itself:

      1. Open msys2 shell

      2. Update and install dependencies, skipping any you already have
         #+BEGIN_SRC sh
         $ pacman -Syu
         $ pacman -S base-devel
         $ pacman -S mingw-w64-x86_64-toolchain
         $ pacman -S mingw-w64-x86_64-zlib
         $ pacman -S mingw-w64-x86_64-libpng
         $ pacman -S mingw-w64-x86_64-poppler
         $ pacman -S mingw-w64-x86_64-imagemagick

      3. Install PDF tools in Emacs, but do not try to compile the
         server. Instead, get a separate copy of the source somewhere
         #+BEGIN_SRC sh
         $ git clone

      4. Open mingw64 shell (*Note:* You must use mingw64.exe and not msys2.exe)

      5. Compile pdf-tools
         #+BEGIN_SRC sh
         $ cd /path/to/pdf-tools
         $ make -s

      6. This should produce a file ~server/epdfinfo.exe~. Copy this file
         into the ~pdf-tools/~ installation directory in your Emacs.

      7. Start Emacs and activate the package.
         M-x pdf-tools-install RET

      8. Test.
         M-x pdf-info-check-epdfinfo RET

      If this is successful, ~(pdf-tools-install)~ can be added to Emacs'
      config. Note that libraries from other GNU utilities, such as Git
      for Windows, may interfere with those needed by PDF Tools.
      ~pdf-info-check-epdinfo~ will succeed, but errors occur when trying
      to view a PDF file. This can be fixed by ensuring that the MSYS
      libraries are always preferred in emacs:

 #+BEGIN_SRC emacs-lisp
 (setenv "PATH" (concat "C:\\msys64\\mingw64\\bin;" (getenv "PATH")))

*** ELisp Prerequisites
    This package depends on the following Elisp packages, which should
    be installed before installing the Pdf Tools package.

    | Package   | Required version                 |
    | [[][let-alist]] | >= 1.0.4 (comes with Emacs 25.2) |
    | [[][tablist]]   | >= 0.70                          |

*** Installing
    If ~make~ produced the ELP file ~pdf-tools-${VERSION}.tar~ you are
    fine.  This package contains all the necessary files for Emacs
    and may be installed by either using
#+begin_src sh
    $ make install-package
    or executing the Emacs command
#+begin_src elisp
  M-x package-install-file RET pdf-tools-${VERSION}.tar RET

  To complete the installation process, you need to activate the
  package by putting
#+begin_src elisp
  somewhere in your ~.emacs~.  Alternatively, and if you care about
  start-up time, you may want to use 
#+begin_src elisp
  instead.  Next you probably want to take a look at the various
  features of what you've just installed.  The following two commands
  might be of help for doing so.
#+begin_src elisp
  M-x pdf-tools-help RET
  M-x pdf-tools-customize RET

*** Updating
    Some day you might want to update this package via ~git pull~ and
    then reinstall it.  Sometimes this may fail, especially if
    Lisp-Macros are involved and the version hasn't changed.  To avoid
    this kind of problems, you should delete the old package via
    ~list-packages~, restart Emacs and then reinstall the package.

    This also applies when updating via package and melpa.

** Known problems
    :CUSTOM_ID: known-problems

*** linum-mode
    PDF Tools does not work well together with ~linum-mode~ and
    activating it in a ~pdf-view-mode~, e.g. via ~global-linum-mode~,
    might make Emacs choke.

*** auto-revert
    Autorevert works by polling the file-system every
    ~auto-revert-interval~ seconds, optionally combined with some
    event-based reverting via [[][file notification]].  But this currently
    does not work reliably, such that Emacs may revert the PDF-buffer
    while the corresponding file is still being written to (e.g. by
    LaTeX), leading to a potential error.

    With a recent [[][auctex]] installation, you might want to put the
    following somewhere in your dotemacs, which will revert the PDF-buffer
    *after* the TeX compilation has finished.
#+BEGIN_SRC emacs-lisp
  (add-hook 'TeX-after-compilation-finished-functions #'TeX-revert-document-buffer)
** Some keybindings

| Navigation                                 |                       |
| Scroll Up / Down by page-full              | ~space~ / ~backspace~ |
| Scroll Up / Down by line                   | ~C-n~ / ~C-p~         |
| Scroll Right / Left                        | ~C-f~ / ~C-b~         |
| Top of Page / Bottom of Page               | ~<~ / ~>~             |
| Next Page / Previous Page                  | ~n~ / ~p~             |
| First Page / Last Page                     | ~M-<~ / ~M->~         |
| Incremental Search Forward / Backward      | ~C-s~ / ~C-r~         |
| Occur (list all lines containing a phrase) | ~M-s o~               |
| Jump to Occur Line                         | ~RETURN~              |
| Pick a Link and Jump                       | ~F~                   |
| Incremental Search in Links                | ~f~                   |
| History Back / Forwards                    | ~B~ / ~N~             |
| Display Outline                            | ~o~                   |
| Jump to Section from Outline               | ~RETURN~              |
| Jump to Page                               | ~M-g g~               |

| Display                                  |                 |
| Zoom in / Zoom out                       | ~+~ / ~-~       |
| Fit Height / Fit Width / Fit Page        | ~H~ / ~W~ / ~P~ |
| Trim margins (set slice to bounding box) | ~s b~           |
| Reset margins                            | ~s r~           |
| Reset Zoom                               | 0               |

| Annotations                   |                                                 |
| List Annotations              | ~C-c C-a l~                                     |
| Jump to Annotations from List | ~SPACE~                                         |
| Mark Annotation for Deletion  | ~d~                                             |
| Delete Marked Annotations     | ~x~                                             |
| Unmark Annotations            | ~u~                                             |
| Close Annotation List         | ~q~                                             |
| Add and edit annotations      | via Mouse selection and left-click context menu |

| Syncing with Auctex              |             |
| jump to PDF location from source | ~C-c C-g~   |
| jump source location from PDF    | ~C-mouse-1~ |

| Miscellaneous                                 |           |
| Refresh File (e.g., after recompiling source) | ~g~       |
| Print File                                    | ~C-c C-p~ |

# Local Variables:
# mode: org
# End:


-*- org -*-

* Version 1.0
* Version 0.90
u** The displayed columns when listing annotations is now customizable
   See variable pdf-annot-list-format and
** Improved handling of default annotation properties
   A new variable pdf-annot-default-annotation-properties was
   introduced, subsuming and obsoleting
   pdf-annot-default-text-annotation-properties and
   pdf-annot-default-markup-annotation-properties.  The new variable
   let's the user choose default properties, e.g. a color, for all
   supported annotations separately.
** Provide a faster "boot-loader"
   The autoloaded function pdf-loader-install acts as a replacement
   for pdf-tools-install and makes Emacs load and use PDF Tools as
   soon as a PDF file is opened, but not sooner.
** Improved the process of (re)compiling the server
   This obsoletes the variable pdf-tools-handle-upgrades, which does
   nothing anymore.   
* Version 0.80
** Tablist package
   The files tablist.el and tablist-filter.el are no longer part of
   pdf-tools, but continue to live on in the tablist package, on which
   pdf-tools now depends on.
** View
*** Encrypted files
    When encountering an encrypted file, query for a password and
    attempt to decrypt it.
*** Backward sync from isearch
    In isearch, press M-s s to visit the source of the current match.
*** Disable unicode in mode-line
    New variable pdf-view-use-unicode-lighter which allows for
    disabling the use of unicode in the mode-line.
* Version 0.70
** View
*** Register integration
    The keys m and ' now set resp. jump to a register corresponding to
    a position in the PDF. Also '' is handled special: It jumps to the
    position before the last register-jump.
*** Export parts of a page as an image
** Info
*** Interface changes
    The return value of many pdf-info-* functions was changed in order
    to prefer alists over other data-structures (indexed lists,
** Virtual PDF
   A virtual PDF is a collection of pages (or parts thereof) of
   arbitrary documents, which appear to the rest of pdf-tools as one
   big PDF, though they are always read-only.

* Version 0.60
** Regexp support
   You may now search for perl-compatible regular expressions (PCRE)
   in PDF documents, both via Isearch and Occur.  If that scares you,
   customize the variable pdf-occur-prefer-string-search.
** Occur
*** Asynchronous search
    Searching is performed asynchronously in a private server
    instance, i.e. it doesn't block neither ordinary editing nor
*** Moccur
    Added the ability to search multiple documents in one occur
** Isearch
*** Occur Integration
    M-s o now starts occur, while keeping the isearch session, like it
    is in text-buffers.
*** Word search
    M-s w now does a word search, which will also find hyphenated
    words (as determined by pdf-isearch-hyphenation-character), though
    not at page boundaries.
** View
*** Navigate by pagelabels
    M-g l may be used to jump to a page by label, i.e. it's displayed
*** Rendering
    Added the ability to display the page as it would be printed
    (e.g. w/o annotations) and to apply a color filter
    (pdf-view-printer-minor-mode resp. pdf-view-midnight-minor-mode).
** Outline
   New option `pdf-outline-display-labels', determining whether to
   display labels instead of plain page-numbers.
* Version 0.50
** PDF Tools is now available on MELPA.
** SyncTeX
*** File name handling
   SyncTeX is pretty picky about source filenames.  So instead of
   trying various filenames and hoping for best, we find it by
   directly inspecting the database.
*** Heuristic backward search
    Backward searching now tries to find the exact position in the
    LaTeX buffer.  This may be disabled by setting
    pdf-sync-backward-use-heuristic to nil.
*** Renamed most variables/functions/commands.
    The old ones are still there but declared obsolete.
** Compatible with Emacs 24.3
** Integrate with b...