Преобразование PDF-файлов в PNG с помощью Dragonfly

У меня есть процессор Dragonfly, который должен взять данный PDF-файл и вернуть PNG первой страницы документа.

Когда я запускаю этот процессор через консоль, я получаю PNG, как и ожидалось, однако, когда в контексте Rails я получаю его в формате PDF.

Мой код примерно похож на это:

  def to_pdf_thumbnail(temp_object)
    tempfile = new_tempfile('png')
    args = "'#{temp_object.path}[0]' '#{tempfile.path}'"
    full_command = "convert #{args}"
    result = `#{full_command}`
    tempfile
  end

  def new_tempfile(ext=nil)
    tempfile = ext ? Tempfile.new(['dragonfly', ".#{ext}"]) : Tempfile.new('dragonfly')
    tempfile.binmode
    tempfile.close
    tempfile
  end

Теперь tempfile определенно создает файл.png, но конвертирование генерирует PDF (при запуске из Rails 3).

Любые идеи относительно того, что проблема может быть здесь? Что-то запутывается в типе контента?

Я должен добавить, что и это и стандартное преобразование (asset.png.url) оба дают PDF с содержимым PDF в виде небольшого блока в середине изображения (A4).

3 ответа

Подход, который я использую для этого, заключается в создании эскиза PNG на лету через thumb метод из плагина Dragonfly's ImageMagick:

<%= image_tag rails_model.file.thumb('100x100#', format: 'png', frame: 0).url %>

Пока установлен Ghostscript, ImageMagick/Dragonfly будет соблюдать настройки формата / кадра (то есть страницы PDF). Если file это изображение, а не PDF, оно будет преобразовано в PNG, а номер кадра будет проигнорирован (если это не GIF).

Разве преобразование не зависит от расширения для определения типа? Вы уверены, что у временных файлов есть правильные расширения?

Попробуй это

def to_pdf_thumbnail(temp_object)
  ret = ''
  tempfile = new_tempfile('png')
  system("convert",tmp_object.path[0],tmpfile.path)
  tempfile.open {|f| ret = f.read }
  ret
end

Проблема в том, что вы, вероятно, передаете аргумент convert ONE, а не два

Другие вопросы по тегам