Visualizza immagini PDF in modalità organizzazione


19

Nota: questa domanda è stata posta qui prima, senza successo.

La capacità di Org-mode di visualizzare immagini incorporate è fantastica per scrivere i miei rapporti scientifici settimanali. Posso includere grafici, collegarli con i loro dati, collegare con le conclusioni e sfruttare davvero il potere della modalità org.

L'unico problema che ho è che l'organizzazione ha bisogno delle immagini per usare i formati di immagine convenzionali (jpeg, png, ecc.), Mentre preferisco che i miei grafici siano in PDF.

Come posso visualizzare immagini pdf in linea in modalità org?

Il mio obiettivo finale è semplicemente scrivere un link come questo in modalità org:

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

E hanno mostrato in linea proprio come accadrebbe se fosse un png.

So che potrei avere solo una copia di ogni grafico in jpeg o qualcosa del genere (che è quello che faccio in questo momento), ma è leggermente ingombrante e comporta sempre il rischio che il grafico pdf venga aggiornato e che mi dimentichi di aggiornare il jpeg.


Questo lavoro potrebbe come una soluzione: Andare lungo le linee di endless/update-includes, se durante before-save-hook, se si trova una linea con #+NAMEo #+CAPTIONcon un tag, come :convertfrompdfseguito da una linea con [[SOMEFILE.EXT]], allora si esegue l'Imagemagick convertfunzione per convertire SOMEFILE.pdfa SOMEFILE.EXT.
Kaushal Modi,

@kaushalmodi sì. un'altra opzione sarebbe qualcosa che si aggancia a org-display-images.
Malabarba,

Una soluzione basata su pdf-tools / poppler sarebbe buona.
phils,

Risposte:


15

NOTA : è necessario che ImageMagick sia installato sul sistema ( converteseguibile) affinché questa soluzione funzioni.

Come viene implementata questa soluzione

  • La funzione org-include-img-from-pdfè il cavallo di battaglia che esegue la conversione del formato da PDF a immagine convert.
  • Se il file org contiene # ()convertfrompdf:t, si supporrà che l'utente abbia un file pdf che desidera convertire in un file immagine. L'utente deve inserire il commento speciale sopra sopra il collegamento al file immagine come mostrato nell'esempio seguente.
  • Il tipo di file immagine è determinato dall'estensione del file nel collegamento parentesi [[./myimage.EXT]].

  • Aggiungendo la org-include-img-from-pdffunzione a before-save-hook, quella funzione viene eseguita ogni volta che l'utente salva il file (vedere lo snippet elisp seguendo la definizione della funzione di seguito).

Esempio di installazione

In questo esempio di installazione ho i seguenti file:

  • Un file org come di seguito che include un file di immagine.
  • Il file pdf myimage.pdf.
# ()convertfrompdf:t
[[./myimage.png]]

Funzione per convertire automaticamente pdf in file di immagine

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

Hook hook per specificare quando eseguire questa funzione

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

Codice + MWE


Questo significa che un file esportato utilizza il png invece del pdf?
gdkrmr,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.