我有一个半成品的解决方案,但它不太优雅。我真的想想出更好的方法,但我还是想分享一下。
我开始定义了一堆新样式,每一页都有一个... 直到我想要处理的页面数量。 (很蠢,我知道,但我不知道如何访问Paperclip中的路径插值,以便每个图像都能正确保存/删除,除非有每个图像的唯一样式)
{ ...
:page_0 => {:geometry=>'800[0]', :format=>:png, :processors=>[:multipage_thumbnail]},
:page_1 => {:geometry=>'800[1]', :format=>:png, :processors=>[:multipage_thumbnail]},
:page_2 => {:geometry=>'800[2]', :format=>:png, :processors=>[:multipage_thumbnail]},
:page_3 => {:geometry=>'800[3]', :format=>:png, :processors=>[:multipage_thumbnail]},
:page_4 => {:geometry=>'800[4]', :format=>:png, :processors=>[:multipage_thumbnail]},
:page_5 => {:geometry=>'800[5]', :format=>:png, :processors=>[:multipage_thumbnail]},
}
那么...我有一个自定义处理器,它是从缩略图处理器派生的,其中包含一些额外的逻辑,用于以正确的页面编号运行转换命令。
module Paperclip
class MultipageThumbnail < Thumbnail
def initialize file, options = {}, attachment = nil
@page = options[:geometry].match(/\[(\d+)\]/)[1] rescue 0
@page ||= 0
options[:geometry] = options[:geometry].sub(/\[\d+\]/, '')
super
end
def make
return nil if @page >= page_count
src = @file
dst = Tempfile.new([@basename, @format].compact.join("."))
dst.binmode
begin
options = [
source_file_options,
"#{ File.expand_path(src.path) }[#{@page}]",
transformation_command,
convert_options,
"#{ File.expand_path(dst.path) }"
].flatten.compact
success = Paperclip.run("convert", *options)
rescue PaperclipCommandLineError => e
raise PaperclipError, "There was an error processing the thumbnail for #{@basename}" if @whiny
end
dst
end
def page_count
@page_count ||= begin
files = Paperclip.run("identify", "#{@file.path}")
files.split(/\n/).size
rescue PaperclipCommandLineError
1
end
end
end
end
convert
е‘Ҫд»ӨиҝӣиЎҢи°ғиҜ•гҖӮ - taropages.destroy_all
的内容,以防文档资产发生更改(这样您就不会有旧图像留在那里了)。 - Nikos