組織モードでPDF画像を表示する


19

注:この質問は以前ここで質問されたもので、成功しませんでした。

Org-modeのインライン画像を表示する機能は、毎週の科学レポートを書くのに最適です。グラフを含め、それらをデータにリンクし、結論にリンクし、実際に組織モードの力を活用できます。

私が持っている唯一の問題は、組織が従来の画像形式(jpeg、pngなど)を使用するために画像を必要とすることですが、グラフはPDFにすることを好みます。

組織モードでインラインPDF画像を表示するにはどうすればよいですか?

私の最終的な目的は、組織モードで次のようなリンクを記述することです。

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

そして、それがpngの場合に起こるように、インラインで表示します。

私はちょうど各グラフのコピーをjpegまたは何か(今私がやっていることです)を持つことができることを知っていますが、それは少し面倒であり、pdfグラフが更新されるリスクを常に伴い、私はjpegを更新するのを忘れます。


これは解決策として機能する可能性があります:endless/update-includes、の場合、の行に沿って移動し、のようなbefore-save-hook#+NAMEまたは#+CAPTIONタグの:convertfrompdf後に行が続く[[SOMEFILE.EXT]]場合、Imagemagick convert関数を実行してに変換SOMEFILE.pdfSOMEFILE.EXTます。
カウシャルモディ14

@kaushalmodiええ。別のオプションは、org-display-imagesにフックするものです。
マラバルバ

pdf-tools / popplerに基づいたソリューションがいいでしょう。
フィルス

回答:


15

convertこのソリューションを機能させるには、ImageMagickをシステム(実行可能ファイル)にインストールする必要があります。

このソリューションの実装方法

  • この関数org-include-img-from-pdfは、を使用してPDFから画像形式への変換を行う主力製品ですconvert
  • 組織ファイルにが含ま# ()convertfrompdf:tれている場合、ユーザーが画像ファイルに変換するPDFファイルを持っていると想定されます。次の例に示すように、ユーザーは画像ファイルのリンクの上に上記の特別なコメントを配置する必要があります。
  • 画像ファイルのタイプは、ブラケットリンクのファイル拡張子によって決まります[[./myimage.EXT]]

  • org-include-img-from-pdf関数を追加するとbefore-save-hook、ユーザーがファイルを保存するたびにその関数が実行されます(以下の関数定義に続くelispスニペットを参照)。

設定例

このセットアップ例には、次のファイルがあります。

  • 画像ファイルを含む以下のような組織ファイル。
  • PDFファイルmyimage.pdf
# ()convertfrompdf:t
[[./myimage.png]]

PDFを画像ファイルに自動変換する機能

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

この関数をいつ実行するかを指定するフック設定

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

コード+ MWE


これは、エクスポートされたファイルがpdfではなくpngを使用することを意味しますか?
gdkrmr
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.