5

<%= image_tag "path/to/image" %>我可以上传 PDF 并将其转换为 PNG 格式,并通过帮助程序在浏览器中正确呈现。但是,实际的文件扩展名并未从 PDF 更改为 PNG。因此,如果您下载图像,它会下载为 image.pdf。下载后,如果您将扩展名手动更改为“png”,它会在本地计算机上正确打开图像软件。我希望 RMagick 进程自动更改扩展名和文件格式。我可以编写一些代码来删除 PDF 并在保存文件时添加 PNG 扩展名,但似乎我在这里遗漏了一些东西。我认为这是在我转换为不同格式时应该自动完成的事情。这是我的ImageUploader.rb课。我正在使用 Carrierwave 和 RMagick。

# app/uploads/image_uploader.rb
class ImageUploader < CarrierWave::Uploader::Base
  include CarrierWave::RMagick
  include Sprockets::Rails::Helper

  storage :file

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

  process :convert_to_png

  def convert_to_png
    manipulate!(format: "png", read: { density: 400 }) do |img, index, options|
      options = { quality: 100 }
      img.resize_to_fill!(850, 1100)
      img
    end
  end

 # Add 'png' file extension so file becomes 'image.pdf.png'
 def filename
    "#{original_filename}.png" if original_filename
  end
end
4

3 回答 3

2

这就是我的处理方式:

version :pdf_thumb, :if => :pdf? do
  process :thumbnail_pdf
  process :set_content_type_png

  def full_filename (for_file = model.artifact.file)
    super.chomp(File.extname(super)) + '.png'
  end
end

def thumbnail_pdf
  manipulate! do |img|
    img.format("png", 1)
    img.resize("150x150")
    img = yield(img) if block_given?
    img
  end
end

def set_content_type_png(*args)
  self.file.instance_variable_set(:@content_type, "image/png")
end
于 2014-11-11T20:19:39.797 回答
1

这是一个已知问题:https ://github.com/carrierwaveuploader/carrierwave/issues/368#issuecomment-3597643

所以不,你没有错过任何东西:)

于 2013-07-12T08:19:46.283 回答
0

我也在尝试为上传的 pdf 创建一个缩略图,到目前为止它适用于单页 pdf。对于多页 pdf,该方法会根据需要创建缩略图,但在打开文件时,会显示“读取 PNG 图像文件的致命错误:不是 PNG 文件”。

这就是我的做法:

  version :pdf_thumb, :if => :pdf? do
     process :convert => 'png'
     process :resize_to_limit => [120, 120]
     def full_filename (for_file = model.artifact.file)
        super.chomp(File.extname(super)) + '.png'
     end
  end
protected

  def pdf?(new_file)
    new_file.content_type.include? "/pdf"
  end

所以,我想知道你是如何从 pdf 创建缩略图的?

于 2015-03-18T07:42:11.567 回答