【问题标题】:Generate Thumbnail From pdf in rails paperclip在rails回形针中从pdf生成缩略图
【发布时间】:2014-01-04 11:12:41
【问题描述】:

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

试了很多次都没用

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

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

<%= link_to 'My PDF', @book.book_url.url %> 

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.1 ruby-on-rails-4 paperclip


    【解决方案1】:

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

    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
        # e.g. 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
    

    【讨论】:

    【解决方案2】:

    我想我曾经通过强制执行文件类型来让它工作,例如

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

    当然不是很理想,因为每次上传都会强制使用这种文件类型

    【讨论】:

    • 不,它不工作 pdf 在那里所以首先我们需要转换成第一个的 png。它只给出文件的名称
    【解决方案3】:

    非常感谢 @duhaime 的精彩回答。

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

    要求:

    • imagemagick
    • ghostscript(这个我忘了)
    • (可选)ffmpeg 如果你想处理视频文件

    我也将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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-27
      • 1970-01-01
      • 2016-12-14
      • 2012-12-12
      • 2011-11-28
      相关资源
      最近更新 更多