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

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

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

所以我想我会想知道如何实现这个功能.

我想向应用程序中的特定端点发出get请求.我希望能够返回一个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生成放到不同的服务中,只需在控制器中调用它即可.这提供了隔离,您可以单独测试它.

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

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

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

因此,当用户点击指向端点的链接时,很可能由于Content-Disposition:attachment而弹出下载对话框;头

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

def get_pdf
  render pdf: "file_name"
end

但在这种情况下,Content-Disposition标题将是内联的,这意味着浏览器将打开pdf(如果它可以读取PDF格式)而不是提供下载它.

点赞