有玩过激战2新资料片好玩吗Flying Saucer的人么

补充 Flying Saucer 不支持中文,换行,粗体,CheckBox多选框如何解决 - CSDN博客
补充 Flying Saucer 不支持中文,换行,粗体,CheckBox多选框如何解决
& 最近要生成打印版的保单信息,内容比较多,也比较复杂,iText直接生成的话,想必花很多时间,而且可能也很难维护,偶然看到了HTML 在 Fly Saucer的帮助下能转换成PDF,解析CSS还不错,顿时随便拿个网页转了一下,比想象中好,于是决定用在项目中了:
& & & & 然而真正用起来的话,会遇到很多问题,在此我一一总觉出来,然后给予解我的决办法,也希望大家有什么更好的办法的话,互相分享;
& & & & 1. Flying Saucer 只能解析HTML, 但我们的文件都是JSP , 那怎么解决呢?
& & & & & &&
& & & & 我的想法是,截取请求,当客户发送一次请求后,我们后台务必会解析JSP,然后生成HTML返回给浏览器,这时我们就可以获取response所携带的字节流。但是,由于我们写到response中的流是无法再次获取的(在服务端);就像我们用OutputStream 把内容写入文件一样,我们只持有当前OutputStream对象的话,是无法再次获取已经写入的内容一样,这就是输出流的不可逆性;所以,我们得借助&HttpServletResponseWrapper
接口,我们编写一个自己的类实现这个接口,然后我们的类就可以充当&HttpServletResponse 来使用(相当于我们的类冒充HttpServletResponse一样),然后我们在Servlet中截取请求,再把请求跳转到要打印成PDF的jsp页面,当请求回来时,我们就可以获取请求带回来的数据,然后转换成String,生成PDF,同时写入真正的&HttpServletResponse&
对象中返回给客户端。
import&java.io.ByteArrayOutputS
import&java.io.IOE
import&java.io.OutputStreamW
import&java.io.PrintW
import&java.io.UnsupportedEncodingE
import&javax.servlet.ServletOutputS
import&javax.servlet.http.HttpServletR
import&javax.servlet.http.HttpServletResponseW
public&class&PDFResponseWrapper&extends&HttpServletResponseWrapper&{
&&&&private&ByteArrayOutputStream&buffer&=&&
&&&&&private&ServletOutputStream&out&=&&
&&&&&private&PrintWriter&writer&=&&
&&&&&public&PDFResponseWrapper(HttpServletResponse&resp)&throws&IOException&{&
&&&&&&&&&super(resp);&
&&&&&&&&&buffer&=&new&ByteArrayOutputStream();//&真正存储数据的流&
&&&&&&&&&out&=&new&WapperedOutputStream(buffer);&
&&&&&&&&&String&encoding&=&resp.getCharacterEncoding();
&&&&&&&&&writer&=&new&PrintWriter(new&OutputStreamWriter(buffer,&encoding));&
&&&&&/**重载父类获取outputstream的方法*/&
&&&&&@Override&
&&&&&public&ServletOutputStream&getOutputStream()&throws&IOException&{&
&&&&&&&&&return&&
&&&&&/**重载父类获取writer的方法*/&
&&&&&@Override&
&&&&&public&PrintWriter&getWriter()&throws&UnsupportedEncodingException&{&
&&&&&&&&&return&&
&&&&&/**重载父类获取flushBuffer的方法*/&
&&&&&@Override&
&&&&&public&void&flushBuffer()&throws&IOException&{&
&&&&&&&&&if&(out&!=&null)&{&
&&&&&&&&&&&&&out.flush();&
&&&&&&&&&}&
&&&&&&&&&if&(writer&!=&null)&{&
&&&&&&&&&&&&&writer.flush();&
&&&&&&&&&}&
&&&&&@Override&
&&&&&public&void&reset()&{&
&&&&&&&&&buffer.reset();&
&&&&&/**将out、writer中的数据强制输出到WapperedResponse的buffer里面,否则取不到数据*/&
&&&&public&byte[]&getResponseData()&throws&IOException&{&
&&&&&&&&&flushBuffer();&
&&&&&&&&&return&buffer.toByteArray();&
&&&&&/**内部类,对ServletOutputStream进行包装*/&
&&&&private&class&WapperedOutputStream&extends&ServletOutputStream&{&
&&&&&&&&&private&ByteArrayOutputStream&bos&=&&
&&&&&&&&&public&WapperedOutputStream(ByteArrayOutputStream&stream)&throws&IOException&{&
&&&&&&&&&&&&&bos&=&&
&&&&&&&&&}&
&&&&&&&&&@Override&
&&&&&&&&&public&void&write(int&b)&throws&IOException&{&
&&&&&&&&&&&&&bos.write(b);&
&&&&&&&&&}&
&&&&&&&&&@Override&
&&&&&&&&&public&void&write(byte[]&b)&throws&IOException&{&
&&&&&&&&&&&&&bos.write(b,&0,&b.length);&
&&&&&&&&&}&
import&java.io.IOE
import&java.io.OutputS
import&javax.servlet.ServletE
import&javax.servlet.http.HttpServletR
import&javax.servlet.http.HttpServletR
import&org.apache.log4j.L
import&com.itextpdf.text.DocumentE
import&com.sinosoft.flex.service.insure.InsuredMaterialD
import&com.sinosoft.flex.service.insure.PDFResponseW
import&com.sinosoft.flex.service.insure.PlanApproveBL;
import&com.sinosoft.flex.service.insure.PolicyPDFPrintGenerationBL;
public&class&SubServletForPDF&extends&SuperServlet{
&&&&private&static&final&long&serialVersionUID&=&1L;
&&&&private&static&Logger&log&=&Logger.getLogger(PlanApproveBL.class);
&&&&@Override
&&&&public&void&service(HttpServletRequest&request,&HttpServletResponse&response)
&&&&throws&ServletException,&IOException&{
&&&&&&&&String&operator1&=&&operator1&;
&&&&&&&&String&policyPDF&=&&policyPDF&;
&&&&&&&&String&operator&=&request.getParameter(&operator&);
&&&&&&&&///////////&&&&投保单资料下载1&&分红,万能险种资料下载
&&&&&&&&if(operator1.equals(operator)){
& & & & & & /////// Other Logic
&&&&&&&&}else&if(policyPDF.equals(operator)){
&&&&&&&&&&&&PolicyPDFPrintGenerationBL&pdfBL&=&new&PolicyPDFPrintGenerationBL();
&&&&&&&&&&&&String&printPDF&=&request.getParameter(&print&);
&&&&&&&&&&&&if(printPDF&!=&null&&&&printPDF.equals(&Y&)){
&&&&&&&&&&&&&&&////// Other Logic
&&&&&&&&&&&&}else{
&&&&&&&&&&&&&&&&String&poNo&=&request.getParameter(&poNo&);
&&&&&&&&&&&&&&&&if(poNo&==&null&||&poNo.length()&&1){
&&&&&&&&&&&&&&&&&&&&(&获取保单信息失败,请传入保单号&);
& & & & & & & & & &&Error&err&=&new&Error(&查询数据失败&);
& & & & & & & & & & &throw&new&RuntimeErrorException(err);
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&request.setAttribute(&poNo&,&poNo);
&&&&&&&&&&&&&&&&String&servletPath&=&pdfBL.getServletPath(poNo);
// 获取转发的请求路径,然后把请求转向生成PDF的JSP页面
&&&&&&&&&&&&&&&&response.setCharacterEncoding(&UTF-8&);
&&&&&&&&&&&&&&&&PDFResponseWrapper&responWrapper&=&new&PDFResponseWrapper(response);
&&&&&&&&&&&&&&&&request.getRequestDispatcher(servletPath).forward(request,&responWrapper);
&&&&&&&&&&&&&&&&byte[]&data&=&responWrapper.getResponseData();
// 获取out.write()进来的 html 字节流
&&&&&&&&&&&&&&&&String&str&=&new&String(data,&UTF-8&);
&&&&&&&&&&&&&&&&pdfBL.convertHtmlToPdf(str);&
// html格式的 字符串转换成PDF,代码在下面
&&&&&&&&&&&&&&&&OutputStream&out&=&response.getOutputStream();
&&&&&&&&&&&&&&&&out.write(data);
&&&&&&&&&&&&&&&&out.close();
&&&&&&&&&&&&}
}2. Flying Saucer 不支持中文,换行,粗体,CheckBox多选框,我是如何解决的?& & (1)、中文的话,网上有很多说明了,在此我大概说一下,然后给出代码:& & & & 1)、如同网上所说的,直接在代码里面添加中文字体支持,然后CSS中也要设置相关字体(注意大小写一致)&&&&&&&&&body{MARGIN:AUTO;width:690font-size:12&font-family:SimH&color:#222;} /// 黑体
&body{MARGIN:AUTO;width:690font-size:12&font-family:SimS&color:#222;} /// &宋体
import&java.io.FileOutputS
import&java.io.IOE
import&java.io.OutputS
import&org.apache.log4j.L
import&org.xhtmlrenderer.pdf.ITextFontR
import&org.xhtmlrenderer.pdf.ITextR
import&com.lowagie.text.DocumentE
import&com.lowagie.text.pdf.BaseF
import&com.sinosoft.flex.pubfun.PubF
import&com.sinosoft.utility.SSRS;
public&class&PolicyPDFPrintGenerationBL&{
&&&&private&static&Logger&log&=&Logger.getLogger(PlanApproveBL.class);
&&&&public&boolean&convertHtmlToPdf(String&html){&&
&&&&&&&&try&{
&&&&&&&&&&&&OutputStream&os&=&new&FileOutputStream(&D:\\letter\\iText_22.pdf&);&&&&&&&
&&&&&&&&&&&&ITextRenderer&renderer&=&new&ITextRenderer();&&&&&&&
//&&&&&&&&String&url&=&new&File(inputFile).toURI().toURL().toString();&&&
&&&&&&&&&&&&System.out.println(html);
&&&&&&&&&&&&renderer.setDocumentFromString(html);&&&&&
&&&&&&&&&&&&//&解决中文支持问题&&&&&&&
&&&&&&&&&&&&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);&
&&&&&&&&&&&&//解决图片的相对路径问题&&
&&&&&&&&&&&&renderer.getSharedContext().setBaseURL(&file:G:\\tmp\\practice/&);&&
&&&&&&&&&&&&renderer.layout();&&&&&&
&&&&&&&&&&&&renderer.createPDF(os);&&&&
&&&&&&&&&&&&os.flush();&&
&&&&&&&&&&&&os.close();&&
&&&&&&&&}&catch&(DocumentException&e)&{
&&&&&&&&&&&&e.printStackTrace();
&&&&&&&&}&catch&(IOException&e)&{
&&&&&&&&&&&&e.printStackTrace();
&&&&&&&&}&&&&&&&
&&&&&&&&return&&&
&&&&public&String&getServletPath(String&policyNo){
&&&&&&&&String&policyInfoSql&=&&select&a.insureordertype,&'BJ'&from&FCOrder&a&where&a.insureorderid&=&?&;
&&&&&&&&SSRS&tSSRS&=&PubFun.queryData(policyInfoSql,&policyNo);
&&&&&&&&if(tSSRS.MaxRow&!=&1){
&&&&&&&&&&&&log.error(&获取保单信息失败,参数:&&+policyNo+&SQL:&+policyInfoSql);
&&&&&&&&&&&&return&
&&&&&&&&String&policyType&=&tSSRS.GetText(1,&1);
&&&&&&&&String&subType&=&tSSRS.GetText(1,&2);
&&&&&&&&String&servletPath&=&&/insure/PolicyFPDPrint&+policyType+subT
&&&&&&&&return&servletP
& & 2). 修改源代码:添加宋体支持,Flying Saucer ,大家想想估计也能发现,以上的方法在Linux是行不通的,至少Linux没有C盘。所以我们只能通过iText本身的支持添加字体了(说实话,我没在Linux下试过,在windows上试了试可以正常显示的,感觉应该能在Linux下也能正常工作):
& & 然后就可以直接使用了,只需要页面中的css字体修改为&font-family:STS (大小写敏感)
& & & & & & 我修改好了的jar包:
& & (2).表格中TD换行的话,我试了网上说的方法是可行的的,但达不到我想要的效果,因为设置了样式之后,你表格中的 td 大小就不能再次调节了,具体方法请参见下面这篇文章:
& & 根据我想要的效果是,我的思路是,在TD中再添加DIV,然后固定你想要的长度,这样你就可以控制你的TD大小了,不知道是不是所有jar都支持中文换行,我用的这个jar是支持DIV换行的。
& & (3). 粗体:
&&&&&&&&&&& 你发现,无论是 STSong, 还是 SimSun, 当你设置粗体之后,在页面显示是加粗的,但打印出的PDF,却怎么也无法加粗, 这是我阅读源码的原因之一,但可惜花了两天左右的时间,我还是找不出解决的方法; &最后,我忽然发现我可以用黑体代替粗体, 而且效果还不错, 如果客户没那么严格要求,或者说是又不想多花钱用商业软件的话,这个效果已经很不错了。
& & & & & & & & ---------------------- &如果有谁有其他更好的方法的话,一定记得分享出来...................
& & & (4)。 Checkbox,多选框无法显示。
&&&&&&&&&&&&&& 这也是一个致命的问题啊,我一开始想到的最坏的打算是图片代替, &这样的话会比较麻烦,因为有很多Checkbox的时候,加载,判断都是很麻烦的;
& & & & & & & & 最后我的思路是(稍微比上面这个好点),用一个特殊字符 &√ & , 还可以调节大小(font-size),哈哈,这个在中文下可以显示出来,不知道英文会不会显示正常,然后在外面套一个 div ,固定个大小, 不就成多选框了吗。当然,你得封装判断的方法,我的方法是,调用一个类,在类里面从数据库中查询各个选项的值,然后判断,是不是被选中,选中的话,返回一个 className
(color:#000),把这个class赋值给div,就显示打钩,否则,返回另一个 className(color:#fff),这样打钩在框框里面就看不见了,&
&&&&&&&&&&div&class=&&%=clasY&%&&&√&/div&是&&div&class=&&%=clasN&%&&&√&/div&否&/td&
& & & & 它俩所对应的css
&.chk{width:12height:12line-height:12font-size:12display:border:1px&solid񬠜margin:0px&4px&0px&4color:#}
& & & & & .chked{width:12font-size:12display:border:1px&solid񬠜&margin:0px&4px&0px&4font-weight:}
& & & & 我在后台写了个方法,是返回class对于的值然后赋值给 div中的class的,这样你就可以根据你的类型,和值判断是否跟后台的值是不是一样的,一样的话返回chked,否则返回chk:
public&String&getCheckData(String&dataType,String&codeKey){
&&&&&&&&String&clasName&=&
&&&&&&&&String&val&=&chkData.get(dataType);
&&&&&&&&val&=&chkData.get(dataType);
&&&&&&&&clasName&=&(codeKey.equals(val))&?&&chked&&:&&chk&;
&&&&&&&&if(dataType.equals(&&)){
&&&&&&&&&&&&System.out.println(&codeKey&:&+codeKey);
&&&&&&&&return&clasN
最后分享一下我做出来的效果吧,
要求不是太高的话,这些基本能满足这些客户要求了。& done。
本文已收录于以下专栏:
相关文章推荐
一、重写Breaker,添加中文识别// Decompiled by Jad v1.5.8e2. Copyright 2001 Pavel Kouznetsov.// Jad home page: h...
Flying Saucer实现html转pdf
解决中文换行及字体乱码参考的文章:
html 转换成pdf /blog/1996749
使用到的包为修改过的
itextasian.jar,i...
java-使用 flying-saucer 通过 xhtml 生成 pdf 文档支持 css 和 图片
重要说明:
1.使用 xhtml 生成 pdf ,对于 xhtml 的语法要求非常严...
1首先下载官方的 iText-2.0.8.jar, 这是导出PDF必备的jar包,
2 程序中需要指定 中文字体:
ITextRenderer renderer...
在一次项目中使用itext +
Apache Tomcat(R) is an open source software implementation of the Java Servlet and JavaServer Pages te...
原博文地址
http://blog.csdn.net/shanliangliuxing/article/details/6833471
下面是我自己利用flying sau...
新增一个类:
package mon.
import java.io.IOE
import org.bouncycastle.uti...
他的最新文章
讲师:董岩
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)> 博客详情
&&&&老外做的东西,没有考虑到中文问题。默认提供的包里,中文不会换行,
,解决了这个问题。这东西源码里面是将英文按空格分组,每组判断其位置+长度是否超出边界,超出的话将该组丢到下一行,但是中文里面基本没有空格,所以就无奈了。将其源码改了改,如果是中文,每字一组,如果是英文,还是按照空格分组,这样大概效率会受一些影响,不过好歹是可以用了,而且一般pdf生成我想应该也不会放在需要大访问量的地方吧。附件是打好包的jar,覆盖就可以了。需要注意的是,在官网提供的jar包里,有两个包,一个是core-renderer.jar,另一个是core-renderer-minimal.jar。引用时,只需引用前者就行。有人曾经说用这个重新编译后的包替换了原来的包之后,不起作用,原因就在此。
&另外,想要中文换行,如果是table,那么table 的style必须加上这句话
style="table-layout: word-break:break-"
支付宝支付
微信扫码支付
打赏金额: ¥
已支付成功
打赏金额: ¥客户服务电话
Flying Saucer Restaurant点评旅游攻略
Flying Saucer Restaurant
Flying Saucer Restaurant
牛牛暂时找不到符合要求的信息,试试其他条件呢
快来抢一个沙发吧~
1分(一般般)
2分(还行,可以去)
3分(矮油,不错)
4分(棒棒哒,值得去)
5分(很赞,一定要去)
热门目的地攻略
热门景点大全
扫描下载途牛APP
最新预订:
1分钟前用户***262097预订2人铁发独立成团 日式榻榻米 岚山小火车 日剧茶泡饭 2日自由 免费wifi&&&&
1分钟前用户***573802预订[春节]爸妈游人气款 团队活动用餐全含 畅游本州5大城市 上海机场酒店住宿1晚 A行程5天观光用车&&&&
2分钟前用户***193511预订自由搭配,海边度假圣地,上海直飞&&&&
3分钟前用户***预订含拈花湾小镇门票 享客栈下午茶 客栈特色体验项目 一笑堂亲子体验&&&&
5分钟前用户***552639预订越南0自费,吃椿记烧鹅,北海风味海鲜餐,动车衔接,住大公馆,广越边境全景游&&&&
6分钟前用户***815022预订[元旦]万人出游,好评如潮,热销TOP,游天府之国,品蓉城小吃,体验悠闲慢生活,热销酒店集结,出发吧我们&&&&
6分钟前用户***069395预订同类产品标杆 超3000人出游 AC线全含餐 不带一分钱游日本 京都奈良双古都 日本六城全游览 B线高性价比 一晚温泉&&&&
7分钟前用户***036751预订热门酒店可选,玩转普吉,畅爽体验&&&&
8分钟前用户***hzp预订[春节]千人出游,四星酒店,马德里皇宫,斗牛士之乡龙达,卡门故乡塞维利亚,高迪之城巴塞罗那,部分升级阿尔罕布拉宫&&&&
8分钟前用户***165110预订上海包机直飞特价,含早含税含接送,酒店级别多重选择,赠送塞班大礼包(环岛游和军舰)&&&&FLYING SAUCER专辑_FLYING SAUCERCrazy Ken Band_在线试听 - 虾米音乐
Loading...
FLYING SAUCER
唱片公司:
发行时间:
专辑类别:
录音室专辑
我的评价:
Crazy Ken Band专辑介绍:クレイジーケンバンドのデビュー15周年(2013年時)を記念する通算14枚目のオリジナル?アルバム。行定勲監督の映画『つやのよる』の主題歌「ま、いいや」をはじめ、西友CMソング2013などを収録。
document.write(tip_tmpl);
setTimeout(function() {
$('#tip_60d').fadeOut();
}, 30000);
美食刑事立花
美食刑警op,越听越带感啊.
不用听,肯定五颗星!!!!
唉呦..讨厌,根本忘记了.....
去死吧...我这个不忠诚歌迷...
使用手机扫码收听专辑
打开虾米音乐APP
点击 扫一扫
扫描二维码
收藏了这张专辑的人们...
Crazy Ken Band的其他热门专辑
资料贡献者:
音频贡献者:
关注虾米:FLYING SAUCER SANACKS电话,地址,价格,营业时间(图)-香港-百度糯米
有即将到期的糯米券笔订单未评价笔订单未付款条新的商家回复百度糯米:nuomivip
热门分类中国菜外国菜热门影片热门院线
团购FLYING SAUCER SANACKS
FLYING SAUCER SANACKS
迪斯尼乐园内
查看地图
支付宝-特约商家
可信网站 身份验证
网站认证 Web Trust

我要回帖

更多关于 模拟人生好玩的资料片 的文章

 

随机推荐