Відображайте PDF-зображення в org-режимі


19

Примітка. Це питання було задано тут раніше, не маючи успіху.

Можливість Org-режиму відображати вбудовані зображення є фантастичною для написання моїх тижневих наукових звітів. Я можу включати графіки, пов'язувати їх зі своїми даними, пов'язувати висновки та дійсно використовувати силу org-mode.

Єдиною проблемою є те, що органам потрібні зображення для використання звичайних форматів зображень (jpeg, png тощо), тоді як я вважаю за краще, щоб мої графіки були у форматі PDF.

Як я можу відображати вбудовані PDF-зображення в org-режимі?

Моя остаточна мета - просто написати таке посилання в org-режимі:

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

І чи відображатиметься він в рядку так, як це сталося б, якби це був png.

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


Це може працювати в якості рішення: Перехід уздовж ліній endless/update-includes, якщо під час before-save-hook, якщо ви знайдете лінію #+NAMEабо #+CAPTIONз тегом , як :convertfrompdfслід рядок з [[SOMEFILE.EXT]], то ви виконуєте ImageMagick convertфункцію для перетворення SOMEFILE.pdfв SOMEFILE.EXT.
Каушал Моді

@kaushalmodi так. Іншим варіантом буде щось, що зачіпає зображення в org-дисплеї.
Малабарба

Рішення на основі pdf-інструментів / 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, слідуючи визначенню функції нижче).

Приклад налаштування

У цьому прикладі налаштування у мене є такі файли:

  • Органічний файл, як показано нижче, включає файл зображення.
  • Файл 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))

Код + МВТ


Чи означає це, що експортований файл використовує png замість pdf?
gdkrmr
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.