java中生成pdf最快的非itext莫属,itext常用的版本有2.0.8 ,2.1.7 ,以及5.x.x ,中间貌似有断层,而且5改动非常大,包结构都改变了。
我从google查到的html 生成pdf方案,最好的莫过于 flyingsaucer + itext, 目前flygingsaucer-r8(googlecode中有,源码在github)适配的itext版本为2.0.8, 不能使用itext 2.1.7,有些api改变了,运行时会报错。
flying 最好的地方莫过于支持css2.1,及css3少量,flying 实现了一个css解析器,可能为了减少解析的难度,它要求html必须为xhtml格式,而不支持普通的html,你可以使用jtidy将html专程xhtml(有兴趣请自己去查)。
itext默认是不支持中文的,虽然它里面有cjk字体类(中国,日本,韩国)。
这里解决中文有两个方法:1,直接引用中文字体文件
font.addFont(Html2Pdfs.class.getResource("SIMSUN.TTC").toString().substring(6),
BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED);
2: 使用 itextAria.jar来支持中文
font.addFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
解决了itext支持中文的问题,flying同样在支持中文上有问题,flying只支持字体文件 ttc或ttf等。我改了flying的源码重新打包了,使其能支持itextaria。jar,避免依赖中文字体文件。
其实在生成pdf的时候我比较了两种方法的执行时间,感觉用字体文件生成速度稳定一些,在500ms左右,而itextaria第一次执行则超过了1s,以后会降到400ms左右。而 itext直接生成则在10ms级。
性能方面大家要多加考虑,这绝对不能应用到高并发的情况。要不然你就等着重启机器吧
解决了中文就该说说生成pdf常见的问题,如分页,如页眉,页脚,超链,图片,margin不过我懒得写了,附件中有个pdf里面都有解决方法。
直接贴代码吧
StringBuilder sb = new StringBuilder();
BufferedReader reader = new BufferedReader(new FileReader(new File("abc.html")));
String line = null;
while((line = reader.readLine()) != null){
sb.append(line).append("\r\n");
}
ITextRenderer render = new ITextRenderer();
ITextFontResolver font = render.getFontResolver();
try {
font.addFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
// font.addFont(Html2Pdfs.class.getResource("SIMSUN.TTC").toString().substring(6),
BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
} catch (DocumentException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
OutputStream os = new FileOutputStream(pdf);
render.setDocumentFromString(sb.toString());
render.layout();
render.createPDF(os);
os.close();
很简单吧,不过生成速度非常慢,我测试过纯itext的生成速度非常快,那么应该是解析css慢。没办法谁叫只有这一家支持css呢,要不就只能去用itext了。