11

Как я могу создать первую страницу pdf в виде миниатюры в paperclip?Создать миниатюру Из pdf в rails paperclip

Я пробовал много, но это не работает

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

Это дает имя PDF в качестве ссылки, но это не дает первую страницу в PDF

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

ответ

1

Я думаю, что я после того, как он работает, применяя тип файла, например

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

, конечно, это не является идеальным, поскольку он обеспечивает соблюдение этого типа файла для каждого загрузить

+0

нет, это не работает в формате PDF так что сначала нам нужно преобразовать в png first.it, давая только имя файла, который это –

8

ответ 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 
+0

Как сделать эскиз для файлов PowerPoint? – Zero

+0

Я просто использовал изображение заполнителя для файлов PowerPoint. Мой дизайнер сделал это: https://github.com/YaleDHLab/voices/blob/master/app/assets/images/placeholder_images/ppt.png Мы использовали похожие изображения-заполнители для других типов файлов, таких как электронные таблицы Excel и т. Д .: https://github.com/YaleDHLab/voices/blob/master/app/assets/images/placeholder_images/xls.png – duhaime

0

Огромное спасибо @duhaime за его красивой ответ.

Поскольку это наиболее полный источник информации, которую я нашел, чтобы PDF прилагается, я хотел бы, чтобы документировать его дальше:

Требования:

  • ImageMagick
  • Ghostscript (я забыл о это один)
  • (необязательно) FFmpeg, если вы хотите обрабатывать видео файлы

Также я заменил has_default_image? и apply_post_processing? с единственным:

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

Наконец я создал метод для не-thumbable вложений:

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