三种Java下生成PDF方式的比较
最近因项目需要用Java下生成PDF文档,Google了很久,发现目前开源、成熟、稳定的第三方包只有iText。而用iText生成PDF有三种方式:
- 调用iText API,用代码“写”出PDF,依赖包:com.itextpdf:itextpdf:5.5.11
- 结合XmlWorker,从HTML模板生成PDF,依赖包:com.itextpdf.tool:xmlworker:5.5.11
- 结合Flying Saucer,从HTML模板生成PDF,依赖包:org.xhtmlrenderer:flying-saucer-pdf-itext5:9.1.6
三种方式的教程,网上多的很,我就不累述了。三种方式我都尝试了,发现它们渲染出来的效果有所不同。而且,每一种方式,不同的字体,渲染出来的效果也不同。
使用微软雅黑
微软雅黑字体是很漂亮的,我同时也用Word生成了PDF,互相比较下。以下都是用Adobe Reader v11.0.16下打开文档的截图,缩放比例150%。
Word生成的PDF | |
iText“手工”写的PDF | |
XmlWorker从HTML模板生成的PDF | |
Flying Saucer从HTML模板生成的PDF |
从效果上看,Word渲染出来的PDF最好看,最平滑(反失真最好),而且ASCII字符与汉字之间还留了间距,看起来更舒适。iText、XmlWorker、Flying Saucer则越来越不平滑,即反失真越来越差,连画的Table的边框都越来越粗。
微软雅黑下的三种方式的对比花了我一下午加一个晚上的时间,差不多14个小时,包括Google代码,精疲力尽。XmlWorker和Flying Saucer虽然都很方便,但都有失真,对比着Word和iText生成的,心里总是不服气,强迫症又犯了。若是用iText手工“写”,要是客户想要换个颜色呢,老子还要去改代码,NM更不愿意了。用Word生成更不用想了,总不能每次生成报告,都真的去手工敲一遍吧,我是程序员啊喂。
Flying Saucer更矬的是,它在加载Font的时候,会去解析Font的各种参数,且会改写font weight。我指定的雅黑字体的font weight都是400,然后它加载后都改成了396,直到我在HTML模板里强行指定font-weight为100,才渲染成跟400一样的粗细。如果不overwrite
font-weight的话,它就把400渲染成900的效果,真TMD。
惆怅,先睡了……一觉睡醒,忽然灵光一现,XmlWorker和Flying Saucer的失真会不会是因为字体造成的?于是决定换苹果的萍方黑体试试。
使用萍方黑体
这盘没有使用Word或iText生成PDF:
XmlWorker生成的PDF | |
Flying Saucer生成的PDF |
Much better!但Flying Saucer渲染的还是比XmlWorker要粗一点.。
所以结论如下:从便利性、渲染效果综合来看,还是用XmlWorker好些。虽然渲染效果没有达到极致,但十分有利于用户自定义模板。
原始截图:http://pan.baidu.com/s/1geM8XtL
PS:****居然不提供附件功能,差评!