2010-08-16 14 views
5

Mi piacerebbe avere Paperclip creare 2 miniature per ogni pagina di un file PDF multipagina che viene caricato.Come miniaturizzare un pdf multipagina con graffetta

Io corro Paperclip 2.3.1.1 e l'utilizzo di questo nel mio modello di asset:

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

Così, quando aggiungo un file pdf 3 pagina Speravo che questo creerebbe 2 pollici per pagina (uno a 800x600 e un'immagine più piccola a 100x100). Invece, ottengo 3 cartelle create (pollice, medio, originale) - la cartella originale contiene il file pdf originale, mentre pollice e supporto contengono ciascuno un pdf con solo la prima pagina del pdf tutto pixelato.

Cosa devo fare per ottenere paperclip per creare 2 pollici per ogni pagina del pdf? Idealmente, vorrei un'immagine per pagina come questo (6 immagini create):


beni/1/medio/su file 0.png

beni/1/medio/file-1. png

beni/1/medio/file-2.png

beni/1/pollice/file-0.png

beni/1/pollice/file-1.png

beni/1/pollice/file-2.png

Qualcuno sa come fare questo? Ho bisogno di un processore personalizzato? In tal caso, come sarebbe il processore?

Grazie.

risposta

9

Ecco come ho implementato un'attività simile.

modello del 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 

modello Pagina:

class Page < ActiveRecord::Base 

    belongs_to :document 

    has_attached_file :asset 

    QUALITY = 100 
    DENSITY = '80x80' 

end 
+0

ho di provare questa soluzione, ma il comando convert sembra solo per generare un'immagine 1 per la prima pagina. Altrimenti funziona alla grande. Qualche idea? –

+1

Puoi giocare con il comando 'convert' dal pacchetto Imagemagick nel terminale per eseguirne il debug. – taro

+0

Grazie, ci sto giocando. Ancora non è riuscito a farlo funzionare, genera solo 1 immagine per la prima pagina. –

2

Ho una soluzione semiadatta a questo ... ma non è molto elegante. Mi piacerebbe davvero venire con qualcosa di meglio, ma pensavo di condividere comunque.

Ho iniziato definendo un gruppo di nuovi stili, uno per ogni pagina ... fino a quante più pagine voglio essere in grado di gestire. (Stupido, lo so, ma non so come accedere alle interpolazioni di percorso in Paperclip in modo che ogni pagina viene salvata/cancellato nel negozio correttamente a meno che non ci sia uno stile unico per ogni immagine)

{ ... 
: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]}, 
} 

Poi ... Ho un processore personalizzato che sottoclasse dal processore Thumbnail, con qualche logica in più per eseguire il comando convert con la pagina corretta #.

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 
Problemi correlati