Skip to content
Bruce D'Arcus edited this page Jan 7, 2022 · 22 revisions

pdf-tools integration

Search contents of PDFs

If you run this and select candidates, this will pass the list of any associated PDF files to pdf-tools to search across all of them. If you run embark-act-all on a filtered candidate list, it will pass the files associated with all of them.

image

(defun ex/search-pdf-contents (keys-entries &optional str)
  "Search pdfs."
  (interactive (list (citar-select-refs)))
  (let ((files (citar-file--files-for-multiple-entries
                (citar--ensure-entries keys-entries)
                citar-library-paths
                '("pdf")))
        (search-str (or str (read-string "Search string: "))))
    (pdf-occur-search files search-str t)))

;; with this, you can exploit embark's multitarget actions, so that you can run `embark-act-all`
(add-to-list 'embark-multitarget-actions #'ex/search-pdf-contents)

Add metadata to PDF files

This function will use the metadata from the entry and update the PDF file metadata.

(defun ex/update-pdf-metadata (key-entry)
  "Add/update metadata of PDF for KEY-ENTRY."
  (interactive (list (citar-select-ref)))
  (let* ((entry (cdr key-entry))
         (key (car key-entry))
         (file (car (citar-file--files-for-entry
                     key
                     entry
                     citar-library-paths
                     '("pdf"))))
         (title (citar-clean-string (citar-get-value 'title entry)))
         (author (citar-get-value 'author entry)))
    (call-process-shell-command
     (concat "exiftool -Title='" title "' -Author='" author "' " file))))

Add file to library

(defun citar--add-file-to-library (key)
  "Add a file to the library for KEY.
The FILE can be added either from an open buffer, a file, or a
URL."
  (let* ((source
          (char-to-string
           (read-char-choice
            "Add file from [b]uffer, [f]ile, or [u]rl? " '(?b ?f ?u))))
         (directory (if (cdr citar-library-paths)
                        (completing-read "Directory: " citar-library-paths)
                      (car citar-library-paths)))
         (file-path
          (file-name-concat directory (concat key ".pdf")))) ; FIX so don't hardcode extension
    (pcase source
      ("b"
       (with-current-buffer (read-buffer-to-switch "Add file buffer: ")
         (write-file file-path)))
      ("f"
       (copy-file
        (expand-file-name
         (read-file-name "Add file: " nil nil t)) file-path))
      ("u"
       (url-copy-file (read-string "Add file URL: ") file-path)))))

(defun citar-add-file-to-library (key-entry)
  "Add a file to the library for KEY-ENTRY.
The FILE can be added either from an open buffer, a file, or a
URL."
  (interactive (list (citar-select-ref
                      :rebuild-cache current-prefix-arg)))
   (citar--add-file-to-library (car key-entry)))
Clone this wiki locally