Ruby on rails 3 Carrierwave pdf至jpg缩略图,适用于Safari和x2B;iOS或IE、Firefox、Chrome,但不是两者都有

Ruby on rails 3 Carrierwave pdf至jpg缩略图,适用于Safari和x2B;iOS或IE、Firefox、Chrome,但不是两者都有,ruby-on-rails-3,image-processing,imagemagick,carrierwave,rmagick,Ruby On Rails 3,Image Processing,Imagemagick,Carrierwave,Rmagick,我正在竭尽全力,几天来一直在寻找解决办法。我试图采取上传的pdf文档,并创建一个缩略图,是所有浏览器上查看。我可以让它在Safari/iOS或Firefox/IE7+/Chrome上运行,但没有一个版本可以在任何地方运行。我尝试将颜色空间设置为rgb(无效果),将其转换为png而不是jpg(无效果),并设置为:set_content_type(无效果)。我在本地机器和生产(Heroku)上得到了相同的结果 pdfdoc_uploader.rb include ImageManipulators

我正在竭尽全力,几天来一直在寻找解决办法。我试图采取上传的pdf文档,并创建一个缩略图,是所有浏览器上查看。我可以让它在Safari/iOS或Firefox/IE7+/Chrome上运行,但没有一个版本可以在任何地方运行。我尝试将颜色空间设置为rgb(无效果),将其转换为png而不是jpg(无效果),并设置为:set_content_type(无效果)。我在本地机器和生产(Heroku)上得到了相同的结果

pdfdoc_uploader.rb

include ImageManipulators
include CarrierWave::RMagick
include CarrierWave::MimeTypes

version :thumb do

 process :convert => 'jpg'  #<---This works in Safari and iOS
 process :resize_to_fit => [200, 200]
 process :paper_shape
 process :strip
 process :convert => 'jpg'  #<---Move it here and it works everywhere else

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

我最终放弃了,只创建了两个版本,并使用useragent确定显示哪个版本。虽然不是一个有吸引力的选择,但它正在发挥作用。我希望有人能想出更好的解决办法

version :thumb_safari do #special version for safari and ios
  process :resize_to_fit => [200,200]
  process :convert => 'jpg'
  process :paper_shape
  def full_filename (for_file = model.logo.file)
     super.chomp(File.extname(super)) + '.jpg'
  end     
end

version :thumb do #all browsers except safari
  process :resize_to_fit => [200,200]
  process :convert => 'jpg' #must convert to jpg before running paper shape
  process :paper_shape
  process :convert => 'jpg' #after running paper_shape it will default to original file type
  def full_filename (for_file = model.logo.file)
    super.chomp(File.extname(super)) + '.jpg'
  end
end

def paper_shape
   manipulate! do |img|
     if img.rows*4 != img.columns*3
       width=img.columns
       height=img.columns/3*4
       img.crop!(0,0,width,height,true)
     else
       img
     end
   end
 end
在控制器/视图中,我使用了useragent gem并执行了以下操作:

文件\u controller.rb

def index
  @user_agent=UserAgent.parse(request.user_agent)
  @search = Document.search(params[:q])
end
index.html.rb

<% if @user_agent.browser.downcase == 'safari' %>
<%= link_to(image_tag(doc.pdfdoc_url(:thumb_safari).to_s, :class=>"dropshadow", :size => "150x225"), doc.pdfdoc_url)%>
<% else %>
<%= link_to(image_tag(doc.pdfdoc_url(:thumb).to_s, :class=>"dropshadow", :size => "150x225"), doc.pdfdoc_url)%>
<% end %>

“dropshadow”,:size=>“150x225”),doc.pdfdoc_url)%>
“dropshadow”,:size=>“150x225”),doc.pdfdoc_url)%>

毫无疑问,有更好的方法可以做到这一点,但目前这种方法正在发挥作用。

2.5年后,我也遇到了同样的问题,我的头发也比以前少了

当Carrierwave使用RMagick转换文件时,它调用
Operate
并传递一个
:option=>:format
操作方法,然后,如果它看到一个选项格式,则执行此操作(如中所示):

我认为,问题在于,它没有显式地设置文件内容,只是更改了扩展名

事实证明,一些浏览器(除了Safari)乐于根据文件扩展名解释图像,而Safari显然使用或检查文件头

因此,我的解决方案不是仅仅依靠Carrierwave/RMagick magic进行转换,而是在自定义过程中显式设置内容头,如下所示,我从另一个过程中直接提取:

您会注意到,调试器将在运行时打印application/pdf,确认
:convert
方法尚未工作(尚未!)

<% if @user_agent.browser.downcase == 'safari' %>
<%= link_to(image_tag(doc.pdfdoc_url(:thumb_safari).to_s, :class=>"dropshadow", :size => "150x225"), doc.pdfdoc_url)%>
<% else %>
<%= link_to(image_tag(doc.pdfdoc_url(:thumb).to_s, :class=>"dropshadow", :size => "150x225"), doc.pdfdoc_url)%>
<% end %>
if options[:format] || @format
    frames.write("#{options[:format] || @format}:#{current_path}", &write_block)
  move_to = current_path.chomp(File.extname(current_path)) + ".#{options[:format] || @format}"
    file.move_to(move_to, permissions, directory_permissions)
else
  frames.write(current_path, &write_block)
end
  version :png_thumb, :if => :pdf_document? do
    process :cover
    process :convert => :png
    process :resize_to_fit => [200, 300]
    process :set_content_type_png
    def full_filename (for_file = model.document.file)
      super.chomp(File.extname(super)) + '.png'
    end
  end

  def set_content_type_png(*args)
    Rails.logger.debug "#{file.content_type}"
    self.file.instance_variable_set(:@content_type, "image/png")
  end