19

我有一个使用 pdfkit 创建 pdf 文档的 rails 3.1 应用程序,除了生成的 pdf 没有任何样式之外,一切都按规定工作。我假设 wkhtmltopdf 无法访问我的样式表,并且这不是比这更大的问题。有人知道您将如何允许访问这些样式表吗?我基本上遵循了关于该主题的 railscast #220,但是我必须创建一个新的初始化程序来让 pdfkit 与 rails 3.1 一起使用。

这是我必须用来让 pdfkit 与 rails 3.1 一起使用的初始化程序

ActionController::Base.asset_host = Proc.new { |source, request|
  if request.env["REQUEST_PATH"].include? ".pdf"
    "file://#{Rails.root.join('public')}"
  else
    "#{request.protocol}#{request.host_with_port}"
  end
 } 

pdf 的链接如下所示:

<%= link_to 'Download PDF', load_path(@load, :format => "pdf") %>

这会给我一个没有样式的 pdf 的链接。

在我的 application.rb 中,我已将 pdfkit 配置为:

config.middleware.use PDFKit::Middleware, :print_media_type => true

我还将它添加到我的 layouts/application.html.erb 文件中:

<%= stylesheet_link_tag    "application", :media => "all" %>
4

6 回答 6

6

从https://github.com/pdfkit/pdfkit/blob/master/lib/pdfkit/middleware.rb的中间件代码中窃取几行代码

您可以使用:

root = PDFKit.configuration.root_url || "#{env['rack.url_scheme']}://#{env['HTTP_HOST']}/"
html.gsub!(/(href|src)=(['"])\/([^\"']*|[^"']*)['"]/, '\1=\2' + root + '\3\2')

我的例子是:

html = render_to_string #render current action to string
root = PDFKit.configuration.root_url || "#{env['rack.url_scheme']}://#{env['HTTP_HOST']}/"
html.gsub!(/(href|src)=(['"])\/([^\"']*|[^"']*)['"]/, '\1=\2' + root + '\3\2')
kit = PDFKit.new(html, :print_media_type => true)
于 2013-08-12T20:15:57.580 回答
2

我知道您正在寻找能够呈现整个页面的解决方案,只是提醒使用谷歌搜索的人仍然存在无问题的解决方法

class DocumentController < ApplicationController

  def show
    @document = Document.last
    # ... implement your respond_to

    kit = PDFKit.new(@document.content, :page_size => 'Letter')
    kit.stylesheets << "#{Rails.root}/app/assets/stylesheets/pdf.css"
    send_data kit.to_pdf, :filename => "#{@document.title}.pdf", :type => 'application/pdf'
  end

end

现在 pdf.css 必须是 css,所以理论上如果你需要加载 sass 从预编译的 public/assets/ 加载它

于 2012-08-14T08:45:34.087 回答
2

我也遇到了这个问题,似乎在 Rails 3.1 中添加资产管道时,pdfkit 的样式表链接有问题。请参阅有关此问题的GitHub问题。

我最终切换到wicked_pdf并且对此非常满意。他们已经解决了这个问题,它在 Rails 3.2.x 上运行良好(没有尝试过 3.1.x)。

于 2012-02-22T21:10:50.727 回答
2

对我来说,安装 ubuntu 是有问题的。我刚刚从源代码重新安装:

# first, installing dependencies
sudo aptitude install openssl build-essential xorg libssl-dev

# for 64bits OS
wget http://wkhtmltopdf.googlecode.com/files/wkhtmltopdf-0.9.9-static-amd64.tar.bz2 
tar xvjf wkhtmltopdf-0.9.9-static-amd64.tar.bz2
mv wkhtmltopdf-amd64 /usr/local/bin/wkhtmltopdf
chmod +x /usr/local/bin/wkhtmltopdf

# for 32bits OS
wget http://wkhtmltopdf.googlecode.com/files/wkhtmltopdf-0.9.9-static-i386.tar.bz2 
tar xvjf wkhtmltopdf-0.9.9-static-i386.tar.bz2
mv wkhtmltopdf-i386 /usr/local/bin/wkhtmltopdf
chmod +x /usr/local/bin/wkhtmltopdf

现在一切都对我有用。所以我的建议是不要通过这个命令安装 wkhtmltopdfsudo apt-get install wkhtmltopdf并从源代码安装它。 安装过程的完整说明

于 2012-04-18T00:08:28.377 回答
1

我使用 gem 'wicked_pdf' 及其助手将 CSS 包含到页面中。在内部,助手只是读取所有 CSS 文件并包含到页面本身中。因此,如果您更喜欢使用 PdfKit,请尝试研究如何包含非内联样式表。

于 2011-11-08T08:52:48.920 回答
0

我已在 Rails 3.1 上成功运行 PDFKit。不过,我使用了不同的设置

起初我遇到了同样的问题,但那是因为stylesheet_link_tag默认设置为media => "screen"; 明确指定media => "all"修复它。

于 2011-11-22T22:27:15.063 回答