1

私は髪を抜いて、何日も解決策を探していました。アップロードされたPDFドキュメントを取得して、すべてのブラウザで表示できるサムネイルを作成しようとしています。Safari/iOSまたはFirefox/IE7 + / Chromeで動作させることはできますが、どこでも動作するバージョンは1つではありません。色空間をrgb(効果なし)に設定し、jpg(効果なし)ではなくpngに変換して、: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

image_manipulators.rb

module ImageManipulators

# creates an image with a 3x4 aspect ratio
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

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

# Autoorients image according to exif
 def auto_orient
   manipulate! {|img| img.auto_orient! || img }
 end

 # Crops the biggest possible square from the image
 def biggest_square
   manipulate! do |img|
     if img.rows != img.columns
       max = img.rows > img.columns ? img.columns : img.rows
       img.crop!(0,0,max,max,true)
     else
       img
     end
   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

 # Create rounded corners for the image
 def rounded_corners
   radius = 10
   manipulate! do |img|
     #create a masq of same size
     masq = Magick::Image.new(img.columns, img.rows)
     d = Magick::Draw.new
     d.roundrectangle(0, 0, img.columns - 1, img.rows - 1, radius, radius)
     d.draw(masq)
     img.composite(masq, 0, 0, Magick::LightenCompositeOp)
   end
 end

 # Rotates the image based on the EXIF Orientation
     def fix_exif_rotation
       manipulate! do |img|
         img.auto_orient!
         img = yield(img) if block_given?
         img
       end
     end

     # Strips out all embedded information from the image
     def strip
       manipulate! do |img|
         img.strip!
         img = yield(img) if block_given?
         img
       end
     end

     def colorspace(cs)
         manipulate! do |img|
           case cs
           when 'rgb'
             img.colorspace = Magick::RGBColorspace
           when 'cmyk'
             img.colorspace = Magick::CMYKColorspace
           end
           img = yield(img) if block_given?
           img
         end
       end
end
4

2 に答える 2

2

2.5年後、私は同じ問題を抱えていました、そして私も以前より髪が少なくなっています。

CarrierwaveがRMagickを使用してファイルを変換する場合、Carrierwaveはを呼び出しmanipulate!て渡します:option => :format。次にmanipulate!、メソッドはオプション形式を検出すると、これを実行します(lib /carrierwave/processing/rmagick.rbにあります)。

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

問題は、これが行わないのはファイルの内容を明示的に設定することであり、拡張子を変更するだけだと思います。

そして、結局のところ、一部のブラウザ(Safariを除くすべて)はファイル拡張子に基づいて画像を喜んで解釈しますが、Safariは(明らかに)ファイルヘッダーを使用またはチェックします。

したがって、私の解決策は、Carrierwave / RMagickの魔法だけに依存して変換するのではなく、別のスタックの質問から直接引き出した、次のようなカスタムプロセスでコンテンツヘッダーを明示的に設定することでもありました。

  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

そして、デバッガーが進行中にapplication / pdfを出力し、:convertメソッドが機能していないことを確認します(まだ!)。

于 2015-07-25T11:08:51.037 に答える
0

私は最終的にあきらめて2つのバージョンを作成し、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を使用して、これを実行しました。

document_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 %>

これを行うためのより良い方法があることは間違いありませんが、これは今のところ機能しています。

于 2012-11-11T23:19:59.623 に答える