4

我在使用 Wicked_PDF 呈现 PDF 时遇到问题。我正在使用 Amazon S3 和 CloudFront 托管我的所有资产管道资源,并且在开发过程中生成的东西很好;但是在生产中,HTML 和 CSS 资产不会在生成的 PDF 中呈现。

我在 MAC OSX 10.8.2、wkhtmltopdf 0.9.9 以及当前版本的 Wicked_PDF 和 wkhtmltopdf-heroku 上运行 Rails 3.2.11、Ruby 1.9.3p327。

以下是所有相关信息:

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)
}

宝石文件:

# 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 页面。日志中没有引发任何错误。这可能是由于测功机太少的问题吗?

诚然,我对这一切都是一个 n00b;对不起。谢谢。

4

1 回答 1

4

在 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 文档的更新,这可能会有所帮助。

于 2013-06-16T13:20:52.720 回答