pdftk,tempfile和rails

时间:2011-07-26 19:51:15

标签: ruby-on-rails pdftk temporary-files

好的,我尝试了各种各样的东西,我不完全确定这会有用。我需要合并的pdfs是在服务器上,并且它们的链接是硬编码的。 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 cat output new.pdf

  2. 如何运行此行以便创建new.pdf?

    1. 我是否应该用新的pdf替换tempfile,或者将新的pdf写入它或者只是在它自己的位置创建新的pdf?如果是后者,我该如何让它成为临时的?

    2. 如何获取新pdf的链接,以便用户下载?

    3. 其中一些可能是基本的东西,但我从来没有像这样动态制作pdf的动态文件。

      哦是的,这个应用程序也在Rails 2.3中

      感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

好的,我有它的工作。这是新代码,因为某人有改进建议或有相同的问题:

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