【问题标题】:pdfkit does not style pdfspdfkit 不设置 pdf 样式
【发布时间】:2011-12-24 02:02:49
【问题描述】:

我有一个使用 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" %>

【问题讨论】:

  • 我已经添加了更多代码,如果您需要视觉或任何其他信息,我很乐意提供帮助。
  • 我遇到了同样的问题。使用 Rails 3.1 和资产管道会使上述所有初始化程序和 hacks 无用。想不出办法。
  • 您确定指定了:media =&gt; "all" 吗?我很惊讶地看到默认设置仅为“屏幕”。另一种检查方法:如果您要求浏览器打印,页面是否设置了样式?
  • @tomciopp 你解决了吗?这几天我一直在和它搏斗……
  • 这并不是一个真正的“解决方案” - 而是一种解决方法,因为自从最初报告此问题以来已经有好几年了,而且可能永远无法修复。把你的样式放在一个普通的视图文件中,用

标签: ruby-on-rails css ruby-on-rails-3.1 pdf-generation pdfkit


【解决方案1】:

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)

【讨论】:

  • 谢谢!真的很有帮助!
【解决方案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

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

【讨论】:

    【解决方案3】:

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

    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/ 加载它

    【讨论】:

    • 我们如何从开发环境中的 public/assets 加载 scss 文件?
    • 使用 Sass.compile(File.read(path_to_file)) 然后保存 .css 文件并将路径传递给 PDFKit 实例。
    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

        我已在 Rails 3.1 上成功运行 PDFKit。不过我使用了different setup

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

        【讨论】:

        • 我在 layouts/application.html.erb 文件中指定了 media => "all",所以这应该不是问题。您能否进一步详细说明您的不同设置,以便我看看这是否可以实现?您是否检查过这是否也适用于生产环境,因为您只更改了开发环境?
        • @demondeac11:我看到你指定了它,但也许你正在使用其他布局?您是否检查过要求 Chrome 打印您的页面是否会对其进行样式设置?按照我的不同设置的链接。生产设置取决于您的环境,通常您将静态提供资产,可能来自 CDN 或负载均衡器等...
        猜你喜欢
        • 1970-01-01
        • 2015-06-25
        • 1970-01-01
        • 2015-06-08
        • 2018-09-22
        • 1970-01-01
        • 2011-08-31
        • 2014-09-24
        • 2014-06-09
        相关资源
        最近更新 更多