How can we invert the colors of the image when opening a pdf file in doc-view?
2 Answers
pdf-tools
If you decide to install pdf-tools
package (also available on Melpa) to view PDF files (instead of doc-view-mode
), you can view the PDF in "midnight mode" by using the default binding C-c C-r m
or by doing M-x pdf-view-midnight-minor-mode
.
The default colors of this minor mode are,
But you can customize those by customizing the variable pdf-view-midnight-colors
.
From C-h v pdf-view-midnight-colors
,
Colors used when `pdf-view-midnight-minor-mode' is activated.
This should be a cons (FOREGROUND . BACKGROUND) of colors.
I use the following functions to reverse the colors in a PDF. Note that it uses ImageMagick under the hood and will not work without it:
(defun define-doc-view-current-cache-dir ()
;; doc-view-current-cache-dir was renamed to doc-view--current-cache-dir in Emacs 24.5
(or (fboundp 'doc-view-current-cache-dir)
(defalias 'doc-view-current-cache-dir 'doc-view--current-cache-dir)))
(eval-after-load "doc-view" '(define-doc-view-current-cache-dir))
(defun doc-view-reverse-colors ()
"Inverts document colors.\n
Requires an installation of ImageMagick (\"convert\")."
(interactive)
;; error out when ImageMagick is not installed
(if (/= 0 (call-process-shell-command "convert -version"))
(error "Reverse colors requires ImageMagick (convert)")
(when (eq major-mode 'doc-view-mode)
;; assume current doc-view internals about cache-names
(let ((file-name (expand-file-name (format "page-%d.png"
(doc-view-current-page))
(doc-view-current-cache-dir))))
(call-process-shell-command
"convert" nil nil nil "-negate" file-name file-name)
(clear-image-cache)
(doc-view-goto-page (doc-view-current-page))))))
(defun doc-view-reverse-colors-all-pages ()
"Inverts document colors on all pages.\n
Requires an installation of ImageMagick (\"convert\")."
(interactive)
;; error out when ImageMagick is not installed
(if (/= 0 (call-process-shell-command "convert -version"))
(error "Reverse colors requires ImageMagick (convert)")
(when (eq major-mode 'doc-view-mode)
;; assume current doc-view internals about cache-names
(let ((orig (doc-view-current-page))
(page nil))
(message "Reversing video on all pages...")
(dotimes (pnum (doc-view-last-page-number))
(setq page (expand-file-name (format "page-%d.png" (1+ pnum))
(doc-view-current-cache-dir)))
(call-process-shell-command
"convert" nil nil nil "-negate" page page))
(clear-image-cache)
(doc-view-goto-page orig)
(message "Done reversing video!")))))
-
-
For those people trying to use the above code without success: (doc-view-current-cache-dir) should be replaced with (doc-view--current-cache-dir) Very useful, thank you!– TinoCommented Nov 28, 2015 at 8:40