Feature #22915 ยป pdf_thumbnails.patch
| app/models/attachment.rb | ||
|---|---|---|
| 193 | 193 |
end |
| 194 | 194 | |
| 195 | 195 |
def image? |
| 196 |
!!(self.filename =~ /\.(bmp|gif|jpg|jpe|jpeg|png)$/i) |
|
| 196 |
!!(self.filename =~ /\.(bmp|gif|jpg|jpe|jpeg|png|pdf|tiff|tif)$/i)
|
|
| 197 | 197 |
end |
| 198 | 198 | |
| 199 | 199 |
def thumbnailable? |
| ... | ... | |
| 214 | 214 |
size = Setting.thumbnails_size.to_i |
| 215 | 215 |
end |
| 216 | 216 |
size = 100 unless size > 0 |
| 217 |
target = File.join(self.class.thumbnails_storage_path, "#{id}_#{digest}_#{size}.thumb")
|
|
| 217 |
target = File.join(self.class.thumbnails_storage_path, "#{id}_#{digest}_#{size}.thumb.png")
|
|
| 218 | 218 | |
| 219 | 219 |
begin |
| 220 | 220 |
Redmine::Thumbnail.generate(self.diskfile, target, size) |
| ... | ... | |
| 227 | 227 | |
| 228 | 228 |
# Deletes all thumbnails |
| 229 | 229 |
def self.clear_thumbnails |
| 230 |
Dir.glob(File.join(thumbnails_storage_path, "*.thumb")).each do |file| |
|
| 230 |
Dir.glob(File.join(thumbnails_storage_path, "*.thumb.png")).each do |file|
|
|
| 231 | 231 |
File.delete file |
| 232 | 232 |
end |
| 233 | 233 |
end |
| lib/redmine/thumbnail.rb | ||
|---|---|---|
| 29 | 29 |
return nil unless convert_available? |
| 30 | 30 |
unless File.exists?(target) |
| 31 | 31 |
# Make sure we only invoke Imagemagick if this is actually an image |
| 32 |
unless File.open(source) {|f| MimeMagic.by_magic(f).try(:image?)}
|
|
| 32 |
unless File.open(source) {|f| MimeMagic.by_magic(f).try(:image?) || MimeMagic.by_magic(f).child_of?('application/pdf')}
|
|
| 33 | 33 |
return nil |
| 34 | 34 |
end |
| 35 | 35 |
directory = File.dirname(target) |
| ... | ... | |
| 37 | 37 |
FileUtils.mkdir_p directory |
| 38 | 38 |
end |
| 39 | 39 |
size_option = "#{size}x#{size}>"
|
| 40 |
cmd = "#{shell_quote CONVERT_BIN} #{shell_quote source} -thumbnail #{shell_quote size_option} #{shell_quote target}"
|
|
| 40 |
cmd = "#{shell_quote CONVERT_BIN} #{shell_quote source}[0] -thumbnail #{shell_quote size_option} #{shell_quote target}"
|
|
| 41 | 41 |
unless system(cmd) |
| 42 | 42 |
logger.error("Creating thumbnail failed (#{$?}):\nCommand: #{cmd}")
|
| 43 | 43 |
return nil |
| test/fixtures/attachments.yml | ||
|---|---|---|
| 267 | 267 |
filename: root_attachment.txt |
| 268 | 268 |
filesize: 54 |
| 269 | 269 |
author_id: 2 |
| 270 |
attachments_021: |
|
| 271 |
content_type: application/pdf |
|
| 272 |
downloads: 0 |
|
| 273 |
created_on: 2016-05-27 15:23:14 +09:00 |
|
| 274 |
disk_filename: 146435549450_testfile_1.pdf |
|
| 275 |
disk_directory: "2016/05" |
|
| 276 |
container_id: 14 |
|
| 277 |
digest: ab39db5ed28060b91c9d9b086473d65a |
|
| 278 |
id: 21 |
|
| 279 |
container_type: Issue |
|
| 280 |
description: "" |
|
| 281 |
filename: testfile.pdf |
|
| 282 |
filesize: 7870 |
|
| 283 |
author_id: 2 |
|
| test/unit/attachment_test.rb | ||
|---|---|---|
| 392 | 392 |
assert_equal true, Attachment.new(:filename => 'test.jpg').thumbnailable? |
| 393 | 393 |
end |
| 394 | 394 | |
| 395 |
def test_thumbnailable_should_be_true_for_pdfs |
|
| 396 |
assert_equal true, Attachment.new(:filename => 'test.pdf').thumbnailable? |
|
| 397 |
end |
|
| 398 | ||
| 395 | 399 |
def test_thumbnailable_should_be_true_for_non_images |
| 396 | 400 |
assert_equal false, Attachment.new(:filename => 'test.txt').thumbnailable? |
| 397 | 401 |
end |
| ... | ... | |
| 402 | 406 |
attachment = Attachment.find(16) |
| 403 | 407 |
Attachment.clear_thumbnails |
| 404 | 408 | |
| 405 |
assert_difference "Dir.glob(File.join(Attachment.thumbnails_storage_path, '*.thumb')).size" do |
|
| 409 |
assert_difference "Dir.glob(File.join(Attachment.thumbnails_storage_path, '*.thumb.png')).size" do |
|
| 410 |
thumbnail = attachment.thumbnail |
|
| 411 |
assert_equal "16_8e0294de2441577c529f170b6fb8f638_100.thumb.png", File.basename(thumbnail) |
|
| 412 |
assert File.exists?(thumbnail) |
|
| 413 |
end |
|
| 414 |
end |
|
| 415 | ||
| 416 |
def test_thumbnail_should_generate_the_thumbnail_from_pdf |
|
| 417 |
set_fixtures_attachments_directory |
|
| 418 |
attachment = Attachment.find(21) |
|
| 419 |
Attachment.clear_thumbnails |
|
| 420 | ||
| 421 |
assert_difference "Dir.glob(File.join(Attachment.thumbnails_storage_path, '*.thumb.png')).size" do |
|
| 406 | 422 |
thumbnail = attachment.thumbnail |
| 407 |
assert_equal "16_8e0294de2441577c529f170b6fb8f638_100.thumb", File.basename(thumbnail)
|
|
| 423 |
assert_equal "21_ab39db5ed28060b91c9d9b086473d65a_100.thumb.png", File.basename(thumbnail)
|
|
| 408 | 424 |
assert File.exists?(thumbnail) |
| 409 | 425 |
end |
| 410 | 426 |
end |