Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Inline PDF images in org-mode

Tags:

In emacs+org-mode, when viewing an org-mode buffer, you can inline linked images with the org-toggle-inline-images command. This includes various formats out of the box, but apparently PDF images aren't included yet.

Given that emacs is perfectly capable of rendering PDF files, is it possible to make org-mode inline PDF files like it does with images (png,jpeg,etc)?

Some background: PDF images are more convenient for me for several reasons, the biggest being that they scale well and work well with latex, from small papers to large posters.

like image 751
Malabarba Avatar asked Mar 14 '13 11:03

Malabarba


People also ask

How do I show images in org-mode?

Such images can be displayed within the buffer with the following command: C-c C-x C-v ( org-toggle-inline-images ) Toggle the inline display of linked images. When called with a prefix argument, also display images that do have a link description.

What is the point of org-mode?

Org mode is routinely used to build and manage complex workflows. It does this using an elegantly simple syntax that scales from basic markup to full LaTeX typesetting and from plain text notes to literate programs. Everything you need to get started is demonstrated in the example.

How do I insert an image into Emacs?

To display an image in an Emacs buffer, you must first create an image descriptor, then use it as a display specifier in the display property of text that is displayed (see The display Property). Emacs is usually able to display images when it is run on a graphical terminal.


2 Answers

Let me finish this question.

Firstly, Org-mode does not support any pdf inline display function with itself. However, it is possible to modify org-display-inline-images to achieve what you want. First you need to refer to this answer: Configuring emacs for showing fixed width inline images, which inspired me a lot. Then I slightly modified the function, making it support pdf, bmp display in org-mode. My function is on below.

(setq image-file-name-extensions    (quote     ("png" "jpeg" "jpg" "gif" "tiff" "tif" "xbm" "xpm" "pbm" "pgm" "ppm" "pnm" "svg" "pdf" "bmp")))  (setq org-image-actual-width 600)  (setq org-imagemagick-display-command "convert -density 600 \"%s\" -thumbnail \"%sx%s>\" \"%s\"") (defun org-display-inline-images (&optional include-linked refresh beg end)   "Display inline images. Normally only links without a description part are inlined, because this is how it will work for export.  When INCLUDE-LINKED is set, also links with a description part will be inlined.  This can be nice for a quick look at those images, but it does not reflect what exported files will look like. When REFRESH is set, refresh existing images between BEG and END. This will create new image displays only if necessary. BEG and END default to the buffer boundaries."   (interactive "P")   (unless refresh     (org-remove-inline-images)     (if (fboundp 'clear-image-cache) (clear-image-cache)))   (save-excursion     (save-restriction       (widen)       (setq beg (or beg (point-min)) end (or end (point-max)))       (goto-char beg)       (let ((re (concat "\\[\\[\\(\\(file:\\)\\|\\([./~]\\)\\)\\([^]\n]+?"                         (substring (org-image-file-name-regexp) 0 -2)                         "\\)\\]" (if include-linked "" "\\]")))             old file ov img)         (while (re-search-forward re end t)           (setq old (get-char-property-and-overlay (match-beginning 1)                                                    'org-image-overlay)         file (expand-file-name                       (concat (or (match-string 3) "") (match-string 4))))           (when (file-exists-p file)             (let ((file-thumb (format "%s%s_thumb.png" (file-name-directory file) (file-name-base file))))               (if (file-exists-p file-thumb)                   (let ((thumb-time (nth 5 (file-attributes file-thumb 'string)))                         (file-time (nth 5 (file-attributes file 'string))))                     (if (time-less-p thumb-time file-time)             (shell-command (format org-imagemagick-display-command                            file org-image-actual-width org-image-actual-width file-thumb) nil nil)))                 (shell-command (format org-imagemagick-display-command                                          file org-image-actual-width org-image-actual-width file-thumb) nil nil))               (if (and (car-safe old) refresh)                   (image-refresh (overlay-get (cdr old) 'display))                 (setq img (save-match-data (create-image file-thumb)))                 (when img                   (setq ov (make-overlay (match-beginning 0) (match-end 0)))                   (overlay-put ov 'display img)                   (overlay-put ov 'face 'default)                   (overlay-put ov 'org-image-overlay t)                   (overlay-put ov 'modification-hooks                                (list 'org-display-inline-remove-overlay))                   (push ov org-inline-image-overlays)))))))))) 

The function uses convert file.pdf -thumbnail "400x400>" file_thumb.png to generate a file_thumb named thumbnail in your folder to substitute overlay of pdf, and force org-mode to display pdf with file_thumb without any modification to the org file.

Moreover, because i use babel to generate image with python. It always need me to update the _thumb file, so I add a if condition to say if this thumb file existed or not, and if the pdf file changed i need to change thumb file on the same time... and so on!

Hope it can help you.

like image 73
Leu_Grady Avatar answered Oct 06 '22 02:10

Leu_Grady


Short answer: no support for PDF inline images.

The function org-image-file-name-regexp has the image file extensions hardcoded (and does not include PDF). This function is used by org-display-inline-images, which in turn calls create-image.

I've tried adding PDF to org-image-file-name-regexp, and deleting PDF from imagemagik-types-inhibit with no luck.

You may try to dig further, or request the feature to org-mode mailing list.

like image 34
Juancho Avatar answered Oct 06 '22 00:10

Juancho