Tampilkan gambar PDF dalam mode-org

19

Catatan: Pertanyaan ini pernah ditanyakan di sini sebelumnya, tanpa hasil.

Kemampuan mode-Org untuk menampilkan gambar sebaris sangat bagus untuk menulis laporan ilmiah mingguan saya. Saya dapat memasukkan grafik, menautkannya dengan data mereka, tautan dengan kesimpulan, dan benar-benar memanfaatkan kekuatan mode-org.

Satu-satunya masalah yang saya miliki adalah bahwa org membutuhkan gambar untuk menggunakan format gambar konvensional (jpeg, png, dll), sementara saya lebih suka grafik saya dalam format PDF.

Bagaimana saya bisa menampilkan gambar pdf sebaris dalam mode-org?

Tujuan akhir saya adalah menulis tautan seperti ini dalam mode-org:

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

Dan sudah ditampilkan inline sama seperti itu akan terjadi jika itu png.

Saya tahu saya hanya bisa memiliki salinan dari setiap grafik di jpeg atau sesuatu (yang saya lakukan sekarang), tapi itu sedikit rumit dan selalu membawa risiko grafik pdf diperbarui dan saya lupa memperbarui jpeg.

Malabarba
sumber
Kekuatan ini bekerja sebagai solusi: Pergi sepanjang baris endless/update-includes, jika selama before-save-hook, jika Anda menemukan garis dengan #+NAMEatau #+CAPTIONdengan tag seperti :convertfrompdfdiikuti oleh garis dengan [[SOMEFILE.EXT]], maka Anda jalankan Imagemagick convertfungsi untuk mengkonversi SOMEFILE.pdfke SOMEFILE.EXT.
Kaushal Modi
@kaushalmodi ya. Pilihan lain adalah sesuatu yang terhubung ke gambar tampilan-org.
Malabarba
Sebuah solusi berdasarkan pdf-tools / poppler akan lebih baik.
phils

Jawaban:

15

CATATAN : Anda harus menginstal ImageMagick di sistem Anda ( convertdapat dieksekusi) agar solusi ini berfungsi.

Bagaimana solusi ini diimplementasikan

  • Fungsi org-include-img-from-pdfini adalah pekerja keras yang melakukan konversi format PDF ke Gambar convert.
  • Jika file org berisi # ()convertfrompdf:t, akan diasumsikan bahwa pengguna memiliki file pdf yang ingin dikonversi menjadi file gambar. Pengguna harus meletakkan komentar khusus di atas di atas tautan file gambar seperti yang ditunjukkan pada contoh di bawah ini.
  • Jenis file gambar ditentukan oleh ekstensi file di tautan braket [[./myimage.EXT]].

  • Dengan menambahkan org-include-img-from-pdffungsi ke before-save-hook, fungsi tersebut dieksekusi setiap kali pengguna menyimpan file (Lihat cuplikan elisp mengikuti definisi fungsi di bawah).

Contoh pengaturan

Dalam pengaturan contoh ini saya memiliki file-file berikut:

  • File org seperti di bawah ini yang menyertakan file gambar.
  • File pdf myimage.pdf.
# ()convertfrompdf:t
[[./myimage.png]]

Berfungsi untuk mengonversi pdf ke file gambar secara otomatis

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

Pengaturan kait untuk menentukan kapan harus menjalankan fungsi ini

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

Kode + MWE

Kaushal Modi
sumber
Apakah ini berarti bahwa file yang diekspor menggunakan png alih-alih pdf?
gdkrmr