flying saucer html转pdf经验分享
2014-11-22 13:19
204 查看
摘要: 使用flying saucer 将html转pdf存在诸多问题,需要一个个解决,花了将近两天时间才搞的差不多,和大家一起分享,希望能有所帮助
对比了很多生成pdf的方案,最终还是决定使用flying saucer,网上能搜出N多相关文章,但是照着做了会出现各种问题,还是得自己一点点摸索,前后花了两天时间才达到自己的目标,下面把过程中的经验总结一下,希望对大家能有所帮助:
上面这个很简单,到处都能找到示例代码,但是注意点来了:页面中字体不能使用中文,需要使用英文名称,而且是大小写敏感的!例如宋体的英文名称是 SimSun(注意不是simsun!,首字母都是大写的)
错误写法:font-family:宋体 或者 font-family:simsun
正确写法:font-family:SimSun 或者 font-family:SimHei
如果生成的pdf中文不显示或者乱码,请确认如下信息:
确保页面中所有内容都指定了字体,最好能指定 body {font-family:....},以防止漏网之鱼。
确保上述所有字体均通过addFont加入,字体名称错误或者字体不存在会抛出异常,很方便,但是没导入的字体不会有任何提示。
确保字体名称正确,不使用中文,大小写正确。
确保html标签都正确,简单的方法是所有内容都去掉,随便写几个中文看看能否正常生成,如果可以,在认真检查html标签,否则再次检查上述几条。
还有就是中文换行的问题了,带有中文而且文字较多存在换行情况时,需要给table加入样式:
table-layout:fixed,然后表格中的td使用%还指定td的宽度。
3)加密及权限
加密方法较为简单:
但是注意点来了,需要引入jar包!bcprov-jdk16-145.jar,百度一下很多的。
两个参数:两个都是密码,不同的是第一个密码是浏览密码,输入该密码打开pdf后根据设置的权限进行控制,第二个密码属于所有者密码,使用该密码打开pdf权限不受控制。
pdf的操作权限根据例子中写就行了
注意点:大写标签不识别!比如<DIV> <TD>等等统统不识别!,说到底就是大小写敏感。
6)标签
其实就是在页面中增加锚点,然后在head中加入bookmark即可,但是注意点来了,如果你是将多个页面生成到一个pdf中,那么只要在最后一个页面中加入bookmark就可以了!否则会重复哦。
对比了很多生成pdf的方案,最终还是决定使用flying saucer,网上能搜出N多相关文章,但是照着做了会出现各种问题,还是得自己一点点摸索,前后花了两天时间才达到自己的目标,下面把过程中的经验总结一下,希望对大家能有所帮助:
1)jar包选择
小小抱怨一下,各种开源产品给了我们极大帮助,但是通常版本管理较为混乱,也给我们带来了不小的麻烦,因为jar包兼容性问题花了很长时间,尤其是itext,下载了最新的5.5.0 5.5.1版本居然里面都有错误的!最后试了各种版本,终于选定5.0.6版本。貌似无法上传附件,否则可以将jar上传,免得大家找起来麻烦。注意一下,我也是网上下载了一个别人修改过支持中文的jar包。2)中文支持
首先需要添加中文字库,也就是你的页面中用到的所有字体:ITextFontResolver fontResolver = renderer.getFontResolver(); fontResolver.addFont("C:/Windows/Fonts/simsun.ttc", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED); fontResolver.addFont("C:/Windows/Fonts/simhei.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED); fontResolver.addFont("C:/Windows/Fonts/simkai.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
上面这个很简单,到处都能找到示例代码,但是注意点来了:页面中字体不能使用中文,需要使用英文名称,而且是大小写敏感的!例如宋体的英文名称是 SimSun(注意不是simsun!,首字母都是大写的)
错误写法:font-family:宋体 或者 font-family:simsun
正确写法:font-family:SimSun 或者 font-family:SimHei
如果生成的pdf中文不显示或者乱码,请确认如下信息:
确保页面中所有内容都指定了字体,最好能指定 body {font-family:....},以防止漏网之鱼。
确保上述所有字体均通过addFont加入,字体名称错误或者字体不存在会抛出异常,很方便,但是没导入的字体不会有任何提示。
确保字体名称正确,不使用中文,大小写正确。
确保html标签都正确,简单的方法是所有内容都去掉,随便写几个中文看看能否正常生成,如果可以,在认真检查html标签,否则再次检查上述几条。
还有就是中文换行的问题了,带有中文而且文字较多存在换行情况时,需要给table加入样式:
table-layout:fixed,然后表格中的td使用%还指定td的宽度。
3)加密及权限
加密方法较为简单:ITextRenderer renderer = new ITextRenderer(); renderer.setPDFEncryption(getEncryption()); private PDFEncryption getEncryption() { PDFEncryption encrypt = new PDFEncryption(new String("a").getBytes(), new String("b").getBytes(), PdfWriter.ALLOW_SCREENREADERS); return encrypt; }
但是注意点来了,需要引入jar包!bcprov-jdk16-145.jar,百度一下很多的。
两个参数:两个都是密码,不同的是第一个密码是浏览密码,输入该密码打开pdf后根据设置的权限进行控制,第二个密码属于所有者密码,使用该密码打开pdf权限不受控制。
pdf的操作权限根据例子中写就行了
4)css样式
其实flying saucer对很多css都支持得不好,这个得自己慢慢试了,相当痛苦的过程,不过只要成功一个,其他的就简单了。注意点:大写标签不识别!比如<DIV> <TD>等等统统不识别!,说到底就是大小写敏感。
5)多页面生成pdf
其实很简单,第一个页面不变,从第二个起:for(int i = 1; i < inputFile.length; i++) { renderer.setDocument(new File(root, inputFile[i])); renderer.layout(); renderer.writeNextDocument(); } renderer.finishPDF();
6)标签
<head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> <link href="****.css" rel="stylesheet" type="text/css" /> <bookmarks> <bookmark name="a" href="#a" /> <bookmark name="b" href="#b" /> </bookmarks> </head>
其实就是在页面中增加锚点,然后在head中加入bookmark即可,但是注意点来了,如果你是将多个页面生成到一个pdf中,那么只要在最后一个页面中加入bookmark就可以了!否则会重复哦。
相关文章推荐
- 经验分享 | 【PDF下载】阿里开源峰会之AliSQL功能特性详解
- 分享pdf转换成html格式的方法
- flying saucer html转pdf加页脚
- 2013 ISC:12位讲师的安全技术经验与最佳实战分享(含PDF)
- HTML5游戏开发经验及开发工具分享
- iTextRenderer(Flying Saucer) HTML转PDF
- 经验分享 |【PDF下载】运维/DevOps峰会之饿了么Redis Cluster集群演进
- 利用Flying Saucer 和 java iText 实现HTMl转PDF
- 经验分享 |【PDF下载】阿里开源峰会之BeeHive:一种大型iOS项目解耦实践
- 分享将pdf转换成html格式的技巧
- 经验分享 |【PDF下载】双11技术峰会之数据赋能商家背后的AI技术
- 移动Web开发与html 5实践经验分享:139邮箱工程师
- 原创:用Html画WorkFlow流程图经验分享
- 【经验分享】将数据导出为Excel、Html、Word
- 经验分享 |【PDF下载】运维/DevOps峰会之开源DevOps工具云上自动运维
- 经验分享 |【PDF下载】双11技术峰会之双11媒体大屏背后的数据技术
- Flying Saucer实现html转pdf(一些问题,持续更新)
- PDF转HTML常用方法分享
- 把pdf转换成html格式的转换方法分享
- iTextRenderer(Flying Saucer) HTML转PDF