在Rails上使用PDFkit错误下载PDF

时间:2016-12-17 17:30:44

标签: ruby-on-rails ruby pdf-generation wkhtmltopdf pdfkit

我正在尝试将Rails5中的HTML视图下载为PDF,但是,每当我下载PDF时出现错误:无法加载PDF文档。我使用以下宝石:

gem'pdf kit' gem'wkhtmltopdf-binary'

这是我的控制器:

class InputController < ApplicationController

def index
    @inputs = Input.all
end


def show
    @input = Input.find_by(id: params[:id])

            send_data @pdf, :filename => @input.company + ".pdf",
                                    :type => "application/pdf",
                                    :disposition => "attachment"
end


end

当我输入下载URL时,即:localhost:3000 / input / 1.pdf我得到一个下载的pdf文件,但有错误:

enter image description here

我的节目视图非常简单:

<ul>
<li><%= @input.company %></li>
<li><%= @input.position %></li>
<li><%= @input.date %></li>
</ul>

任何帮助都将不胜感激。

最佳, 阿亚兹

更新

我也试过拿出@pdf并输入@input:

    def show
    @input = Input.find_by(id: params[:id])
            send_data @input, :filename => @input.company + ".pdf",
                                    :type => "application/pdf",
                                    :disposition => "attachment"
    end

结果没有变化

1 个答案:

答案 0 :(得分:3)

您的代码未向实例变量@pdf分配任何内容:

def show
  @input = Input.find_by(id: params[:id])

  send_data @pdf, :filename => @input.company + ".pdf",
                  :type => "application/pdf",
                  :disposition => "attachment"
end

和实例变量的默认值为nil。您需要执行以下操作:

input = Input.find_by(id: params[:id])

html = %Q{
<ul>
<li>#{input.company}</li>
<li>#{input.position}</li>
<li>#{input.date}</li>
</ul>
}

kit = PDFKit.new(html, :page_size => 'Letter')
pdf = kit.to_pdf


send_data pdf, :filename => input.company + ".pdf",
               :type => "application/pdf",
               :disposition => "attachment"

或者,如果你想阅读视图文件,那么通过ERB引擎运行它,如下所示:

file_path = File.expand_path("../views/input/show.html.erb", __FILE__)
erb_template = File.read(file_path)

@input = Input.find_by(id: params[:id])
renderer = ERB.new(erb_template)
html = renderer.result()

#As above...

来自Rails Guide

  

默认情况下,Rails中的控制器会自动呈现带有名称的视图   对应有效路线。
  ...
  ...
  规则是如果你没有在结尾处显式地呈现某些东西   一个控制器动作,Rails会自动寻找   action_name.html.erb模板在控制器的视图路径和渲染中   它

来自send_data()的文档:

  

此方法类似于render plain: data,但也允许您使用   指定浏览器是否应将响应显示为文件   附件(即在下载对话框中)或内联数据

因此,当您在控制器中调用send_data()时,您将显式呈现某些内容,因此不会发生action_name.html.erb文件的默认呈现。