2010-08-16 6 views
5

J'aimerais que Paperclip crée 2 vignettes pour chaque page d'un fichier PDF de plusieurs pages qui est téléchargé.Comment miniatures un pdf de plusieurs pages avec un trombone

Je suis en Paperclip 2.3.1.1 et en utilisant dans mon modèle de l'actif:

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

Alors, quand je télécharge un fichier 3 page pdf, j'espérais que cela créerait 2 pouces par page (un à 800x600 et une image plus petite à 100x100). Au lieu de cela, je reçois un 3 dossiers créés (pouce, moyen, original) - le dossier d'origine contient le fichier pdf origianl, tandis que le pouce et le médium contiennent chacun un pdf avec seulement la première page du pdf tout pixélisé.

Que dois-je faire pour obtenir un trombone pour créer 2 pouces pour chaque page du pdf? Idéalement, je voudrais une image par page comme celle (6 images créées):


actifs/1/moyen/fichier-0.png

actifs/1/moyen/fichier-1. .png

actifs/1/moyen/file-2.png

actifs/1/pouce/file-0.png

actifs/1/pouce/file-1.png

assets/1/thumb/file-2.png

Est-ce que quelqu'un sait comment faire cela? Ai-je besoin d'un processeur personnalisé? Si oui, à quoi ressemblerait le processeur?

Merci.

Répondre

9

Voici comment j'ai implémenté une tâche similaire.

modèle de document:

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 

modèle Page:

class Page < ActiveRecord::Base 

    belongs_to :document 

    has_attached_file :asset 

    QUALITY = 100 
    DENSITY = '80x80' 

end 
+0

J'ai essayé cette solution, mais la commande convert semble que pour générer 1 l'image pour la première page. Sinon, cela fonctionne très bien. Des idées? –

+1

Vous pouvez jouer avec la commande 'convert' du paquet Imagemagick dans le terminal pour le déboguer. – taro

+0

Merci, j'ai joué avec ça. Je ne l'ai toujours pas fait fonctionner, génère seulement 1 image pour la première page. –

2

J'ai une solution à moitié travaillante à cela ... mais ce n'est pas très élégant. Je voudrais vraiment trouver quelque chose de mieux, mais je pensais partager de toute façon.

J'ai commencé par définir un tas de nouveaux styles, un pour chaque page ... jusqu'à un nombre de pages que je veux être capable de gérer. (Stupide, je sais, mais je ne sais pas comment accéder au chemin interpolations dans Paperclip de sorte que chaque page est enregistré/supprimé dans le magasin bien moins qu'il y ait un style unique pour chaque image)

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

Ensuite, ... J'ai un processeur personnalisé qui sous-classe à partir du processeur Thumbnail, avec une logique supplémentaire pour exécuter la commande de conversion avec la bonne page #.

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 
Questions connexes