背景
经过阅读,我发现 Prawn 已经过时了,wkhtmltopdf 更为流行。同时,对于 Rails 来说,PDFKit 和 wicked_pdf 也变得十分热门。我在 Ryan 的 如何使用PDFKit 的视频中找到了一些有用的信息。我安装了所有必要的组件,并在 CLI 上测试了 wkhtmltopdf,没有出现任何问题。我还调整了 Rails 的设置,以便运行多个进程,使资产管道正常工作。看起来一切都很顺利,但是我仍然卡在了最后一个步骤上(从服务器获取 PDF 响应)。
问题
当我请求查看的.pdf
版本(我正在使用 PDFKit 中间件选项)时,我的浏览器只是等待响应,但是当我杀死 Rails 进程时,我期望得到的 PDF 才会在浏览器窗口中弹出。这是怎么回事?
我使用了什么
- 操作系统:OSX 10.8.1
- Rails:3.2.8
- Ruby:1.9.3
- wkhtmltopdf:0.11.0_rc1(但是当我运行
wkhtmltopdf -V
时,它显示为0.10.0_rc2) - qt:4.8.2
我做了什么
- 通过在
application.rb
文件中加载config.middleware.use "PDFKit::Middleware"
,我使用了PDFKit中间件。 - 在我的Gemfile中包含
gem 'pdfkit'
并使用Bundler安装它。 - 使用
Mime::Type.register_alias "application/pdf", :pdf
在我的mime_types.rb
初始化程序中设置了.pdf
MIME类型的别名。 - 将
config.threadsafe!
添加到config/environments/development.rb
中以支持多个线程,以避免资产管道与PDF引擎冲突。 - 测试了
wkhtmltopdf http://www.google.com google.pdf
,并生成了预期的Google首页的PDF。 - 尝试将PDFKit替换为wicked_pdf并遇到相同的问题(挂起,但当终止Rails进程后,PDF会如预期地呈现)。
外观效果
这是由Rails渲染的常规HTML页面(我已经模糊了客户端详细信息):
localhost:3000/some/path.pdf
时,Rails的CLI输出结果(应用程序在等待响应时挂起):
![enter image description here](https://istack.dev59.com/Etc2j.webp)
ctrl-c
杀死Rails进程后,PDF最终会像我期望看到的那样显示在浏览器中(CSS和HTML正常呈现,因此资产似乎加载良好):
![enter image description here](https://istack.dev59.com/aiOGz.webp)
请求帮助: 我如何确定问题的具体内容以及如何解决它?
如果您能帮助我,我会非常感激 <3
更新
我也尝试了另一种渲染PDF的方法(使用
.to_pdf
),而不是使用中间件选项,具体操作如下:我注释掉了application.rb
文件中的config.middleware.use "PDFKit::Middleware"
。respond_to do |format|
format.html
format.pdf do
html = '<html><body>This is a test.</body></html>'
@pdf = PDFKit.new(html)
send_data @pdf.to_pdf,
:filename => 'whatever.pdf',
:type => 'application/pdf',
:disposition => 'attachment'
end
end