Отображение PDF-изображений в режиме орг.

19

Примечание: этот вопрос задавался здесь раньше, но безуспешно.

Способность Org-mode отображать встроенные изображения является фантастической для написания моих еженедельных научных отчетов. Я могу включить графики, связать их с их данными, связать с выводами и действительно использовать всю мощь орг-режима.

Единственная проблема, с которой я столкнулся, заключается в том, что org нужны изображения для использования обычных форматов изображений (jpeg, png и т. Д.), В то время как я предпочитаю, чтобы мои графики были в формате PDF.

Как я могу отображать встроенные изображения PDF в режиме орг?

Моя конечная цель - просто написать такую ​​ссылку в режиме org:

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

И вывести его на экран так же, как если бы это был png.

Я знаю, что у меня может быть просто копия каждого графика в jpeg или что-то в этом роде (что я и делаю сейчас), но это немного громоздко и всегда несет в себе риск обновления pdf-графика, и я забыл обновить jpeg.

Malabarba
источник
Это может работать как решение: если вы продолжите в том же духе endless/update-includes, если во время before-save-hook, если вы найдете строку с тегом #+NAMEили #+CAPTIONс тегом, :convertfrompdfза которым следует строка с [[SOMEFILE.EXT]], то вы выполняете convertфункцию Imagemagick для преобразования SOMEFILE.pdfв SOMEFILE.EXT.
Каушал Моди
@kaushalmodi да. другим вариантом будет то, что подключается к org-display-images.
Малабарба
Решение на основе pdf-tools / poppler было бы неплохо.
Филс

Ответы:

15

ПРИМЕЧАНИЕ.convert Для работы этого решения в вашей системе должен быть установлен ImageMagick ( исполняемый файл).

Как это решение реализовано

  • Эта org-include-img-from-pdfрабочая лошадка используется для преобразования формата PDF в изображение convert.
  • Если файл org содержит # ()convertfrompdf:t, предполагается, что у пользователя есть файл pdf, который он хочет преобразовать в файл изображения. Пользователь должен поместить указанный выше специальный комментарий над ссылкой на файл изображения, как показано в примере ниже.
  • Тип файла изображения определяется расширением файла в скобке [[./myimage.EXT]].

  • Добавляя org-include-img-from-pdfфункцию к before-save-hook, эта функция выполняется каждый раз, когда пользователь сохраняет файл (см. Фрагмент elisp после определения функции ниже).

Пример настройки

В этом примере настройки у меня есть следующие файлы:

  • Файл org, как показано ниже, включает в себя файл изображения.
  • 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