ruby on rails 中使用pdfkit生成pdf

html-css014

ruby on rails 中使用pdfkit生成pdf,第1张

说是使用pdfkit,其实做工作的还是wkhtmltopdf。

一、新建项目

rails new mypdf --skip-bundle

进入项目:cd mypdf,打开Gemfile:vim Gemfile

修改source为https://ruby.taobao.com

添加:gem 'pdfkit'

运行bundle install

二、配置

在项目目录下的config/initializers里加上pdfkit.rb文件,修改内容为:

PDFKit.configure do |config|

config.wkhtmltopdf = '/path/wkhtmltopdf'

end

config.wkhtmltopdf配置的是wkhtmltopdf的路径,要确保pdfkit能找到它。

其它的配置请参考:http://wkhtmltopdf.org/usage/wkhtmltopdf.txt,里面的横杠用下划线代替。

三、使用

在controller里的相应位置加入:

用渲染的模版内容生pdf:

html = render_to_string(:template =>"pdf_template.erb",:layout =>false)

kit = PDFKit.new(html)

kit.stylesheets <<"#{Rails.root}/app/assets/assets/stylesheets/pdf.css"

#kit.to_pdf # inline PDF

#kit.to_file('/path/pdf.pdf')

send_data(kit.to_pdf, :filename =>"mypdf.pdf", :type =>"application/pdf")

#render :text =>kit.to_pdf

用url的内容生成pdf:

url = "http://www.baidu.com"

kit = PDFKit.new(url)

# kit.stylesheets <<"#{Rails.root}/app/assets/assets/stylesheets/pdf.css" # 用url时就不可以用css样式了。

#kit.to_pdf # inline PDF

#kit.to_file('/path/pdf.pdf')

send_data(kit.to_pdf, :filename =>"mypdf.pdf", :type =>"application/pdf")

注: kit = PDFKit.new(url, cookie: {"cookie_name"=>"cookie_content"}),如果需要登录的话,可以用cookie。cookie可以自己获取。

另外,如果你的页面里有js需要运行,最好在设置文件里设置如下:

javascript_delay: 1000

它的默认值是200毫秒。把加大一些,以便让js运行完成。

这样就可以用了。

最近公司给了个任务,差不多的流程就是接受json数据,然后最后生成图片。我想的办法是根据json数据生成html然后转成pdf。使用的语言是python。然后具体来说使用的工具就是使用python名为pdfkit的库去调用基于webkit的wkhtmltopdf。

目前来说html转pdf最主流的程序就是wkhtmltopdf,但是坑还是挺多的而且网上资源不是很丰富,所以写一篇踩坑总结。

##1. 无法读取本地文件

显示在html上好好的本地图片,到了pdf上就读取不出来,但是来源于网络(给一个url)的图片却能完美读出来。

后来发现,原来在上一个版本0.12.5是可以读取的,到了0.12.6不能读取了是因为其中的一个参数--enable-local-file-access变为了非默认。在python中改这个参数的方法是

然后再在后续调用wkhtmltopdf中加载这个option(我一开始想的是把value改成True,结果一直报错,吐了)

##2. 无法解析latex格式的公式

在html使用了MathJax提供的js去解析latex格式的数学公式,在html界面可以完美显示,但是到了pdf中就解析不了,然后我以为是没有添加'enable-javascript'的问题。结果加上之后还是不行。然后我发现又有一个参数叫做'no-stop-slow-scripts'的参数,可以等到js运行完毕之后再进行pdf的转化。结果还是不行。

然后我就在想会不会js在运行的时候出了什么问题,加上了'debug-javascripts'的参数。果然发现在调用MathJax提供的链接的时候发现这个链接已经过期了(我也不知道为啥过期了在html界面还能完美展示。。。),把js里的链接换成了

https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.2/MathJax.js?config=TeX-AMS-MML_HTMLorMML

完美解决

##3. 部分css失效

css3中的flex全部失效,所以大家得换一下!

当时遇到了一个讲的很好的博客,给大家分享一下,然后再放一个官方文档的链接

博客:https://www.jianshu.com/p/4d65857ffe5e

官方文档:https://wkhtmltopdf.org/usage/wkhtmltopdf.txt