Afficher des images PDF en mode org

19

Remarque: Cette question a été posée ici auparavant, sans succès.

La capacité du mode Org à afficher des images en ligne est fantastique pour rédiger mes rapports scientifiques hebdomadaires. Je peux inclure des graphiques, les lier à leurs données, établir un lien avec les conclusions et vraiment exploiter la puissance du mode organisationnel.

Le seul problème que j'ai est que l'organisation a besoin des images pour utiliser des formats d'image conventionnels (jpeg, png, etc.), alors que je préfère que mes graphiques soient en PDF.

Comment afficher des images pdf en ligne en mode org?

Mon objectif final est d'écrire simplement un lien comme celui-ci en mode org:

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

Et l'afficher en ligne comme il se passerait s'il s'agissait d'un png.

Je sais que je pourrais simplement avoir une copie de chaque graphique en jpeg ou quelque chose (ce que je fais en ce moment), mais c'est un peu lourd et cela comporte toujours le risque que le graphique pdf soit mis à jour et que j'oublie de mettre à jour le jpeg.

Malabarba
la source
Ce travail pourrait comme une solution: Longeant les lignes endless/update-includes, si pendant before-save-hook, si vous trouvez une ligne avec #+NAMEou #+CAPTIONavec une étiquette comme :convertfrompdfsuivi par une ligne [[SOMEFILE.EXT]], puis vous exécutez la Imagemagick convertfonction pour convertir SOMEFILE.pdfà SOMEFILE.EXT.
Kaushal Modi
@kaushalmodi ouais. une autre option serait quelque chose qui s'accroche à org-display-images.
Malabarba
Une solution basée sur pdf-tools / poppler serait bien.
phils

Réponses:

15

REMARQUE : ImageMagick doit être installé sur votre système ( convertexécutable) pour que cette solution fonctionne.

Comment cette solution est mise en œuvre

  • La fonction org-include-img-from-pdfest le cheval de bataille qui effectue la conversion du format PDF en image à l'aide convert.
  • Si le fichier org contient # ()convertfrompdf:t, il sera supposé que l'utilisateur a un fichier pdf qu'il souhaite convertir en fichier image. L'utilisateur doit placer le commentaire spécial ci-dessus au-dessus du lien du fichier image, comme indiqué dans l'exemple ci-dessous.
  • Le type de fichier image est déterminé par l'extension de fichier dans le lien entre crochets [[./myimage.EXT]].

  • En ajoutant la org-include-img-from-pdffonction à before-save-hook, cette fonction est exécutée à chaque fois que l'utilisateur enregistre le fichier (voir l'extrait elisp suivant la définition de la fonction ci-dessous).

Exemple de configuration

Dans cet exemple d'installation, j'ai les fichiers suivants:

  • Un fichier org comme ci-dessous qui comprend un fichier image.
  • Le fichier pdf myimage.pdf.
# ()convertfrompdf:t
[[./myimage.png]]

Fonction de conversion automatique des fichiers PDF en fichiers image

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

Configuration du crochet pour spécifier quand exécuter cette fonction

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

Code + MWE

Kaushal Modi
la source
Est-ce à dire qu'un fichier exporté utilise le png au lieu du pdf?
gdkrmr