前几天遇到个导出pdf 的需求,在网络上查找了一下java导出pdf 的方案.多数人推荐使用iText,研究了一下,感觉直接写pdf的方法太笨,可维护性差,一旦pdf格式要变化改起来很费劲.还有一个方案,可以先预先定义一个pdf作为模板文件,然后用业务数据进行填空.是个不错的方案,只可惜不适合我的需求.需求中有些行是动态加行的,这个方案无法实现.后来发现有可以将网页直接转成pdf 的开源包flyingsaucer (中文名:灰碟),逐将注意力转移到这上面,发现是个不错的选择.只要写网页就可以了,而且pdf格式变化维护起来也方便,代码也会比较干净.只是它对中文支持 的不好,但这不是无法解决的.下面就来说说这个flyingsaucer .
cb.setFontAndSize(_font.getFontDescription().getFont(), _font.getSize2D() / _dotsPerPoint);
try {
cb.setFontAndSize(BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED), _font.getSize2D()/_dotsPerPoint);
} catch (Exception e) {
}
ITextFontResolver fontResolver = renderer.getFontResolver();
fontResolver.addFont("C:/WINDOWS/Fonts/ARIALUNI.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
if (char1 < 128 || (char1 >= 160 && char1 <= 255))
total += widths[char1];
else
total += widths[PdfEncodings.winansi.get(char1)];
这几行改为:
if (char1 < 128 || (char1 >= 160 && char1 <= 255))
total += widths[char1];
else if ((char1 >= 19968) && (char1 <= 40869)) // 如果是中文字符加宽度500
total += 500;
else
total += widths[PdfEncodings.winansi.get(char1)];
再次测试,通过.至此,使用flyingsaucer 将网页导出成pdf 的中文问题 总算解决了.可是总觉得这个解决的方法有点不太正宗,因为修改了父类嘛.但又没有找到其他正宗的解决方案,只能先这样解决一下了.发出此文,只当抛砖引玉,如果有哪位高人有更好的解决方案请不吝赐教啊.
附件提供修改了的flyingsaucer -R8的两个jar包: core-renderer.jar和iText2.0.8.jar另有一个iText亚洲语言包.
原文:http://www.oecp.cn/hi/slx/blog/1857
提供该文档的机构为 百洋软件研究实验室 ,更多的博客文章可以到 百洋软件研究实验室博客 查看。该文档附件欢迎各位转载,但是在没有获得文章作者许可之前,不得对文章内容或者版权信息进行更改,版权归 百洋软件研究实验室 所有,仅此声明。