以组织模式显示PDF图像


19

注意:此问题之前曾在这里提出,但没有成功。

Org-mode能够显示嵌入式图像非常适合撰写我的每周科学报告。我可以包括图表,将它们与它们的数据链接,与结论链接,并真正利用组织模式的力量。

我唯一的问题是组织需要图像使用常规图像格式(jpeg,png等),而我更喜欢将图形显示为PDF。

如何以组织模式显示嵌入式pdf图像?

我的最终目标是在org-mode中编写这样的链接:

[[file:~/Work/grap.pdf]]

并使其内联显示,就像如果是png一样。

我知道我可以在jpeg中保存每个图的副本或其他内容(这是我现在所做的),但是它有点麻烦,并且总是带有pdf图被更新的风险,而我却忘了更新jpeg。


这可能是一种解决方案:沿着的线endless/update-includes,如果在期间before-save-hook,如果找到带有#+NAME#+CAPTION带有标记:convertfrompdf的线[[SOMEFILE.EXT]],然后找到带有的线,则可以执行Imagemagick convert函数转换SOMEFILE.pdfSOMEFILE.EXT
Kaushal Modi 2014年

@kaushalmodi是的。另一个选择是挂接到org-display-images的东西。
马拉巴巴2014年

一个基于pdf-tools / poppler的解决方案会很好。
phils

Answers:


15

注意:您需要在系统(convert可执行文件)上安装ImageMagick ,此解决方案才能起作用。

如何实施此解决方案

  • 该功能org-include-img-from-pdf是使用进行PDF到Image格式转换的主要工具convert
  • 如果org文件包含# ()convertfrompdf:t,则将假定用户具有要转换为图像文件的pdf文件。用户应将以上特殊注释放在图像文件链接上方,如以下示例所示。
  • 图像文件类型由括号链接中的文件扩展名确定[[./myimage.EXT]]

  • 通过将org-include-img-from-pdf功能添加到中before-save-hook,每次用户保存文件时都会执行该功能(请参见下面的功能定义中的elisp代码段)。

设置示例

在此示例安装程序中,我具有以下文件:

  • 如下所示的组织文件,其中包含图像文件。
  • pdf文件myimage.pdf
# ()convertfrompdf:t
[[./myimage.png]]

自动将pdf转换为图像文件的功能

(defun org-include-img-from-pdf (&rest _)
  "Convert pdf files to image files in org-mode bracket links.

    # ()convertfrompdf:t # This is a special comment; tells that the upcoming
                         # link points to the to-be-converted-to file.
    # If you have a foo.pdf that you need to convert to foo.png, use the
    # foo.png file name in the link.
    [[./foo.png]]
"
  (interactive)
  (if (executable-find "convert")
      (save-excursion
        (goto-char (point-min))
        (while (re-search-forward "^[ \t]*#\\s-+()convertfrompdf\\s-*:\\s-*t"
                                  nil :noerror)
          ;; Keep on going to the next line till it finds a line with bracketed
          ;; file link.
          (while (progn
                   (forward-line 1)
                   (not (looking-at org-bracket-link-regexp))))
          ;; Get the sub-group 1 match, the link, from `org-bracket-link-regexp'
          (let ((link (match-string-no-properties 1)))
            (when (stringp link)
              (let* ((imgfile (expand-file-name link))
                     (pdffile (expand-file-name
                               (concat (file-name-sans-extension imgfile)
                                       "." "pdf")))
                     (cmd (concat "convert -density 96 -quality 85 "
                                  pdffile " " imgfile)))
                (when (and (file-readable-p pdffile)
                           (file-newer-than-file-p pdffile imgfile))
                  ;; This block is executed only if pdffile is newer than
                  ;; imgfile or if imgfile does not exist.
                  (shell-command cmd)
                  (message "%s" cmd)))))))
    (user-error "`convert' executable (part of Imagemagick) is not found")))

挂钩设置以指定何时运行此功能

(defun my/org-include-img-from-pdf-before-save ()
  "Execute `org-include-img-from-pdf' just before saving the file."
    (add-hook 'before-save-hook #'org-include-img-from-pdf nil :local))
(add-hook 'org-mode-hook #'my/org-include-img-from-pdf-before-save)

;; If you want to attempt to auto-convert PDF to PNG  only during exports, and not during each save.
;; (with-eval-after-load 'ox
;;   (add-hook 'org-export-before-processing-hook #'org-include-img-from-pdf))

代码+ MWE


这是否意味着导出的文件使用png而不是pdf?
gdkrmr
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.