对比了不少生成pdf的方案,最终仍是决定使用flying saucer,网上能搜出N多相关文章,可是照着作了会出现各类问题,仍是得本身一点点摸索,先后花了两天时间才达到本身的目标,下面把过程当中的经验总结一下,但愿对你们能有所帮助:css
小小抱怨一下,各类开源产品给了咱们极大帮助,可是一般版本管理较为混乱,也给咱们带来了不小的麻烦,由于jar包兼容性问题花了很长时间,尤为是itext,下载了最新的5.5.0 5.5.1版本竟然里面都有错误的!最后试了各类版本,终于选定5.0.6版本。貌似没法上传附件,不然能够将jar上传,省得你们找起来麻烦。注意一下,我也是网上下载了一个别人修改过支持中文的jar包。html
首先须要添加中文字库,也就是你的页面中用到的全部字体:java
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
ui
正确写法:font-family:SimSun 或者 font-family:SimHei 加密
若是生成的pdf中文不显示或者乱码,请确认以下信息:spa
确保页面中全部内容都指定了字体,最好能指定 body {font-family:....},以防止漏网之鱼。code
确保上述全部字体均经过addFont加入,字体名称错误或者字体不存在会抛出异常,很方便,可是没导入的字体不会有任何提示。htm
确保字体名称正确,不使用中文,大小写正确。get
确保html标签都正确,简单的方法是全部内容都去掉,随便写几个中文看看可否正常生成,若是能够,在认真检查html标签,不然再次检查上述几条。
还有就是中文换行的问题了,带有中文并且文字较多存在换行状况时,须要给table加入样式:
table-layout:fixed,而后表格中的td使用%还指定td的宽度。
加密方法较为简单:
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的操做权限根据例子中写就好了
其实flying saucer对不少css都支持得很差,这个得本身慢慢试了,至关痛苦的过程,不过只要成功一个,其余的就简单了。
注意点:大写标签不识别!好比<DIV> <TD>等等通通不识别!,说到底就是大小写敏感。
其实很简单,第一个页面不变,从第二个起:
for(int i = 1; i < inputFile.length; i++) { renderer.setDocument(new File(root, inputFile[i])); renderer.layout(); renderer.writeNextDocument(); } renderer.finishPDF();
<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就能够了!不然会重复哦。