我很难让 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>
但是样式仍然混乱,所以我仍在寻找解决方案。