1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
|
#+TITLE: PDF Tools README
#+AUTHOR: Andreas Politz
#+EMAIL: politza@fh-trier.de
[[https://travis-ci.org/politza/pdf-tools.svg?branch%3Dmaster][https://travis-ci.org/politza/pdf-tools.svg?branch=master]]
[[http://stable.melpa.org/#/pdf-tools][http://stable.melpa.org/packages/pdf-tools-badge.svg]]
[[http://melpa.org/#/pdf-tools][http://melpa.org/packages/pdf-tools-badge.svg]]
** 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. [[http://www.dailymotion.com/video/x2bc1is_pdf-tools-tourdeforce_tech?forcedQuality%3Dhd720][Watch]]
Please read also about [[#known-problems][known problems.]]
** Features
+ View :: View PDF documents in a buffer with DocView-like
bindings.
+ 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
structure.)
*** 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
#+end_src
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
require.
| 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~
option.
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
#+end_src
**** 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
#+BEGIN_SRC sh
$ brew install poppler automake
#+END_SRC
You will also have to help ~pkg-config~ find some libraries by
setting ~PKG_CONFIG_PATH~, e.g.
#+BEGIN_SRC sh
$ export PKG_CONFIG_PATH=/usr/local/Cellar/zlib/1.2.8/lib/pkgconfig:/usr/local/lib/pkgconfig:/opt/X11/lib/pkgconfig
#+END_SRC
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.
#+BEGIN_SRC sh
$ pkg install pdf-tools-emacs26
#+END_SRC
To see the current list of pdf-tools packages for FreeBSD visit
[[https://repology.org/metapackages/?search=pdf-tools&inrepo=freebsd][the Repology list]].
To build pdf-tools from either melpa or directly from the source
repository, install the dependencies with
#+BEGIN_SRC sh
$ pkg install autotools gmake poppler-glib
#+END_SRC
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:
#+BEGIN_SRC sh
$ yum install poppler-devel poppler-glib-devel
#+END_SRC
**** Compiling on Fedora
#+BEGIN_SRC sh
$ sudo dnf install make automake autoconf gcc gcc-c++ ImageMagick libpng-devel zlib-devel poppler-glib-devel
#+END_SRC
**** Compiling on Alpine Linux
#+BEGIN_SRC sh
$ apk add build-base g++ gcc automake autoconf libpng-dev glib-dev poppler-dev
#+END_SRC
**** 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
:PROPERTIES:
:CUSTOM_ID: compilation
:END:
Now it's time to compile the source.
#+begin_src sh
$ cd /path/to/pdf-tools
$ make install-server-deps # optional
$ make -s
#+end_src
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 [[http://www.msys2.org/][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
#+END_SRC
3. Install PDF tools in Emacs, but do not try to compile the
server. Instead, get a separate copy of the source somewhere
else.
#+BEGIN_SRC sh
$ git clone https://github.com/politza/pdf-tools
#+END_SRC
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
#+END_SRC
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.
#+BEGIN_SRC
M-x pdf-tools-install RET
#+END_SRC
8. Test.
#+BEGIN_SRC
M-x pdf-info-check-epdfinfo RET
#+END_SRC
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")))
#+END_SRC
*** ELisp Prerequisites
This package depends on the following Elisp packages, which should
be installed before installing the Pdf Tools package.
| Package | Required version |
|-----------+----------------------------------|
| [[https://elpa.gnu.org/packages/let-alist.html][let-alist]] | >= 1.0.4 (comes with Emacs 25.2) |
| [[http://melpa.org/#/tablist][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
#+end_src
or executing the Emacs command
#+begin_src elisp
M-x package-install-file RET pdf-tools-${VERSION}.tar RET
#+end_src
To complete the installation process, you need to activate the
package by putting
#+begin_src elisp
(pdf-tools-install)
#+end_src
somewhere in your ~.emacs~. Alternatively, and if you care about
start-up time, you may want to use
#+begin_src elisp
(pdf-loader-install)
#+end_src
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
#+end_src
*** 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
:PROPERTIES:
:CUSTOM_ID: known-problems
:END:
*** 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 [[https://www.gnu.org/software/emacs/manual/html_node/elisp/File-Notifications.html][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 [[https://www.gnu.org/software/auctex/][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)
#+END_SRC
** 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:
|