pdftk, временный файл и рельсы

Хорошо, я пробовал все виды вещей, и я не совсем уверен, что это сработает. PDF-файлы, которые мне нужно объединить, находятся на сервере, и ссылки на них жестко закодированы. pdftk работает локально в моем терминале, но не с этими удаленными ссылками. Поэтому я не уверен, что это сработает, как только я запущу его в производство.

По сути, я пытаюсь написать метод, который будет извлекать выбранную группу PDF-файлов и объединять их в один PDF-файл для загрузки пользователем.

Но мне трудно понять, как использовать временные файлы и запускать команды терминала через приложение rails.

Вот метод:

def create
@routes = TransitRoute.find(params[:selected_routes])
@selected_routes = @routes.collect {|x| x.new_pdf_link + " "}
Tempfile.open('prefix', "#{Rails.root}/tmp") do |f|
    f.print("pdftk #{@selected_routes} cat output temporary.pdf")
    f.flush
    f.read
  end

respond_to do |format|
  format.html
end
end

У меня есть пара вопросов:

  1. В моем временном файле записана правильная командная строка:

    pdftk 1.pdf 2.pdf вывод кота new.pdf

Как мне запустить эту строку, чтобы создать новый.pdf?

  1. Должен ли я заменить временный файл новым pdf-файлом, записать в него новый pdf-файл или просто создать новый pdf-файл в своем собственном месте? Если второе, то как мне сделать его временным?

  2. Как мне получить ссылку на новый PDF-файл, чтобы пользователи могли его скачать?

Некоторые из них могут быть базовыми, но мне никогда не приходилось возиться с временными файлами для динамического создания PDF-файлов.

Ах да, и это приложение тоже есть в Rails 2.3.

Спасибо за любую помощь.


person Gabe K    schedule 26.07.2011    source источник


Ответы (1)


Ок, у меня работает. Вот новый код, если у кого-то есть совет по улучшению или есть тот же вопрос:

def create
 file = Tempfile.new('temp_route_pdf', "#{Rails.root}/tmp/")
 @routes = TransitRoute.find(params[:selected_routes])
 selected_routes = @routes.collect {|x| x.new_pdf_link + " "}
 route_names = @routes.collect {|x| x.short_name + "_"}
 @generated_pdf_file = "#{route_names}routes.pdf"
 `pdftk #{selected_routes}cat output #{file.path}`
 raise Exception unless $?.success?
 send_file( "#{file.path}",
       :type => "application/pdf",
       :filename => "#{@generated_pdf_file}",
       :disposition => 'inline')
end
person Gabe K    schedule 28.07.2011