pdftk, tempfile и рельсы - PullRequest
       19

pdftk, tempfile и рельсы

0 голосов
/ 26 июля 2011

Хорошо, я пробовал все виды вещей, и я не совсем уверен, что это будет работать. 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

Как запустить эту строку для создания new.pdf?

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

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

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

О да, и это приложение также в Rails 2.3

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

1 Ответ

2 голосов
/ 28 июля 2011

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

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
...