【问题标题】:How to save a Prawn generated PDF to the public folder?如何将 Prawn 生成的 PDF 保存到公用文件夹?
【发布时间】:2017-02-01 15:06:55
【问题描述】:

我正在使用 Prawn gem 在我的应用程序中生成 PDF...

app/controllers/orders.rb

class OrdersController < ApplicationController
  ...
  def show
    respond_to do |format|
      format.html
      format.pdf do
        require "prawn/measurement_extensions"
        ...
        #render pdf document
        send_data pdf.render, 
          filename: "order_#{@order.id}.pdf", 
          type: 'application/pdf',
          disposition: 'inline'
      end
    end
  end
  ...
end

而且它的显示效果很好,但是我的问题是......

  • 在成功创建order 后,如何 - 自动 - 将这些生成的 pdf 保存在公用文件夹(每天的文件夹)中?我试过搜索 Prawn Documentation 但我什么也没找到。
  • 如何仅以 pdf 格式显示订单?我尝试评论 format.html 行,但没有成功

【问题讨论】:

  • 如果您 a) 曾经想要运行多个服务器或 b) 在 heroku 上运行,则不需要将内容存储在特定服务器上的公用文件夹中。您希望使用像 S3 这样的文件存储系统,您的所有服务器都可以在其中访问文件,并且文件在重新启动之间保持不变。如果您不关心,只需使用 ruby​​ File 方法将 pdf.render (内容)写入磁盘。如果您确实关心跨服务器更改进行持久化,请查看 github.com/thoughtbot/paperclip,您可以在其中持久化文件并将它们与应用程序中的模型相关联
  • @JohnNaegle 我现在要做的是在创建订单后保存 PDF 发票,以便以后查看。你能告诉我实现这一目标的最佳方法是什么吗?

标签: ruby-on-rails ruby-on-rails-4 pdf prawn


【解决方案1】:

您可以使用 Prawn 的render_file 方法将生成的 PDF 保存到文件中:

pdf.render_file(Rails.root.join('public', "order_#{@order.id}.pdf"))

查看文档:https://prawnpdf.org/docs/0.11.1/Prawn/Document.html

【讨论】:

    【解决方案2】:

    当您调用pdf.render 并使用send_data 将其发送给客户端时,您实际上是通过网络转储pdf 的内容。取而代之的是,您可以将pdf.render 的结果转储到带有File.new 的文件中,并在控制器中使用send_file。检查File 的文档。或者,您可以使用 Paperclip 之类的方式将生成的 pdf 附加到特定订单。

    如果您在服务器中将 pdf 生成为文件,则应使用 send_file 而不是 send_data。在guides 中阅读更多相关信息。

    【讨论】:

    • 你能解释一下如何实现这个吗?
    猜你喜欢
    • 2013-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多