Wyświetlaj obrazy PDF w trybie org

19

Uwaga: To pytanie zostało zadane tutaj wcześniej, bez powodzenia.

Możliwość wyświetlania w trybie Org-mode fantastycznych obrazów do pisania moich cotygodniowych raportów naukowych. Mogę dołączać wykresy, łączyć je z ich danymi, łączyć z wnioskami i naprawdę wykorzystywać moc trybu org.

Jedyny problem, jaki mam, polega na tym, że org potrzebuje obrazów do korzystania z konwencjonalnych formatów obrazów (jpeg, png itp.), Podczas gdy wolę, aby moje wykresy były w formacie PDF.

Jak wyświetlić wbudowane obrazy pdf w trybie org?

Moim ostatnim celem jest napisanie takiego linku w trybie org:

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

I niech będzie wyświetlany w linii, tak jak by to się stało, gdyby to był png.

Wiem, że mogę mieć po prostu kopię każdego wykresu w formacie JPEG lub coś takiego (co teraz robię), ale jest to nieco kłopotliwe i zawsze wiąże się z ryzykiem aktualizacji wykresu pdf i zapominam o aktualizacji JPEG.

Malabarba
źródło
Ta praca może jako rozwiązanie: Idąc wzdłuż linii endless/update-includes, jeśli w czasie before-save-hook, jeśli znajdziesz linię z #+NAMElub #+CAPTIONz tagiem jak :convertfrompdfnastępuje zgodnie z [[SOMEFILE.EXT]], a następnie wykonać ImageMagick convertfunkcję przekonwertować SOMEFILE.pdfdo SOMEFILE.EXT.
Kaushal Modi
@kaushalmodi tak. inną opcją byłoby coś, co łączy się z obrazami org-display.
Malabarba
Przydałoby się rozwiązanie oparte na pdf-tools / poppler.
phils

Odpowiedzi:

15

UWAGA : Aby convertto rozwiązanie działało, musisz mieć zainstalowany w systemie ImageMagick ( plik wykonywalny).

Jak to rozwiązanie jest wdrażane

  • Ta funkcja org-include-img-from-pdfto koń roboczy, który wykonuje konwersję formatu PDF na obraz convert.
  • Jeśli plik org zawiera # ()convertfrompdf:t, zakłada się, że użytkownik ma plik pdf, który chce przekonwertować na plik obrazu. Użytkownik powinien umieścić powyższy komentarz specjalny nad linkiem do pliku obrazu, jak pokazano w poniższym przykładzie.
  • Typ pliku obrazu jest określony przez rozszerzenie pliku w łączu nawiasu [[./myimage.EXT]].

  • Dodając org-include-img-from-pdffunkcję do before-save-hook, funkcja ta jest wykonywana za każdym razem, gdy użytkownik zapisuje plik (patrz fragment kodu elisp zgodnie z definicją funkcji poniżej).

Przykładowa konfiguracja

W tym przykładzie instalacji mam następujące pliki:

  • Plik org jak poniżej, który zawiera plik obrazu.
  • Plik pdf myimage.pdf.
# ()convertfrompdf:t
[[./myimage.png]]

Funkcja automatycznego konwertowania plików pdf na pliki obrazów

(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")))

Ustaw hak, aby określić, kiedy uruchomić tę funkcję

(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))

Kod + MWE

Kaushal Modi
źródło
Czy to oznacza, że ​​eksportowany plik używa png zamiast pdf?
gdkrmr