aboutsummaryrefslogtreecommitdiffstats
path: root/activestorage/lib/active_storage/previewer/mupdf_previewer.rb
diff options
context:
space:
mode:
authorTerence Lee <hone02@gmail.com>2018-02-05 19:33:35 -0600
committerGeorge Claghorn <george@basecamp.com>2018-03-06 13:33:33 -0500
commit0b717c20458d12191f479fc693dd1ca1eb11c050 (patch)
tree6bcd9dd08f792a35235a96f392a79fd2ac0cdbc2 /activestorage/lib/active_storage/previewer/mupdf_previewer.rb
parent060ed201e444785135ce9a4baea069079257295e (diff)
downloadrails-0b717c20458d12191f479fc693dd1ca1eb11c050.tar.gz
rails-0b717c20458d12191f479fc693dd1ca1eb11c050.tar.bz2
rails-0b717c20458d12191f479fc693dd1ca1eb11c050.zip
Provide an alternative PDF previewer based on Poppler
mutool is licensed under the Affero GPL, which has strict distribution requirements. Poppler is licensed under the more liberal GPL, making it a good alternative for those who can't use mutool.
Diffstat (limited to 'activestorage/lib/active_storage/previewer/mupdf_previewer.rb')
-rw-r--r--activestorage/lib/active_storage/previewer/mupdf_previewer.rb36
1 files changed, 36 insertions, 0 deletions
diff --git a/activestorage/lib/active_storage/previewer/mupdf_previewer.rb b/activestorage/lib/active_storage/previewer/mupdf_previewer.rb
new file mode 100644
index 0000000000..ae02a4889d
--- /dev/null
+++ b/activestorage/lib/active_storage/previewer/mupdf_previewer.rb
@@ -0,0 +1,36 @@
+# frozen_string_literal: true
+
+module ActiveStorage
+ class Previewer::MuPDFPreviewer < Previewer
+ class << self
+ def accept?(blob)
+ blob.content_type == "application/pdf" && mutool_exists?
+ end
+
+ def mutool_path
+ ActiveStorage.paths[:mutool] || "mutool"
+ end
+
+ def mutool_exists?
+ return @mutool_exists unless @mutool_exists.nil?
+
+ system mutool_path, out: File::NULL, err: File::NULL
+
+ @mutool_exists = $?.exitstatus == 1
+ end
+ end
+
+ def preview
+ download_blob_to_tempfile do |input|
+ draw_first_page_from input do |output|
+ yield io: output, filename: "#{blob.filename.base}.png", content_type: "image/png"
+ end
+ end
+ end
+
+ private
+ def draw_first_page_from(file, &block)
+ draw self.class.mutool_path, "draw", "-F", "png", "-o", "-", file.path, "1", &block
+ end
+ end
+end