2017-08-14 108 views
0

アップロードされたPDFを画像に変換しています。 MiniMagick::Tool::Convertを使用して画像を生成する方法を考えましたが、画像URLの配列にアクセスできるように、アップローダのブロックversionを書き込む方法がわかりません。CarrierwaveとMiniMagick(Ruby on Rails)を使ってPDFを画像の配列に変換する方法

はここで、これまでの私のアップローダーです:

class DocumentUploader < CarrierWave::Uploader::Base 
    include CarrierWave::MiniMagick 

    storage :file 
    # storage :fog 

    def store_dir 
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}" 
    end 

    version :jpg do 
    process :convert_to_images 
    process :set_content_type_jpg 

    def convert_to_images(*args) 
     image = MiniMagick::Image.open(current_path) 
     image.pages.each_with_index do |page, index| 
     MiniMagick::Tool::Convert.new do |convert| 
      convert.background 'white' 
      convert.flatten 
      convert.density 300 
      convert.quality 95 
      convert << page.path 
      convert << "#{CarrierWave.root}/#{store_dir}/image-#{index}.jpg" 
     end 
     end 
    end 
    end 

    def set_content_type_jpg(*args) 
    self.file.instance_variable_set(:@content_type, "image/jpg") 
    end 

    # Add a white list of extensions which are allowed to be uploaded. 
    def extension_white_list 
    %w(jpg jpeg gif png doc docx pdf) 
    end 
end 

これは正しいディレクトリにimage-0.jpgimage-1.jpgなどを生成します。しかし、今私は自分の見解でそれらの画像を参照する方法、またはそこにいくつがあるか知る方法がありません。これはS3に画像をアップロードする必要があるときにも機能しません。 Carrierwaveに、単一のイメージではなく、このイメージコレクションのファイルストレージを処理させるにはどうすればよいですか?

また、ページ数を格納するために新しいデータベース列を追加する必要があるようです。アップローダーにこの数に基づいて一連の画像URLを返す方法はありますか?

私はまた別の宝石に切り替えるつもりです。これは、Paperclip、Shrine、Refileで簡単にできるものでしょうか?あなたは、各ページに異なるバージョンにすることができ神社で

答えて

1

:あなたはDocumentモデルを持っていて、file添付ファイルフィールドにPDFを添付仮定し

class ImageUploader < Shrine 
    plugin :versions 
    plugin :processing 

    process(:store) do |io, context| 
    pdf  = io.download 
    versions = {} 

    image = MiniMagick::Image.new(pdf.path) 
    image.pages.each_with_index do |page, index| 
     page_image = Tempfile.new("version-#{index}", binmode: true) 
     MiniMagick::Tool::Convert.new do |convert| 
     convert.background 'white' 
     convert.flatten 
     convert.density 300 
     convert.quality 95 
     convert << page.path 
     convert << page_image.path 
     end 
     page_image.open # refresh updated file 
     versions[:"page_#{index + 1}"] = page_image 
    end 

    versions 
    end 
end 

は、あなたがしてHash#valuesを使用してページの配列を取得できます。

pages = document.file.values 
pages #=> [...array of pages...] 
pages.count #=> number of pages 
関連する問題