Ruby on Rails在Linux生产服务器上,wkhtmltopdf CSS样式表无法呈现

3

在本地开发环境(Windows)中,成功生成带有CSS样式的PDF文件。但是在托管于Linux服务器环境中生成的PDF文件没有应用CSS样式。以下是我的wkhtmltopdf(WickedPdf)配置:

WickedPdf.config = {
#:wkhtmltopdf => "#{RAILS_ROOT}/pdfbin/wkhtmltopdf-amd64",
:exe_path => "/home/software/.gems/bin/wkhtmltopdf",
:layout => "layouts/pdf.html.erb",
:margin => {    :top=> 40,
                :bottom => 20,
                :left=> 30,
                :right => 30},
:header => {:html => { :template=> 'layouts/pdf_header.html.erb'}},
:footer => {:html => { :template=> 'layouts/pdf_footer.html.erb'}}
#:exe_path => '/usr/bin/wkhtmltopdf'

为了获取更多信息:

这是我的目录结构,我在Linux Rails托管下的app\views\layouts中,布局内有pdf.html.erb、pdf_footer.html.erb和pdf_header.html.erb。以上内容在本地Windows开发环境中完美运行,但在生产环境中生成的PDF没有样式。请帮助我使用CSS样式生成PDF。

app/views/layouts/pdf.html.erb

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html dir="<%= (rtl?) ? 'rtl' : 'ltr' %>">
  <head>
    <% @direction = (rtl?) ? 'rtl/' : '' %>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> 
    <%= stylesheet_link_tag([@direction+'application', @direction+'_styles/ui.all'])%>
    <%= stylesheet_link_tag(*get_stylesheets) %>
    <%= stylesheet_link_tag  @direction+"_layouts/pdf" %>
    <link rel="stylesheet" type="text/css" href="<%="#{RAILS_ROOT}/public/stylesheets/#{@direction}_layouts/pdf.css" %>" media="all" />
    <link rel="stylesheet" type="text/css" href="<%="#{RAILS_ROOT}/public/stylesheets/#{get_stylesheets}.css"%>" media="all" />
    <link rel="stylesheet" type="text/css" href="<%= "#{RAILS_ROOT}/public/stylesheets/#{@direction}_styles/ui.all.css"%>" media="all" />


  </head>
  <body>

    <%= yield %>

  </body>
</html>

pdf.html.erb 包含了渲染 PDF 需要的所有样式信息,在托管环境中,这些样式不能被 wkhtmltopdf 获取。因此,朋友们,请帮助我解决这个问题。


无论你做什么,请先检查 wkthtmltopdf 库。这将确保你在生产环境中出错的地方,并且我认为样式表声明中的 public 不是必需的。指定你的 hostname,然后跟着样式表路径,忽略 public 方面,wkhtmltopdf 将为你获取这些 CSS。 - Viren
嗨Viren,我按照你的建议做了,但输出的PDF没有CSS样式,还有其他方法可以跟踪错误吗?在我的开发环境中,wkhtmltopdf库位于我的Rails应用程序内部,例如app/pdfbin/wkhtmltopdf.exe,但在生产中,我使用由托管提供商提供的wkhtmltopdf(/home/software/.gems/bin/wkhtmltopdf),这是我对本地和生产环境进行的唯一更改。 - Sam
生成PDF时,请检查日志,看看wkhtmltopdf是否记录了对CSS的请求。此外,我要求您在wkhtmltopdf中进行测试,因为在过去,我曾经看到过不同版本的wkhtmltopdf之间存在不相似之处,所以请确保您尝试实现的内容实际上受到该版本的wkhtmltopdf支持。 - Viren
1个回答

2
我在Heroku上部署应用时,遇到了PDFKit的类似问题。现在,我已经将二进制文件包含在项目中,它已经正常工作。
在我的布局中:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <meta http-equiv="content-type" content="text/html; charset=utf-8" />
  <title>Page title</title>
  <meta http-equiv="X-UA-Compatible" content="IE=8" />
    <%= csrf_meta_tags %>
  <style type="text/css" media="all">
    <%= Rails.application.assets['my_css'].to_s.gsub(/\/assets/,"#{root_url}assets") %>
  </style>
</head>
<body>
  <%= yield %>
</body>
</html>

在初始化程序中:
# config/initializers/pdfkit.rb
PDFKit.configure do |config|
  if Rails.env.staging? || Rails.env.production?
    config.wkhtmltopdf = Rails.root.join('bin', 'wkhtmltopdf-amd64').to_s
  else
    config.wkhtmltopdf = '/Users/my_user_name/.rvm/gems/ruby-1.9.2-p0@my_project/bin/wkhtmltopdf'
  end
  config.default_options = {
    :page_size => 'A4',
    :margin_top => '0in',
    :margin_right => '0in',
    :margin_bottom => '0in',
    :margin_left => '0in',
    :orientation => 'Portrait'
  }
  # Use only if your external hostname is unavailable on the server.
  config.root_url = "http://localhost:3000" unless Rails.env.staging? || Rails.env.production?
end

也许这能帮到你,或者其他人……

config.root_url = .... 这一行是让我的 CSS 和图片显示出来的魔法调味料。原因是我的生产服务器是一个 Unix 套接字,手动指定一个 HTTP 位置有助于它找到其他资源。 - Marshall Anschutz
很高兴我能帮上忙……以一种我无法想象的方式;-) - fro_oo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接