三种Java下生成PDF方式的比较

最近因项目需要用Java下生成PDF文档,Google了很久,发现目前开源、成熟、稳定的第三方包只有iText。而用iText生成PDF有三种方式:

  1. 调用iText API,用代码“写”出PDF,依赖包:com.itextpdf:itextpdf:5.5.11
  2. 结合XmlWorker,从HTML模板生成PDF,依赖包:com.itextpdf.tool:xmlworker:5.5.11
  3. 结合Flying Saucer,从HTML模板生成PDF,依赖包:org.xhtmlrenderer:flying-saucer-pdf-itext5:9.1.6

三种方式的教程,网上多的很,我就不累述了。三种方式我都尝试了,发现它们渲染出来的效果有所不同。而且,每一种方式,不同的字体,渲染出来的效果也不同。

使用微软雅黑

微软雅黑字体是很漂亮的,我同时也用Word生成了PDF,互相比较下。以下都是用Adobe Reader v11.0.16下打开文档的截图,缩放比例150%。

三种Java下生成PDF方式的比较_第1张图片 Word生成的PDF
三种Java下生成PDF方式的比较_第2张图片 iText“手工”写的PDF
三种Java下生成PDF方式的比较_第3张图片 XmlWorker从HTML模板生成的PDF
三种Java下生成PDF方式的比较_第4张图片 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:

三种Java下生成PDF方式的比较_第5张图片 XmlWorker生成的PDF
三种Java下生成PDF方式的比较_第6张图片 Flying Saucer生成的PDF

Much better!但Flying Saucer渲染的还是比XmlWorker要粗一点.。

所以结论如下:从便利性、渲染效果综合来看,还是用XmlWorker好些。虽然渲染效果没有达到极致,但十分有利于用户自定义模板。


原始截图:http://pan.baidu.com/s/1geM8XtL

PS:CSDN居然不提供附件功能,差评!

你可能感兴趣的:(三种Java下生成PDF方式的比较)