diff options
author | Go MAEDA <maeda@farend.jp> | 2019-05-12 03:55:56 +0000 |
---|---|---|
committer | Go MAEDA <maeda@farend.jp> | 2019-05-12 03:55:56 +0000 |
commit | c4a4133178b83c2c115df1947302c785b2885467 (patch) | |
tree | 10aeb523e06a613a9b8942b67cae947a23b2b4e9 /lib | |
parent | a5b9632772294981b5c96fb5f8273a386d84f90c (diff) | |
download | redmine-c4a4133178b83c2c115df1947302c785b2885467.tar.gz redmine-c4a4133178b83c2c115df1947302c785b2885467.zip |
Render PDF thumbnail using ImageMagick/GhostScript (#22481).
Patch by Gregor Schmidt.
git-svn-id: http://svn.redmine.org/redmine/trunk@18158 e93f8b46-1217-0410-a6f0-8f06a7374b81
Diffstat (limited to 'lib')
-rw-r--r-- | lib/redmine/thumbnail.rb | 33 |
1 files changed, 30 insertions, 3 deletions
diff --git a/lib/redmine/thumbnail.rb b/lib/redmine/thumbnail.rb index 31ac62272..278717273 100644 --- a/lib/redmine/thumbnail.rb +++ b/lib/redmine/thumbnail.rb @@ -25,12 +25,18 @@ module Redmine extend Redmine::Utils::Shell CONVERT_BIN = (Redmine::Configuration['imagemagick_convert_command'] || 'convert').freeze - ALLOWED_TYPES = %w(image/bmp image/gif image/jpeg image/png) + ALLOWED_TYPES = %w(image/bmp image/gif image/jpeg image/png application/pdf) # Generates a thumbnail for the source image to target - def self.generate(source, target, size) + def self.generate(source, target, size, is_pdf = false) return nil unless convert_available? + return nil if is_pdf && !gs_available? unless File.exists?(target) + mime_type = File.open(source) {|f| MimeMagic.by_magic(f).try(:type) } + return nil if mime_type.nil? + return nil if !ALLOWED_TYPES.include? mime_type + return nil if is_pdf && mime_type != "application/pdf" + # Make sure we only invoke Imagemagick if the file type is allowed unless File.open(source) {|f| ALLOWED_TYPES.include? MimeMagic.by_magic(f).try(:type) } return nil @@ -40,7 +46,12 @@ module Redmine FileUtils.mkdir_p directory end size_option = "#{size}x#{size}>" - cmd = "#{shell_quote CONVERT_BIN} #{shell_quote source} -auto-orient -thumbnail #{shell_quote size_option} #{shell_quote target}" + + if is_pdf + cmd = "#{shell_quote CONVERT_BIN} #{shell_quote "#{source}[0]"} -thumbnail #{shell_quote size_option} #{shell_quote "png:#{target}"}" + else + cmd = "#{shell_quote CONVERT_BIN} #{shell_quote source} -auto-orient -thumbnail #{shell_quote size_option} #{shell_quote target}" + end unless system(cmd) logger.error("Creating thumbnail failed (#{$?}):\nCommand: #{cmd}") return nil @@ -61,6 +72,22 @@ module Redmine @convert_available end + def self.gs_available? + return @gs_available if defined?(@gs_available) + + if Redmine::Platform.mswin? + @gs_available = false + else + begin + `gs -version` + @gs_available = $?.success? + rescue + @gs_available = false + end + end + @gs_available + end + def self.logger Rails.logger end |