Exibir imagens em PDF no modo organizacional

19

Nota: Esta pergunta foi feita aqui antes, sem sucesso.

A capacidade do Org-mode de exibir imagens em linha é fantástica para escrever meus relatórios científicos semanais. Posso incluir gráficos, vinculá-los com seus dados, vincular com as conclusões e realmente aproveitar o poder do modo organizacional.

O único problema que tenho é que a organização precisa das imagens para usar formatos de imagem convencionais (jpeg, png, etc), enquanto eu prefiro que meus gráficos estejam em PDF.

Como posso exibir imagens PDF embutidas no modo organizacional?

Meu objetivo final é apenas escrever um link como este no modo organizacional:

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

E exibi-lo em linha exatamente como aconteceria se fosse um png.

Eu sei que eu poderia apenas ter uma cópia de cada gráfico em jpeg ou algo assim (que é o que eu faço agora), mas é um pouco complicado e sempre carrega o risco de o gráfico em pdf ser atualizado e me esquecer de atualizar o jpeg.

Malabarba
fonte
Este trabalho poder como uma solução: Ir ao longo das linhas endless/update-includes, se durante before-save-hook, se você encontrar uma linha com #+NAMEou #+CAPTIONcom uma tag como :convertfrompdfseguido por uma linha com [[SOMEFILE.EXT]], então você executar o Imagemagick convertfunção para converter SOMEFILE.pdfa SOMEFILE.EXT.
Kaushal Modi
@kaushalmodi yeah. outra opção seria algo que se encaixa nas imagens de exibição organizacional.
Malabarba 28/09
Uma solução baseada em pdf-tools / poppler seria legal.
phils

Respostas:

15

NOTA : Você precisa ter o ImageMagick instalado no seu sistema ( convertexecutável) para que esta solução funcione.

Como esta solução é implementada

  • A função org-include-img-from-pdfé o cavalo de batalha que faz a conversão do formato PDF para imagem usando convert.
  • Se o arquivo organizacional contiver # ()convertfrompdf:t, será assumido que o usuário possui um arquivo pdf que deseja converter em um arquivo de imagem. O usuário deve colocar o comentário especial acima acima do link do arquivo de imagem, como mostrado no exemplo abaixo.
  • O tipo de arquivo de imagem é determinado pela extensão do arquivo no link do suporte [[./myimage.EXT]].

  • Ao adicionar a org-include-img-from-pdffunção a before-save-hook, essa função é executada toda vez que o usuário salva o arquivo (consulte o trecho elisp seguindo a definição da função abaixo).

Exemplo de configuração

Neste exemplo de instalação, tenho os seguintes arquivos:

  • Um arquivo organizacional como abaixo, que inclui um arquivo de imagem.
  • O arquivo pdf myimage.pdf.
# ()convertfrompdf:t
[[./myimage.png]]

Função para converter automaticamente PDF para arquivos de imagem

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

Configuração de gancho para especificar quando executar esta função

(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
fonte
Isso significa que um arquivo exportado usa o png em vez do pdf?
gdkrmr 28/01