2010-08-16 21 views
5

Me gustaría que Paperclip cree 2 miniaturas para cada página de un archivo PDF de varias páginas que se cargue.Cómo hacer una miniatura de un PDF de varias páginas con clip

estoy corriendo Paperclip 2.3.1.1 y usar esto en mi modelo de Activos:

has_attached_file :asset, 
        :styles => { :medium => "800x600>", :thumb => "100x100>" } 

lo tanto, cuando subo un archivo pdf página 3, esperaba que esto crearía 2 aprobado por página (una a 800x600 y una imagen más pequeña a 100x100). En cambio, obtengo 3 carpetas creadas (thumb, medium, original) - la carpeta original contiene el archivo origianl pdf, mientras que thumb y medium contienen un pdf con solo la primera página del pdf, todo pixelado.

¿Qué debo hacer para que paperclip cree 2 pulgares para cada página del pdf? Idealmente, me gustaría una imagen por página como esta (6): imágenes creadas


activos/1/media/archivo-0.png

activos/1/media/archivo-1. png

activos/1/media/archivo-2.png

activos/1/pulgar/archivo-0.png

activos/1/pulgar/archivo-1.png

assets/1/thumb/file-2.png

¿Alguien sabe cómo hacer esto? ¿Necesito un procesador personalizado? Si es así, ¿cómo se vería el procesador?

Gracias.

Respuesta

9

Aquí cómo implementé una tarea similar.

modelo de documento:

class Document < ActiveRecord::Base 

    has_many :pages, :dependent => :destroy 

    has_attached_file :asset 

    after_asset_post_process :make_pages 

    private 

    def make_pages 
    if valid? 
     Paperclip.run('convert', "-quality #{Page::QUALITY} -density #{Page::DENSITY} #{asset.queued_for_write[:original].path} #{asset.queued_for_write[:original].path}%d.png") 
     images = Dir.glob("#{asset.queued_for_write[:original].path}*.png").sort_by do |line| 
     line.match(/(\d+)\.png$/)[1].to_i 
     end 

     images.each do |page_image| 
     pages.build(:asset => File.open(page_image)) 
     end 
     FileUtils.rm images 
    end 
    end 
end 

modelo Página:

class Page < ActiveRecord::Base 

    belongs_to :document 

    has_attached_file :asset 

    QUALITY = 100 
    DENSITY = '80x80' 

end 
+0

he intentar esta solución, pero el comando de conversión sólo parece generar una imagen 1 para la primera página. De lo contrario, funciona genial. ¿Algunas ideas? –

+1

Puedes jugar con el comando 'convert' desde el paquete Imagemagick en la terminal para depurarlo. – taro

+0

Gracias, he estado jugando con eso. Todavía no lo he hecho funcionar, solo genera 1 imagen para la primera página. –

2

Tengo una solución que funciona a medias para esto ... pero no es muy elegante. Realmente me gustaría encontrar algo mejor, pero pensé que lo compartiría de todos modos.

Empecé definiendo un grupo de nuevos estilos, uno para cada página ... hasta la cantidad de páginas que quiero que pueda manejar. (Estúpido, lo sé, pero no sé cómo acceder a las interpolaciones de trayectoria en Paperclip de manera que cada página se guarda/borrado en la tienda correctamente a menos que exista un estilo único para cada imagen)

{ ... 
:page_0 => {:geometry=>'800[0]', :format=>:png, :processors=>[:multipage_thumbnail]}, 
:page_1 => {:geometry=>'800[1]', :format=>:png, :processors=>[:multipage_thumbnail]}, 
:page_2 => {:geometry=>'800[2]', :format=>:png, :processors=>[:multipage_thumbnail]}, 
:page_3 => {:geometry=>'800[3]', :format=>:png, :processors=>[:multipage_thumbnail]}, 
:page_4 => {:geometry=>'800[4]', :format=>:png, :processors=>[:multipage_thumbnail]}, 
:page_5 => {:geometry=>'800[5]', :format=>:png, :processors=>[:multipage_thumbnail]}, 
} 

Entonces ... Tengo un procesador personalizado que subclasifica desde el procesador de Miniaturas, con cierta lógica adicional para ejecutar el comando de conversión con el número de página adecuado.

module Paperclip 
    # Handles thumbnailing images that are uploaded. 
    class MultipageThumbnail < Thumbnail 

    # Creates a Thumbnail object set to work on the +file+ given. It 
    # will attempt to transform the image into one defined by +target_geometry+ 
    # which is a "WxH"-style string. +format+ will be inferred from the +file+ 
    # unless specified. Thumbnail creation will raise no errors unless 
    # +whiny+ is true (which it is, by default. If +convert_options+ is 
    # set, the options will be appended to the convert command upon image conversion 
    def initialize file, options = {}, attachment = nil 
     @page = options[:geometry].match(/\[(\d+)\]/)[1] rescue 0 
     @page ||= 0 
     options[:geometry] = options[:geometry].sub(/\[\d+\]/, '') 
     super 
    end 

    # Performs the conversion of the +file+ into a thumbnail. Returns the Tempfile 
    # that contains the new image. 
    def make 
     return nil if @page >= page_count 

     src = @file 
     dst = Tempfile.new([@basename, @format].compact.join(".")) 
     dst.binmode 

     begin 
     options = [ 
      source_file_options, 
      "#{ File.expand_path(src.path) }[#{@page}]", 
      transformation_command, 
      convert_options, 
      "#{ File.expand_path(dst.path) }" 
     ].flatten.compact 

     success = Paperclip.run("convert", *options) 
     rescue PaperclipCommandLineError => e 
     raise PaperclipError, "There was an error processing the thumbnail for #{@basename}" if @whiny 
     end 

     dst 
    end 

    def page_count 
     @page_count ||= begin 
     files = Paperclip.run("identify", "#{@file.path}") 
     files.split(/\n/).size 
     rescue PaperclipCommandLineError 
     1 
     end 
    end 

    end 
end 
Cuestiones relacionadas