ruby-on-rails 将wicked_pdf PDF文件保存到活动存储时,PDF已损坏

11dmarpk  于 2023-07-01  发布在  Ruby
关注(0)|答案(1)|浏览(115)

我想将生成的PDF保存为活动存储附件。

pdf = WickedPdf.new.pdf_from_string(
      render_to_string(pdf: 'SurveyReportForm', template: '/screenings/test', layout: 'pdf',  formats: :pdf)
     )

 
@screening.report.attach(
  io: StringIO.new(pdf),
  filename: "#{@screening.id}-report",
  content_type: 'application/pdf'
)

代码运行时没有错误。然而,当我点击链接查看pdf

<%= link_to "Download Report", rails_blob_path(@screening.report, disposition: "attachment") %>

我得到一个PDF,页面上有看起来像PDF二进制/源代码的东西,开始是:

%PDF-1.4 1 0 obj << /Title (þÿ) /Creator (þÿwkhtmltopdf 0.12.6) /Producer (þÿQt 4.8.7...

到底出了什么问题?如果问题出在pdf生成中,或者我是如何保存它的,我该如何调试它来解决这个问题?

fkaflof6

fkaflof61#

问题不在于ActiveStorage,而在于下载的PDF没有使用正确的Mime类型。因为您没有指定它,所以它将作为text/plain而不是application/pdf提供。
我想你可以通过注册一个PDF Mime类型来改变这一点,就像WickedPDF README告诉你的那样:

Mime::Type.register "application/pdf", :pdf

这应该能让Rails知道在提供PDF时,要使用该mime类型。
否则,您可以创建一个控制器端点来下载PDF,如下所示:

def download
  send_file rails_blob_path(@screening.report),
    disposition: "attachment",
    content_type: "application/pdf"
end

# or

def download
  pdf = # retrieve PDF contents
  send_data pdf, filename: "mypdf.pdf",
    disposition: "attachment",
    content_type: "applicaton/pdf"
end

相关问题