2013-04-24 1 views
3

Я могу загрузить PDF-файл и преобразовать его в формат PNG, и он правильно отображается в браузере с помощью помощника <%= image_tag "path/to/image" %>. Однако фактическое расширение файла НЕ изменяется с PDF на PNG. Поэтому, если вы загружаете изображение, оно загружается как image.pdf. Как только он будет загружен, если вы измените расширение вручную на «png», он правильно откроет программное обеспечение для изображений на локальном компьютере. Я хотел бы, чтобы процесс RMagick автоматически изменял расширение, а также формат файла. Я могу написать код, который удаляет PDF-файл и добавляет расширение PNG, когда файл будет сохранен, но похоже, что я что-то пропустил. Я решил, что это то, что нужно делать автоматически, когда я конвертирую в другой формат. Вот мой класс ImageUploader.rb. Я использую Carrierwave и RMagick.Rails 4 Carrierwave + RMagick, конвертирование PDF в PNG изменяет кодировку файла, но не расширение?

# app/uploads/image_uploader.rb 
class ImageUploader < CarrierWave::Uploader::Base 
    include CarrierWave::RMagick 
    include Sprockets::Rails::Helper 

    storage :file 

    def store_dir 
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}" 
    end 

    process :convert_to_png 

    def convert_to_png 
    manipulate!(format: "png", read: { density: 400 }) do |img, index, options| 
     options = { quality: 100 } 
     img.resize_to_fill!(850, 1100) 
     img 
    end 
    end 

# Add 'png' file extension so file becomes 'image.pdf.png' 
def filename 
    "#{original_filename}.png" if original_filename 
    end 
end 

ответ

1

Это, как я его обработки не хватает:

version :pdf_thumb, :if => :pdf? do 
    process :thumbnail_pdf 
    process :set_content_type_png 

    def full_filename (for_file = model.artifact.file) 
    super.chomp(File.extname(super)) + '.png' 
    end 
end 

def thumbnail_pdf 
    manipulate! do |img| 
    img.format("png", 1) 
    img.resize("150x150") 
    img = yield(img) if block_given? 
    img 
    end 
end 

def set_content_type_png(*args) 
    self.file.instance_variable_set(:@content_type, "image/png") 
end 
0

Я также пытаясь создать эскиз для загруженного pdf, пока он отлично подходит для одностраничных PDF-файлов. Для многостраничных pdf-файлов метод создает эскиз по желанию, но при открытии файла он показывает «Неустранимая ошибка при чтении файла изображения PNG: не файл PNG».

Это, как я это делаю:

version :pdf_thumb, :if => :pdf? do 
    process :convert => 'png' 
    process :resize_to_limit => [120, 120] 
    def full_filename (for_file = model.artifact.file) 
     super.chomp(File.extname(super)) + '.png' 
    end 
    end 
protected 

    def pdf?(new_file) 
    new_file.content_type.include? "/pdf" 
    end 

Итак, я хотел бы знать, как вы смогли сделать создать миниатюру из PDF?