从rails paperclip中的pdf生成缩略图

如何在回形针中生成pdf的第一页作为缩略图?

我尝试了很多,但它没有用

has_attached_file :book_url, :styles => { :thumb => "100x100#", :small => "150x150>", :medium => "200x200" } 

这是将pdf的名称作为链接,但它没有给出pdf的第一页

  

Tadas的答案是正确的,但对于那些需要更多上下文的人,你可以这样做:下面的模型只为某些类型的文件创建缩略图(例如,它不会制作音频文件的缩略图),但会制作缩略图pdfs,图像文件和video文件:

 class Record < ActiveRecord::Base print self # for logging on heroku belongs_to :user # Ensure user has provided the required fields validates :title, presence: true validates :file_upload, presence: true validates :description, presence: true # Use the has_attached_file method to add a file_upload property to the Record # class. has_attached_file :file_upload, # In order to determine the styles of the image we want to save # eg a small style copy of the image, plus a large style copy # of the image, call the check_file_type method styles: lambda { |a| a.instance.check_file_type }, processors: lambda { |a| a.is_video? ? [ :ffmpeg ] : [ :thumbnail ] } # Validate that we accept the type of file the user is uploading # by explicitly listing the mimetypes we are willing to accept validates_attachment_content_type :file_upload, :content_type => [ "video/mp4", "video/quicktime", "image/jpg", "image/jpeg", "image/png", "image/gif", "application/pdf", "audio/mpeg", "audio/x-mpeg", "audio/mp3", "audio/x-mp3", "file/txt", "text/plain", "application/doc", "application/msword", "application/vnd.ms-excel", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "application/vnd.ms-powerpoint" ], :message => "Sorry! We do not accept the attached file type" # Before applying the Imagemagick post processing to this record # check to see if we indeed wish to process the file. In the case # of audio files, we don't want to apply post processing before_post_process :apply_post_processing? # Helper method that uses the =~ regex method to see if # the current file_upload has a content_type # attribute that contains the string "image" / "video", or "audio" def is_image? self.file_upload.content_type =~ %r(image) end def is_video? self.file_upload.content_type =~ %r(video) end def is_audio? self.file_upload.content_type =~ /\Aaudio\/.*\Z/ end def is_plain_text? self.file_upload_file_name =~ %r{\.(txt)$}i end def is_excel? self.file_upload_file_name =~ %r{\.(xls|xlt|xla|xlsx|xlsm|xltx|xltm|xlsb|xlam|csv|tsv)$}i end def is_word_document? self.file_upload_file_name =~ %r{\.(docx|doc|dotx|docm|dotm)$}i end def is_powerpoint? self.file_upload_file_name =~ %r{\.(pptx|ppt|potx|pot|ppsx|pps|pptm|potm|ppsm|ppam)$}i end def is_pdf? self.file_upload_file_name =~ %r{\.(pdf)$}i end def has_default_image? is_audio? is_plain_text? is_excel? is_word_document? end # If the uploaded content type is an audio file, # return false so that we'll skip audio post processing def apply_post_processing? if self.has_default_image? return false else return true end end # Method to be called in order to determine what styles we should # save of a file. def check_file_type if self.is_image? { :thumb => "200x200>", :medium => "500x500>" } elsif self.is_pdf? { :thumb => ["200x200>", :png], :medium => ["500x500>", :png] } elsif self.is_video? { :thumb => { :geometry => "200x200>", :format => 'jpg', :time => 0 }, :medium => { :geometry => "500x500>", :format => 'jpg', :time => 0 } } elsif self.is_audio? { :audio => { :format => "mp3" } } else {} end end end 

我想我曾经通过强制执行文件类型来实现它,例如

 :thumb => ["100x100#", :png] 

当然它并不理想,因为它会为每次上传强制执行此文件类型

万分感谢@duhaime的精彩回答。

由于这是我发现附加PDF的最完整的信息来源,我想进一步记录:

要求:

  • ImageMagick的
  • ghostscript(我忘了这个)
  • (可选)ffmpeg如果要处理video文件

我还替换了has_default_image?apply_post_processing? 单身:

  def can_thumbnail? self.check_file_type.try(:{], :thumb).present? end 

最后,我为不可翻转的附件创建了一个方法:

  def thumb return self.file.url(:thumb) if self.can_thumbnail? if self.is_video? '/thumb/video.png' else '/thumb/default.png' end end 

但再次感谢@duhaime