pdfkit 不设置 pdf 样式
Posted
技术标签:
【中文标题】pdfkit 不设置 pdf 样式【英文标题】:pdfkit does not style pdfs 【发布时间】: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 => "all"
吗?我很惊讶地看到默认设置仅为“屏幕”。另一种检查方法:如果您要求浏览器打印,页面是否设置了样式?
@tomciopp 你解决了吗?这几天我一直在和它搏斗……
这并不是一个真正的“解决方案” - 而是一种解决方法,因为自从最初报告此问题以来已经有好几年了,而且可能永远无法修复。把你的样式放在一个普通的视图文件中,用
【参考方案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 => "screen"
;明确指定 media => "all"
修复它。
【讨论】:
我在 layouts/application.html.erb 文件中指定了 media => "all",所以这应该不是问题。您能否进一步详细说明您的不同设置,以便我看看这是否可以实现?您是否检查过这是否也适用于生产环境,因为您只更改了开发环境? @demondeac11:我看到你指定了它,但也许你正在使用其他布局?您是否检查过要求 Chrome 打印您的页面是否会对其进行样式设置?按照我的不同设置的链接。生产设置取决于您的环境,通常您将静态提供资产,可能来自 CDN 或负载均衡器等...以上是关于pdfkit 不设置 pdf 样式的主要内容,如果未能解决你的问题,请参考以下文章
如何在 python 中使用 pdfkit 指定 PDF 页面大小