2017-08-14 70 views
0

我将上传的PDF转换为图像,每页一个图像。我已经想出了如何使用MiniMagick::Tool::Convert生成图像,但我不知道如何编写上传器的version块,以便我可以访问一组图像URL。如何使用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处理这个图像集合的文件存储,而不是单个图像?

它也看起来像我可能需要添加一个新的数据库列来存储页数。有没有办法让我的上传者根据这个计数返回一组图片网址?

我也愿意切换到另一个宝石。用回形针,神龛或Refile,这会更容易些吗?

回答

1

随着靖国神社就可以使每个页面不同的版本:

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 

假设你有一个Document模型和你连接一个PDF到file附件栏,然后你可以检索使用Hash#values页的数组:

pages = document.file.values 
pages #=> [...array of pages...] 
pages.count #=> number of pages 
相关问题