summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorGo MAEDA <maeda@farend.jp>2019-05-12 03:55:56 +0000
committerGo MAEDA <maeda@farend.jp>2019-05-12 03:55:56 +0000
commitc4a4133178b83c2c115df1947302c785b2885467 (patch)
tree10aeb523e06a613a9b8942b67cae947a23b2b4e9 /lib
parenta5b9632772294981b5c96fb5f8273a386d84f90c (diff)
downloadredmine-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.rb33
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