需求:今天遇到一个需求,要求页面是一个报表文件之类,然后有公司盖章,但要求这个东西得安全(就是这个章不能随便就能让他们得到,图片有另存为呀,将来人家把数据都弄下来,自己单独盖一个章,这不造假吗)
第一反应用js在页面去控制类似复制,粘贴,右键之类,试了一些之后发现,如果稍微懂一些代码的话,页面还有好多的漏洞,比如debug,之类,里面的代码一览无余。(稍后把一些常用的js附上)
这就开始了第二种思路:干脆把章跟文件容易一体,这样他们另存为也好,截屏也好,是一个整体。想单独去把章弄下来,还得自己ps去,这个没办法控制的。
现在看了一下网上的工具,先选择生成图片的HtmlImageGenerator,先记录一下,稍后把过程等等记录一下!这里转载一下http://blog.csdn.net/luohaobubu/article/details/7414554,
问题:1)使用本地文件的图片的时候(html中带有本地的图片)不识别
2)使用网络图片,目前测试的是jpg,png,bmp,其中bmp是不能识别的。
3)css样式实在是个大问题,果断放弃了
既然图片暂时没有什么好的方法,那就直接转成pdf吧,网上的文章也很多,基本上有两种主流的
1)itext:这个能识别中文,但是对css解析不干恭维
2)flyling sauser:这个可以解析html代码,并且css识别度高。
我看到网上有人用itext直接画表格的,然后再加上水印之类的功能,其实大部分还是能实现的。由于我一开始选择了2),所以就先研究这个,目前也是采用的这个。
我的开始的基本思路是,用flying解析html代码,生成pdf,然后再用itext加水印,再加密,再读取。后来发现太麻烦了,差了一下资料,总结如下:
flying sauser 我们把加水印的功能直接变成html里面的背景色(网上有这么做的),然后自己加密。这时候,你想保存可以保存,不想保存跟servlet结合直接在页面展示。
展示部分主要的servlet结合的代码:
response.setContentType("application/pdf"); StringBuffer sb = new StringBuffer(); sb .append( "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">") .append("<html xmlns=\"http://www.w3.org/1999/xhtml\">") .append("<head>") .append( "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />") .append("<style type='text/css' mce_bogus='1'>") .append(".STYLE0 {font-size: 12px;}") .append(".STYLE1 {font-size: 14px;}") .append(".STYLE2 {font-size: 16px;}") .append( "table{border-collapse: collapse;border: none;width: 1000px;table-layout:fixed; word-break:break-strict;}") .append( "td{border-color:#000000;border-style:solid;border-width:0.01cm;}") .append("body{font-family:'SimSun';}") .append( "@page {size: 297mm 210mm;margin: 5mm;-fs-flow-top: 'header';-fs-flow-bottom: 'footer';-fs-flow-left: 'left';-fs-flow-right: 'right';padding: 1em; }") .append("</style>").append("</head>").append("<body>"); sb .append("<div style='overflow:auto;height: 100%;background-image:url(file:/C:/Users/ayq/Desktop/371401.png);background-repeat:no-repeat;background-position:top center' align='center'>"); sb .append("<div align='center' style='margin-top: 5;font-size:20px'><b>" + workName + "</b></div>"); sb.append("</div>"); sb.append("</div>"); sb.append("</body></html>"); OutputStream os = response.getOutputStream(); ITextRenderer renderer = new ITextRenderer(); ITextFontResolver fontResolver = renderer.getFontResolver(); fontResolver.addFont("C:/Windows/fonts/simsun.ttc", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED); renderer.setDocumentFromString(sb.toString()); PDFEncryption pdfEncryption = new PDFEncryption(null,null,PdfWriter.ALLOW_PRINTING); renderer.setPDFEncryption(pdfEncryption); renderer.layout(); renderer.createPDF(os); os.close();
注意红色的部分,@page是为pdf样式写的,size表示宽度、高度等,其他的可以查相关文档,PDFEncryption是设置权限的这里只设置了打印权限。
以后有机会研究一下itext里面的代码,未完待续。。。