ruby-on-rails - 如何从 rest api 返回 pdf 文件?

标签 ruby-on-rails ruby rest api wicked-pdf

我已经在 ruby​​ on rails 应用程序中设置了一个 rest API,我现在需要生成一个 PDF 并从 get 请求返回这个 PDF。我正在寻找有关如何实现此功能的一些建议。

我的一些要求如下:我不能保存文件并给最终用户一个文件链接,因为文件中的数据可以随时更新。我将该应用程序用作微服务,因此没有可用于显示文件的前端。

所以这是我的想法,我希望得到一些关于如何实现此功能的建议。

我想向应用程序中的特定端点发出获取请求。我希望返回一个 PDF 文件,然后我可以将其显示给最终用户。

我目前正在使用 WickedPdf gem 生成一个临时的 PDF 文件,但我真的很纠结响应的外观。

如有任何建议,我们将不胜感激。

最佳答案

一种方法是在内存中创建一个 PDF 文件并将其流式传输到客户端。我更喜欢这种方式,也许以后您将不得不通过电子邮件发送 PDF 文件,或者将它们保存到某个备份磁盘等...

def get_pdf
  pdf = WickedPdf.new.pdf_from_string('<h1>Hello There!</h1>')
  send_data pdf, filename: 'file_name.pdf'
end

您可以将 PDF 生成放到不同的服务中,然后在 Controller 中调用它。这提供了隔离,您可以单独对其进行测试。

您还可以使用 HTTPie 调试端点响应http get http://localhost:3000/invoices/1/get_pdf

Rails 将设置所有必要的 HTTP 响应 header :

Content-Disposition: attachment; filename="file_name.pdf"
Content-Length: 5995
Content-Transfer-Encoding: binary
Content-Type: application/pdf

因此,当用户单击指向端点的链接时,很可能会弹出下载对话框,因为 Content-Disposition: attachment; header

其他解决方案是将 get_pdf.html 呈现为 PDF 并发送回客户端:

def get_pdf
  render pdf: "file_name"
end

但在这种情况下,Content-Disposition header 将是 inline,这意味着浏览器将打开 pdf(如果它可以读取 PDF 格式)而不是提供给下载它。

关于ruby-on-rails - 如何从 rest api 返回 pdf 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42806043/

相关文章:

ruby-on-rails - Ruby:阅读 PDF 文件

ruby - Rails:猴子修补 ActiveRecord::Base 与创建模块

spring - 使用 Spring 的 REST 多部分混合请求(文件+json)

ruby-on-rails - Messy 从 Rails 3 controller 返回查看

ruby-on-rails - 验证 Rails 数据库设计

ruby-on-rails - Rails 在哪里包含来自 lib 的类中的模块?

javascript - Angular 工厂$resource在数据库中创建一个空对象

java - 使用 POST 的 REST API 显示空白响应

ruby-on-rails - 如何在rails中截断连接表?

尝试动态创建 unicode 字符串的 Ruby 抛出 "invalid Unicode escape"错误