Zeigen Sie PDF-Bilder im Organisationsmodus an

19

Hinweis: Diese Frage wurde hier zuvor ohne Erfolg gestellt.

Die Fähigkeit des Org-Modus, Inline-Bilder anzuzeigen, ist fantastisch, um meine wöchentlichen wissenschaftlichen Berichte zu schreiben. Ich kann Diagramme einbinden, sie mit ihren Daten verknüpfen, mit den Schlussfolgerungen verknüpfen und die Kraft des Organisationsmodus wirklich nutzen.

Das einzige Problem, das ich habe, ist, dass org die Bilder benötigt, um herkömmliche Bildformate (JPEG, PNG usw.) zu verwenden, während ich es bevorzuge, dass meine Grafiken in PDF vorliegen.

Wie kann ich Inline-PDF-Bilder im Organisationsmodus anzeigen?

Mein letztes Ziel ist es, einfach einen Link wie diesen im Org-Modus zu schreiben:

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

Und lassen Sie es inline anzeigen, wie es passieren würde, wenn es ein PNG wäre.

Ich weiß, dass ich einfach eine Kopie jedes Diagramms in JPEG oder so haben könnte (was ich gerade mache), aber es ist etwas umständlich und birgt immer das Risiko, dass das PDF-Diagramm aktualisiert wird und ich vergesse, das JPEG zu aktualisieren.

Malabarba
quelle
Dies könnte Arbeit als Lösung: Gehen entlang der Linien endless/update-includes, wenn während before-save-hook, wenn Sie eine Zeile mit finden #+NAMEoder #+CAPTIONmit einem Tag wie :convertfrompdfmit gefolgt von einer Zeile [[SOMEFILE.EXT]], dann führen Sie die Imagemagick convertFunktion zu konvertieren SOMEFILE.pdfzu SOMEFILE.EXT.
Kaushal Modi
@ kaushalmodi ja. Eine andere Option wäre etwas, das sich in org-display-images einhakt.
Malabarba
Eine auf pdf-tools / poppler basierende Lösung wäre schön.
Phils

Antworten:

15

HINWEIS : Damit convertdiese Lösung funktioniert , muss ImageMagick auf Ihrem System ( ausführbar) installiert sein .

Wie diese Lösung implementiert wird

  • Die Funktion org-include-img-from-pdfist das Arbeitspferd, mit dem die Konvertierung von PDF in das Bildformat durchgeführt wird convert.
  • Wenn die Organisationsdatei enthält # ()convertfrompdf:t, wird davon ausgegangen, dass der Benutzer über eine PDF-Datei verfügt, die er in eine Bilddatei konvertieren möchte. Der Benutzer sollte den obigen speziellen Kommentar über den Link der Bilddatei setzen, wie im folgenden Beispiel gezeigt.
  • Der Bilddateityp wird durch die Dateierweiterung im Klammerlink bestimmt [[./myimage.EXT]].

  • Durch Hinzufügen der org-include-img-from-pdfFunktion zu before-save-hookwird diese Funktion jedes Mal ausgeführt, wenn der Benutzer die Datei speichert (siehe das Elisp-Snippet, das der Funktionsdefinition unten folgt).

Beispielaufbau

In diesem Beispielsetup habe ich folgende Dateien:

  • Eine Organisationsdatei wie unten, die eine Bilddatei enthält.
  • Die pdf-Datei myimage.pdf.
# ()convertfrompdf:t
[[./myimage.png]]

Funktion zum automatischen Konvertieren von PDF-Dateien in Bilddateien

(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-Setup, um anzugeben, wann diese Funktion ausgeführt werden soll

(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
quelle
Bedeutet dies, dass eine exportierte Datei das PNG anstelle des PDFs verwendet?
GDKRMR