Mostrar imágenes PDF en modo org

19

Nota: Esta pregunta se hizo aquí antes, sin éxito.

La capacidad del modo Org para mostrar imágenes en línea es fantástica para escribir mis informes científicos semanales. Puedo incluir gráficos, vincularlos con sus datos, vincular con las conclusiones y realmente aprovechar el poder del modo org.

El único problema que tengo es que la organización necesita que las imágenes utilicen formatos de imagen convencionales (JPEG, PNG, etc.), mientras que prefiero que mis gráficos estén en PDF.

¿Cómo puedo mostrar imágenes pdf en línea en modo org?

Mi objetivo final es escribir un enlace como este en org-mode:

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

Y haga que se muestre en línea como sucedería si fuera un png.

Sé que podría tener una copia de cada gráfico en jpeg o algo (que es lo que hago ahora), pero es un poco engorroso y siempre conlleva el riesgo de que el gráfico pdf se actualice y me olvide de actualizar el jpeg.

Malabarba
fuente
Este trabajo puede ser que una solución: ir a lo largo de las líneas de endless/update-includes, si durante before-save-hook, si encuentra una línea con #+NAMEo #+CAPTIONcon una etiqueta como :convertfrompdfseguido por una línea con [[SOMEFILE.EXT]], a continuación, se ejecuta el Imagemagick convertfunción para convertir SOMEFILE.pdfa SOMEFILE.EXT.
Kaushal Modi
@kaushalmodi sí. Otra opción sería algo que se enganche en org-display-images.
Malabarba
Una solución basada en pdf-tools / poppler sería buena.
phils

Respuestas:

15

NOTA : Debe tener ImageMagick instalado en su sistema ( convertejecutable) para que esta solución funcione.

Cómo se implementa esta solución

  • La función org-include-img-from-pdfes el caballo de batalla que hace la conversión de formato PDF a imagen usando convert.
  • Si el archivo org contiene # ()convertfrompdf:t, se supondrá que el usuario tiene un archivo pdf que desea convertir en un archivo de imagen. El usuario debe poner el comentario especial anterior encima del enlace del archivo de imagen como se muestra en el ejemplo a continuación.
  • El tipo de archivo de imagen está determinado por la extensión del archivo en el enlace del soporte [[./myimage.EXT]].

  • Al agregar la org-include-img-from-pdffunción al before-save-hook, esa función se ejecuta cada vez que el usuario guarda el archivo (consulte el fragmento de código elisp siguiendo la definición de la función a continuación).

Configuración de ejemplo

En este ejemplo de configuración tengo los siguientes archivos:

  • Un archivo de organización como el siguiente que incluye un archivo de imagen.
  • El archivo pdf myimage.pdf.
# ()convertfrompdf:t
[[./myimage.png]]

Función para convertir automáticamente PDF a archivos de imagen

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

Configuración de gancho para especificar cuándo ejecutar esta función

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

Código + MWE

Kaushal Modi
fuente
¿Significa esto que un archivo exportado usa png en lugar de pdf?
gdkrmr