Pytanie Wygeneruj miniaturkę z pliku PDF w spinaczu szynowym


Jak mogę wygenerować pierwszą stronę pliku pdf jako miniaturę w spinaczu?

Próbowałem dużo, ale to nie działa

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

Podaje nazwę pliku pdf jako link, ale nie podaje pierwszej strony pliku pdf

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

11
2018-01-04 11:12


pochodzenie




Odpowiedzi:


Odpowiedź Tadasa jest właściwa, ale dla tych, którzy potrzebują więcej kontekstu, możesz zrobić coś takiego: Poniższy model tworzy tylko miniatury dla niektórych rodzajów plików (np. Nie tworzy miniatur plików audio), ale robi miniatury dla pliki pdf, pliki obrazów i pliki wideo:

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

8
2018-04-27 19:32



Jak zrobić miniaturki dla plików Powerpoint? - Zero
Właśnie użyłem obrazu zastępczego magazynu dla plików PowerPoint. Mój projektant zrobił to: github.com/YaleDHLab/voices/blob/master/app/assets/images/... Użyliśmy podobnych obrazów zastępczych dla innych typów plików, takich jak arkusze kalkulacyjne Excel itp: github.com/YaleDHLab/voices/blob/master/app/assets/images/... - duhaime


Wydaje mi się, że kiedyś działałem, wymuszając typ pliku, np.

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

Oczywiście nie jest idealny, ponieważ wymusza ten typ pliku dla każdego przesłania


1
2018-01-04 12:00



nie, to nie działa pdf jest tam, więc najpierw musimy przekonwertować na png pierwszego. Podajemy tylko nazwę pliku, który to jest - Murali K


Dziękuje milionowi za @duhaime za jego piękną odpowiedź.

Ponieważ jest to najbardziej kompletne źródło informacji, które znalazłem w załączonym pliku PDF, chciałbym go udokumentować dalej:

Wymagania:

  • imagemagick
  • ghostscript (zapomniałem o tym)
  • (opcjonalnie) ffmpeg, jeśli chcesz obsługiwać pliki wideo

Również wymieniłem has_default_image? i apply_post_processing? z singlem:

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

Na koniec stworzyłem metodę dla niewymienialnych załączników:

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

Ale jeszcze raz dzięki @duhaime


0
2017-11-07 16:58