《html转pdf-----wkhtmltopdf踩坑总结》

html-css07

《html转pdf-----wkhtmltopdf踩坑总结》,第1张

最近公司给了个任务,差不多的流程就是接受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

1安装Adobe Acrobat后会默认在IE浏览器中添加PDF工具栏。

该工具可以方便的将网页转化成PDF文档,或者添加入已有的PDF文档,Adobe PDF Explorer工具栏则可以在IE的收藏夹界面内管理window内的HTML文档与PDF文档的转化。

     2、安装单独的pdf虚拟打印机(pdffactory、ultra pdf等),通过网页的打印功能转换。

3使用客户端软件HTML2PDF_Pilot。

HTML2PDF_Pilot的截面如上图,很简洁。

如果只是要完成最简单的工作只需如箭头所示,点击上方的添加按钮添加HTML文档然后点击转换,稍等既可以完成一个HTML文档的转化工作。

两种方法的比较

灵活性:

PDF工具栏的方式相比客户端的方式要灵活许多。

在使用的过程中发现HTML2PDF_Pilot不能通过URL(网址)直接转化PDF文档,而工具栏只需在浏览的过程随意使用。

功能:在功能的环节上,客户端方式的HTML2PDF_Pilot就明显要比PDF工具栏要强大许多

工具栏只提供了最基本的保存和添加入已有文档的功能,而HTML2PDF_Pilot则提供了更为丰富的选项。

另外,如果需要批量转化网页文件的话,工具栏的方式也无法提供对应的功能。

其实还是有很多可以选择的方式,比如把网页转化为WORD的文件格式然后通过WPS软件来转化文档等,只要能灵活运用,html文件转PDF是非常简单的事情。

为了打印,方法有三

方法一,将你的那个HTML文件别存到一个特定的文件夹里。然后用word打开。打印时可以选择打印范围,每次50页(1-50

51-100

101-150

151-200)打印四次就不会死机了。

方法二下载一个小软件。也可以帮你完成任务。下载地址:

http://www2.zztc.com.cn/itlc/UploadFiles_itlc/201007/2010070814042202.rar

方法三:比较麻烦

但效果特别好

是真正意义上的PDF文件

第一步:把HTML转换为一个新的XHTML文件,我是用JTidy来完成这个转换。

第二步:转换XHTML为XSL-FO

我是通过用XSLT转换器(Apache

Xalan)处理XSL样式表来完成这个转换。

第三步:XSL-FO到PDF

也就是最后一步,就是把XSL-FO文档传递给格式化程序来生成PDF。我用的是Apache

FOP(Formatting

Objects

Processor)。