4

我很难让 PDFKit 在 Heroku 上工作。我已阅读此处此处此处的教程,但仍然无法弄清楚如何正确显示 pdf。我遇到了前面链接中描述的相同问题,其中应用程序在开发中运行良好,并且在 Heroku 上的生产中挂起。我尝试添加以下内容(从教程中获得)。

application_helper.rb

def request_from_pdfkit?
  # when generating a PDF, PDFKit::Middleware will set this flag
  request.env["Rack-Middleware-PDFKit"] == "true"
end

# We have to reference the actual output of the assets pipeline, which according
# to http://guides.rubyonrails.org/asset_pipeline.html is application-<md5>.css and
# application-<md5>.js.  We have to dynamically find these file names and correctly
# reference them.
def get_mdf5_file(base_file)
  stripped_name = base_file.basename.to_s.gsub(base_file.extname, "")
  Dir.glob("#{base_file.parent}/*#{base_file.extname}").each do |file|
    return file if file.match(/#{stripped_name}-[\d\w]+#{base_file.extname}/)
  end
  return base_file
end

应用程序.html.erb

<% if request_from_pdfkit? %>
  <style type="text/css" media="all">
    <%= File.read(get_mdf5_file(Rails.root.join("public","assets","application.css")) %>
  </style>
  <script type="text/javascript">
    <%= File.read(get_mdf5_file(Rails.root.join("public","assets","application.js"))) %>
  </style>
<% else %>
  <%= stylesheet_link_tag "application", :media => "all" %>
  <%= javascript_include_tag "application" %>
<% end %>

当我这样做时,生成的 PDF 具有最小的样式,并且没有从 javascript 生成的内容。看起来(基于我的预感)Bootstrap scss 都没有被预编译到 application.css 中。现在,这里是内容

应用程序.css

/*
 *= require_self
 *= require dataTables/jquery.dataTables
 *= require dataTables/jquery.dataTables.bootstrap
 *= require dataTables/src/demo_table_jui
 *= require jquery.ui.all
 *= require jquery.jqplot
 *= require_tree .
 */

应用程序.js

//= require jquery
//= require jquery_ujs
//= require jquery-ui
//= require bootstrap
//= require bootstrap-multiselect
//= require dataTables/jquery.dataTables
//= require dataTables/jquery.dataTables.bootstrap
//= require jquery.jqplot
//= require plugins/jqplot.cursor
//= require plugins/jqplot.BezierCurveRenderer
//= require plugins/jqplot.bubbleRenderer
//= require plugins/jqplot.barRenderer
//= require plugins/jqplot.categoryAxisRenderer
//= require plugins/jqplot.canvasTextRenderer
//= require plugins/jqplot.canvasAxisLabelRenderer
//= require plugins/jqplot.highlighter
//= require plugins/jqplot.canvasOverlay
//= require plugins/jqplot.cursor
//= require plugins/jqplot.enhancedLegendRenderer
//= require plugins/jqplot.dateAxisRenderer
//= require plugins/jqplot.canvasAxisTickRenderer
//= require_tree .

我尝试将一些 Bootstrap scss 组件手动添加到 application.css 资产管道,但得到了此处引用的错误。

我不知道如何让它工作,所以任何帮助将不胜感激。

编辑

我一直在玩这个,并注意到当内联插入 Javascript 和 CSS 时,根据 Chrome 上显示的源,所有引号“都被替换为”。我尝试添加 .gsub(/"/, /"/) 但这不起作用。有谁知道我为什么看到“而不是”,或者这甚至是一个问题。

编辑 2

通过实施以下更改,我能够让显示器看起来更好一些

<script type="text/javascript">
  <%= raw(File.read(get_mdf5_file(Rails.root.join("public", "assets", "application.js"))).gsub("</script>", "")) %>
</script>
<style type="text/css" media="all">
  <%= raw File.read(get_mdf5_file(Rails.root.join("public", "assets", "application.css"))) %>
</style>

但是样式仍然混乱,所以我仍在寻找解决方案。

4

2 回答 2

2

我想通了。我不得不降级到 wkhtmltopdf 0.10 rc2。完成此操作后,我能够修改样式以使 PDF 看起来不错。

于 2013-06-07T03:40:42.330 回答
1

我认为你可以通过做(Rails4,YMMV)来简化很多:

<%= Rails.application.assets.find_asset('pdfs.css').to_s.html_safe %>

使用 wkhtmltox-0.12.0 工作。

一些细节: https ://github.com/sstephenson/sprockets#accessing-assets-programmatically

归功于:https
://stackoverflow.com/a/11767185/1869825 还有:Rails 3 命令将我的 CSS 样式表的文本嵌入我的 HTML 头部

于 2014-02-22T17:17:43.303 回答