在Rails3中,我使用它WickedPDF gem来渲染我的一个模型的PDF格式.这很好用:/invoices/123返回HTML,/invoices/123.pdf下载PDF.
在我的发票模型中,我使用state_machine gem来跟踪发票状态.当发票从"未开单"状态变为"开票"状态时,我想获取发票PDF的副本并使用CarrierWave将其附加到发票模型.
我将这三个部分分开工作:控制器创建PDF视图,模型跟踪状态并在进行正确转换时触发回调,并正确设置CarrierWave.但是,我有一段时间让他们一起玩得很好.
如果我只是想获取发票的HTML版本,我可以render_to_string从模型中调用.但render_to_string似乎在收到PDF二进制文件时窒息.如果我可以获得一个数据流,那么很容易将这些数据写入临时文件并将其附加到上传器,但我无法弄清楚如何获取数据流.
有什么想法吗?代码如下:
发票控制器
def show
@invoice = @agg_class.find(params[:id])
respond_to do |format|
format.pdf do
render_pdf
end
format.html # show.html.erb
format.json { render json: @aggregation }
end
end
Run Code Online (Sandbox Code Playgroud)
...
def render_pdf(options = {})
options[:pdf] = pdf_filename
options[:layout] = 'pdf.html'
options[:page_size] = 'Letter'
options[:wkhtmltopdf] = '/usr/local/bin/wkhtmltopdf'
options[:margin] = {
:top => '0.5in',
:bottom => '1in',
:left => '0in',
:right => '0in'
}
options[:footer] = {
:html => { …Run Code Online (Sandbox Code Playgroud) 这是一个奇怪的小问题,导致我在SO上发布我的第一个问题.我使用wkhtmltopdf将HTML文档转换为PDF作为Rails应用程序的一部分.为此,我将Rails网页呈现为临时目录中的静态HTML文件,将静态页眉,页脚和图像复制到同一临时目录,然后使用"system"执行wkhtmltopdf.
这在开发和测试环境中非常有效.在我的Staging环境中,它没有.我首先怀疑权限,但该过程的前几部分(创建HTML静态文件并将它们复制到目录中)正在运行.我可以从该临时目录中的命令行运行wkhtmltopdf并获得预期的结果.最后,我通过"系统"和反引号在staging环境中通过Rails控制台运行wkhtmltopdf,这是我得到的输出:
> `wkhtmltopdf --footer-html tmp/invoices/footer.html --header-html tmp/invoices/header.html -s Letter -L 0in -R 0in -T 0.5in -B 1in tmp/invoices/test.html tmp/invoices/this.pdf`
Loading pages (1/6)
QPainter::begin(): Returned false ] 10%
Error: Unable to write to destination
Error: Failed loading page http://tmp/invoices/test.html (sometimes it will work just to ignore this error with --load-error-handling ignore) => ""
Run Code Online (Sandbox Code Playgroud)
注意最后一位.我指的是本地文件,但它正在通过http查找它们.好吧,我想,也许我需要明确并将其提供给file://协议,因此它不会寻找http.所以我试试这个:
> system("wkhtmltopdf --footer-html file://Library/Server/Web/Data/Sites/intranet-staging/current/tmp/invoices/footer.html --header-html file://Library/Server/Web/Data/Sites/intranet-staging/current/tmp/invoices/header.html -s Letter -L 0in -R 0in -T 0.5in -B 1in file://Library/Server/Web/Data/Sites/intranet-staging/current/tmp/invoices/test.html file://Library/Server/Web/Data/Sites/intranet-staging/current/tmp/invoices/this.pdf")
Loading pages (1/6)
Error: Failed loading page file://library/Server/Web/Data/Sites/intranet-staging/current/tmp/invoices/test.html …Run Code Online (Sandbox Code Playgroud)