PDF不会呈现通过产品中的资产同步托管的HTML和CSS资产
我在使用Wicked_PDF呈现PDF时遇到问题。 我使用Amazon S3和CloudFront托管我的所有资产管道资源,并且在开发过程中事情已经很好地生成; 但是在生产中,HTML和CSS资源不会在生成的PDF中呈现。
我在MAC OSX 10.8.2上运行Rails 3.2.11,Ruby 1.9.3p327,wkhtmltopdf 0.9.9,以及当前版本的Wicked_PDF和wkhtmltopdf-heroku。
以下是所有相关信息:
Heroku日志:
2013-04-21T14:13:19.482011+00:00 app[web.1]: Completed 302 Found in 212ms (ActiveRecord: 205.6ms)
2013-04-21T14:13:19.584108+00:00 app[web.1]: Started GET "/office/download/7" for ip_address at 2013-04-21 14:13:19 +0000
2013-04-21T14:13:21.551581+00:00 app[web.1]: Processing by OfficesController#show_pdf as HTML
2013-04-21T14:13:21.551581+00:00 app[web.1]: ***************WICKED***************
2013-04-21T14:13:21.551581+00:00 app[web.1]: Parameters: {"office_id"=>"7"}
2013-04-21T14:13:21.551581+00:00 app[web.1]: Rendered appointments/forms/_office.pdf.html.erb within layouts/pdf.html (13.6ms)
2013-04-21T14:13:21.551581+00:00 app[web.1]: Rendered text template (0.0ms)
2013-04-21T14:13:21.551581+00:00 app[web.1]: Sent data Office.pdf (42.2ms)
2013-04-21T14:13:21.551581+00:00 app[web.1]: Completed 200 OK in 1961ms (Views: 41.9ms | ActiveRecord: 7.8ms)
2013-04-21T14:13:21.554211+00:00 heroku[router]: at=info method=GET path=/office/download/7
host=www.foobar.com fwd="ip_address" dyno=web.1 connect=1ms service=1971ms status=200 bytes=22019
路线:
# => Route that generates the PDF
get "/office/download/:office_id" => 'offices#show_pdf'
控制器:
# => app/controllers/offices_controller.rb
def show_pdf
@office = Office.find_by_id(params[:office_id])
abrv = @office.abrv
partial = "appointments/forms/_#{abrv}"
@format = "pdf"
respond_to do |format|
format.pdf do
render :pdf => "#{@office.name}",
:template => "#{partial}.pdf.html.erb",
:layout => "pdf.html",
:page_size => "A4",
:encoding => "UTF-8",
:show_as_html => params[:debug].present?
end
end
end
视图:
# => app/views/offices/index
<div>
# List of all offices
</div>
# PDF partials for each office
<%= render 'appointments/forms/office.pdf.html.erb' %>
<%= render 'appointments/forms/office_1.pdf.html.erb' %>
...
PDF模板:
# => app/views/appointments/forms/_office.pdf.html.erb:
<% if @format != 'pdf' %>
<%= stylesheet_link_tag 'office' # => .css.scss.erb %>
<% else %>
<%= wicked_pdf_stylesheet_link_tag 'office' # => .css.scss.erb %>
<% end %>
<div class="pdf_styling">
<p>Bar</p>
</div>
CSS:
# => app/assets/stylesheets/office.css.scss.erb
.pdf_styling {
background-image: url('https://s3.amazonaws.com/foo/assets/pdf_background_image.jpg');
width: 100%;
height: 100%;
p {
position: absolute;
left: 100px;
right: 100px;
}
}
Wicked_PDF初始化程序:
# => config/initializers/wicked_pdf.rb
WICKED_PDF = {
:wkhtmltopdf => (Rails.env.test? || Rails.env.development? ? '/usr/local/bin/wkhtmltopdf' : Rails.root.join('bin', 'wkhtmltopdf-amd64').to_s),
:exe_path => (Rails.env.test? || Rails.env.development? ? '/usr/local/bin/ ' : Rails.root.join('vendor','bin', 'wkhtmltopdf-amd64').to_s)
}
的Gemfile:
# PDF Gem
gem 'wicked_pdf'
# PDF to HTML utility
gem 'wkhtmltopdf-binary'
# PDF on heroku
group :production do
gem "wkhtmltopdf-heroku", :git => 'git://github.com/camdez/wkhtmltopdf-heroku.git'
gem 'thin'
end
# Asset Pipeline Optimization
gem "asset_sync"
再说一次,一切都在开发中正常工作,但我只是在生产中获得一个空白的PDF页面。 日志内没有发生错误。 这是一个潜在的问题,因为拥有太少的dynos?
我承认所有这一切都是n00b; 原谅我。 谢谢。
在Heroku部署到生产时,我遇到了同样的问题。
解决两个可能的问题......首先,每个Javascript或CSS资源文件都必须指定为绝对URL,而不仅仅是您在模板代码中指定的那个。 如果你在其他地方引用了任何JS / CSS文件,这些文件也必须以绝对形式指定。 正因为如此,您还需要查看您的PDF布局文件
其次(这是我在Heroku上的技巧),我最终不得不在config / application.rb中指定每个资源,如下所示:
config.assets.precompile += ['blueprint/screen.css', 'jquery.timepicker.css', 'pdf.css', 'jquery.ui.datepicker.js', 'pdf.js', 'jquery.autosize.js', 'jquery.timepicker.js']
我不确定为什么第二步是必需的,但没有它,在Heroku上没有任何工作:我收到了同样的空白PDF文件,没有错误报告,甚至认为所有工作都在开发中。 我的经验是,如果有资源问题,wkhtmltopdf会默默地失败。 我在这里发表了关于这个问题的博文,并推动了对WickedPDF README文档的更新,这可能会有所帮助。
链接地址: http://www.djcxy.com/p/63951.html上一篇: PDF not rendering HTML and CSS assets hosted via Asset Sync in production