2012-08-10 13 views
12

Estoy procesamiento miniatura para el archivo PDF de esta manera:Cómo crear miniatura de la primera página pdf con carrierwave

version :thumb do 
    process :resize_to_limit => [260, 192] 
    process :convert => :jpg 
    process :set_content_type 
    end 

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

Pero cuando archivo PDF de varias páginas se produce en miniatura de todas las páginas en un archivo jpg. ¿Hay alguna forma de producir miniaturas solo para la primera página?

Respuesta

14

Presenté un patch a principios de este año para hacer precisamente esto. Use un procesador personalizado:

def cover 
    manipulate! do |frame, index| 
    frame if index.zero? 
    end 
end 

process :cover 
2

Me encontré con esta publicación cuando buscaba una solución para este mismo problema. Cuando convierte un pdf a jpeg crea un archivo pdf largo con todas las páginas adjuntas de extremo a extremo, por lo que debe recortar la imagen a la relación de aspecto que desee y descartar el resto. A continuación se muestra lo que terminé usando:

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 

En el controlador/vista He utilizado el agente de usuario joya y lo hizo:

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

Sin duda, hay una mejor manera de hacerlo, pero esto está funcionando por ahora.

7

¡Gran solución de Tanzeeb! Gracias.

para que yo pudiera hacer algo como esto:

def cover 
    manipulate! do |frame, index| 
     frame if index.zero? 
    end 
    end 

y se utiliza esto para la generación del pulgar

version :thumb do 
    process :cover  
    process :resize_to_fill => [50, 50, Magick::NorthGravity] 
    process :convert => 'png' 
    end 

genial!

Cuestiones relacionadas