Hiển thị hình ảnh PDF ở chế độ org


19

Lưu ý: Câu hỏi này đã được hỏi ở đây trước đây , nhưng không thành công.

Khả năng hiển thị hình ảnh nội tuyến của Org-mode là tuyệt vời để viết báo cáo khoa học hàng tuần của tôi. Tôi có thể bao gồm các biểu đồ, liên kết chúng với dữ liệu của chúng, liên kết với các kết luận và thực sự khai thác sức mạnh của chế độ org.

Vấn đề duy nhất tôi có là org cần các hình ảnh để sử dụng các định dạng hình ảnh thông thường (jpeg, png, v.v.), trong khi tôi thích các biểu đồ của mình ở dạng PDF.

Làm cách nào để hiển thị hình ảnh pdf nội tuyến ở chế độ org?

Mục tiêu cuối cùng của tôi là chỉ viết một liên kết như thế này trong chế độ org:

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

Và nó đã hiển thị nội tuyến giống như nó sẽ xảy ra nếu nó là một png.

Tôi biết rằng tôi chỉ có thể có một bản sao của mỗi biểu đồ trong jpeg hoặc một cái gì đó (đó là những gì tôi làm ngay bây giờ), nhưng nó hơi cồng kềnh và nó luôn có nguy cơ biểu đồ pdf được cập nhật và tôi quên cập nhật jpeg.


Điều này có thể hoạt động như một giải pháp: Đi dọc theo các dòng endless/update-includes, nếu trong khi before-save-hook, nếu bạn tìm thấy một dòng có #+NAMEhoặc #+CAPTIONcó một thẻ như :convertfrompdftheo sau là một dòng với [[SOMEFILE.EXT]], thì bạn thực hiện convertchức năng Imagemagick để chuyển đổi SOMEFILE.pdfthành SOMEFILE.EXT.
Kaushal Modi

@kaushalmodi vâng. một tùy chọn khác sẽ là một cái gì đó nối vào hình ảnh org-display.
Malabarba

Một giải pháp dựa trên pdf-tools / poppler sẽ rất hay.
phils

Câu trả lời:


15

LƯU Ý : Bạn cần cài đặt ImageMagick trên hệ thống của mình (có thể convertthực thi) để giải pháp này hoạt động.

Giải pháp này được thực hiện như thế nào

  • Chức năng org-include-img-from-pdfnày là công việc thực hiện chuyển đổi định dạng PDF sang hình ảnh bằng cách sử dụng convert.
  • Nếu tệp org chứa # ()convertfrompdf:t, người dùng sẽ có một tệp pdf mà họ muốn chuyển đổi thành tệp hình ảnh. Người dùng nên đặt bình luận đặc biệt ở trên phía trên liên kết tệp hình ảnh như trong ví dụ dưới đây.
  • Loại tệp hình ảnh được xác định bởi phần mở rộng tệp trong liên kết khung [[./myimage.EXT]].

  • Bằng cách thêm org-include-img-from-pdfchức năng vào before-save-hook, chức năng đó được thực thi mỗi khi người dùng lưu tệp (Xem đoạn trích elisp theo định nghĩa hàm bên dưới).

Thiết lập ví dụ

Trong ví dụ thiết lập này, tôi có các tệp sau:

  • Một tập tin org như dưới đây bao gồm một tập tin hình ảnh.
  • Các tập tin pdf myimage.pdf.
# ()convertfrompdf:t
[[./myimage.png]]

Chức năng tự động chuyển đổi pdf thành tập tin hình ảnh

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

Thiết lập hook để chỉ định khi nào chạy chức năng này

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

Mã + MWE


Điều này có nghĩa là một tệp đã xuất sử dụng png thay vì pdf?
gdkrmr
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.