使用Carrierwave对PNG进行多页PDF处理

时间:2012-06-11 21:50:28

标签: ruby-on-rails upload carrierwave rmagick

我正在使用Carrierwave在我的Rails应用程序中上传PDF。我的目标是将PDF中的每个页面转换为PNG,并确保每个PNG都位于Carrierwave根据我的模型等创建的上传目录中。

目前的进展是我可以上传PDF,将其转换为Carrierwave创建的临时目录中的一系列PNG,但我无法找到将这些转换后的PNG移动到指定的上传目录的正确方法:

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

更新 - 在我当前的尝试和错误代码

下面添加

我目前的代码如下:

def extract(format)
  cache_stored_file! if !cached?
  images = Magick::ImageList.new(current_path)
  images.write File.dirname( current_path ) << "/" << filename
end

def filename
  super != nil ? super.split('.').first + '.png' : super
end

所有尝试使用上传目录的任何方法移动文件都会导致某种“无此类文件或目录”错误。例如使用:

images.each do |f|
  FileUtils.mv f.filename, File.join("#{Rails.root}/#{store_dir}", "image-0.png")
end

Errno::ENOENT (No such file or directory - 
(/Users/reggie/ExampleApp/public/uploads/tmp/20120611-2259-7520-3647/image-0.png,
 /Users/reggie/ExampleApp/public/uploads/painting/image/39/image-0.png))

欢迎提出任何建议,以帮助我完成我所遇到的这面墙。

关于为什么我没有使用manipulate逻辑的旁注,示例代码(见下文)与上面的结果相同,即Carrierwave创建的临时目录中的转换文件, 所有转换后的图片都保留.pdf文件扩展名。

manipulate!(:format => :png) do |img|
  img
end

2 个答案:

答案 0 :(得分:1)

好吧,你的主要问题是你的存储文件夹不存在。

Carrierwave路径构建与“public”文件夹相关。

你应该在你的上传者中使用这样的东西:

process :generate_png

protected
def generate_png
    manipulate! do |image, index|
        image.format = 'png'
        image.write("#{Rails.root}/public/#{store_dir}/image-#{index}.png")
        ...
    end
end

要删除这些文件,请使用callback

before :remove, :clear_uploader 

protected
def clear_uploader
   ...
end

答案 1 :(得分:0)

如果您对文件重命名的范围进行了适当的设置,则可能能够正确地重命名文件。

对于我来说,这是为了上传SVG,但仅将缩略图重命名为PNG。注意重命名功能在缩略图生成块中的作用范围

  version :thumb do
    def full_filename(for_file)
      super(for_file).chomp(File.extname(super(for_file))) + '.png'
    end
    process :convert => 'png'
    process resize_to_fit: [50, 50]
  end

您也许可以得到您的证明书!如果为full_filename函数输入类似的def,则具有正确的文件后缀。