java语言html转pdf(html,pdf样式)

需求:今天遇到一个需求,要求页面是一个报表文件之类,然后有公司盖章,但要求这个东西得安全(就是这个章不能随便就能让他们得到,图片有另存为呀,将来人家把数据都弄下来,自己单独盖一个章,这不造假吗)

第一反应用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里面的代码,未完待续。。。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值