Преобразование 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, а не два