客户端打印报表
来源:互联网 发布:梦幻西游生死决数据 编辑:程序博客网 时间:2024/05/16 12:13
客户端打印报表
1. 问题描述
当客户需要使用CS方式调用报表,且需要客户端打印的时候情况下。下面方案提供一些解决思路
2.原理说明:
1.客户端发送请求和参数给服务器。
2.服务器根据客户端的参数把模板序列化后返回给客户端。
3.客户端接收服务器段的序列化后数据并反序列化生成报表对象,执行打印
3.实现步骤:
1.使用编译好的class和web.xml文件放在指定的报表服务器位置
servletWork.class是服务器端处理的Java文件,用来接受客户端发送的请求信息,返回序列化后的数据给客户端。
报表工程的web.xml添加一个servlet
内容如下:
<servlet> <servlet-name>servletWork</servlet-name> <servlet-class>com.fr.io.servletWork</servlet-class></servlet><servlet-mapping> <servlet-name>servletWork</servlet-name> <url-pattern>/servletWork</url-pattern></servlet-mapping>
2.代码处理说明
服务器处理代码servletWork代码如下:
package com.fr.io;import com.fr.base.FRContext;import com.fr.dav.LocalEnv;import com.fr.general.ModuleContext;import com.fr.main.impl.WorkBook;import com.fr.page.PageSetProvider;import com.fr.page.PageXmlProvider;import com.fr.report.core.ReportUtils;import com.fr.report.module.EngineModule;import com.fr.stable.PageActor;import com.fr.stable.bridge.StableFactory;import com.fr.web.utils.WebUtils;import javax.servlet.ServletException;import javax.servlet.ServletOutputStream;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;import java.util.HashMap;public class servletWork extends HttpServlet { private static final long serialVersionUID = 1L; private static final String CONTENT_TYPE = "text/html;charset=GBK"; public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } //Process the HTTP Get request public void doGet(HttpServletRequest req, HttpServletResponse res)throws ServletException, IOException { String envPath = "D:\\FineReport_8.0\\WebReport\\WEB-INF";//设置服务器端的报表环境,这里自行修改下 FRContext.setCurrentEnv(new LocalEnv(envPath)); ModuleContext.startModule(EngineModule.class.getName()); //获取模板名参数 String workname = WebUtils.getHTTPRequestParameter(req,"WorkBookName"); //获取模板参数 String rawDataString = WebUtils.getHTTPRequestParameter(req,"__rawDataString__"); //分割模板参数 HashMap<String, String> paraMap = analysis(rawDataString); try { // 读取模板 WorkBook workbook = (WorkBook) TemplateWorkBookIO .readTemplateWorkBook(FRContext.getCurrentEnv(), workname); //执行模板对象,生成用于打印的PageSetProvider PageSetProvider pageSet = workbook.execute(paraMap,new PageActor()).generateReportPageSet(ReportUtils.getPaperSettingListFromWorkBook(workbook)).traverse4Export(); //打印页面个数 FRContext.getLogger().info("pageSetsize"+String.valueOf(pageSet.size())); //输出序列化后的输出流 for (int j = 0;j<pageSet.size();j++) { ServletOutputStream out =res.getOutputStream(); StableFactory.getMarkedInstanceObjectFromClass(PageXmlProvider.XML_TAG, PageXmlProvider.class).xmlizable(pageSet.getPage(j), out, true); out.println(); } res.setContentType(CONTENT_TYPE); } catch (Exception e) { e.getStackTrace(); } } public HashMap<String, String> analysis( String normal) { //参数以&进行分割个数 String paramaters[] = normal.split("&"); java.util.Map<String, String> paraMap = new java.util.HashMap<String, String>(); //每个对象以=分割对象名和值 for (int i = 0; i < paramaters.length; i++) { String values[] = paramaters[i].split("="); paraMap.put(values[0], values[1]); } return (HashMap<String, String>) paraMap; }}
客户端模拟请求打印代码ClientMainParam.class代码解析(Demo,仅供参考)。
package com.fr.io;import com.fr.general.ModuleContext;import com.fr.page.PageXmlOperator;import com.fr.page.ReportPageProvider;import com.fr.page.module.PageModule;import com.fr.page.pageset.ArrayPageSet;import com.fr.page.pageset.PageSet;import com.fr.print.PrintUtils;import org.apache.http.Header;import org.apache.http.HttpEntity;import org.apache.http.HttpResponse;import org.apache.http.NameValuePair;import org.apache.http.client.HttpClient;import org.apache.http.client.entity.UrlEncodedFormEntity;import org.apache.http.client.methods.HttpPost;import org.apache.http.impl.client.DefaultHttpClient;import org.apache.http.message.BasicNameValuePair;import org.apache.http.protocol.HTTP;import org.apache.http.util.EntityUtils;import java.awt.print.PrinterException;import java.io.IOException;import java.io.UnsupportedEncodingException;import java.util.ArrayList;import java.util.List;public class ClientMainParam { public static void main(String[] args) throws UnsupportedEncodingException, IllegalStateException, IOException { //启动分页模板 ModuleContext.startModule(PageModule.class.getName()); HttpClient httpclient = new DefaultHttpClient(); //添加一个HttpClient对象,请求地址设置为http://localhost:8075/WebReport/servletWork? HttpPost httppost = new HttpPost("http://localhost:8075/WebReport/servletWork?"); List<NameValuePair> formparams = new ArrayList<NameValuePair>(); //设置相关的参数值 formparams.add(new BasicNameValuePair("WorkBookName", "isjavaprint.cpt")); formparams.add(new BasicNameValuePair("__rawDataString__", "isjavaprint=true")); //设置编码 UrlEncodedFormEntity entity = new UrlEncodedFormEntity(formparams, HTTP.UTF_8); httppost.setEntity(entity); //执行请求 HttpResponse response = httpclient.execute(httppost); //根据返回的请求的情况处理 if (response.getStatusLine().getStatusCode() == 200){ Header[] header = response.getAllHeaders(); for (Header header2 : header) { // System.out.println(header2); } HttpEntity resEntity = response.getEntity(); String jsonResult = EntityUtils.toString(resEntity); System.out.println(jsonResult); //反序列化处理 ReportPageProvider allPages =new PageXmlOperator().deXmlizable(jsonResult); PageSet pageSet2=new ArrayPageSet(new ReportPageProvider[]{allPages},true); //获取对象,打印 try { PrintUtils.print(pageSet2,true); } catch (PrinterException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }}
3.模板简单设计
新建一个模板,名为isjavaprint.cpt,模板内容为A1为一个参数$isjavaprint用来展示传来的参数。
4.验证过程
4.1测试servletWork是否正常返回序列化后的数据
启动服务器,在url输入
rawDataString=isjavaprint=true”>http://localhost:8075/WebReport/servletWork?WorkBookName=isjavaprint.cpt&rawDataString=isjavaprint=true
其中servletWork?为响应的serlvet-name,
WorkBookName为需要处理的模板名称,可以和reportlet一样,可以写完整的路径。
rawDataString为传入的参数格式为(参数1=值&参数2=值2)
查看页面源代码,如图可以到下方正常返回报表的序列化后的内容。
4.2.测试客户端连接打印
期待代码,运行ClientMainParam.java
弹出对话框
可以发现可以调试打印。
注:涉及到httpclient操作,故需要引入如下jar
0 0
- 客户端打印报表
- Applet+客户端打印+jasperreport+报表
- 一次 applet 客户端打印 jasperreport 报表任务笔记
- 一次 applet 客户端打印 jasperreport 报表任务笔记
- linux客户端打印报表时操作系统的配置
- 报表打印
- 报表打印
- 打印报表
- 报表打印
- 打印报表
- RDLC报表打印时提示 客户端无法加载打印控件的问题
- VS2010结合水晶报表实现条码打印发布IIS 客户端不能预览打印问题解决办法
- [.Net码农]RDLC报表打印时提示 客户端无法加载打印控件的问题
- 在B/S的客户端,如何用asp调用excel表格来打印报表呢
- 水晶报表客户端不能导出、打印,图标显示不正常之解决办法
- 报表打印技术-web打印
- 网页报表的打印
- Web 方式打印报表
- css3中的变形(transform)、过渡(transtion)、动画(animation)
- UVA-10815 - Andy's First Dictionary
- C#/.net学习-----C#基础知识
- 触屏手指滑动计算演示
- 触屏手指滑动计算演示
- 客户端打印报表
- eclipse 删除所有注释及空白行
- [随机化] HDU 5478 Can you find it
- JEDEC DDR2和DDR3 SPECIFICATION区别(持续更新)
- UVA-537 Artificial Intelligence?
- php几个比较实用的函数示例
- Quartz和Spring Task定时任务的简单应用和比较
- Suse linux 11 SP3安装VMWare Tools时问题的解决
- UVA - 10361 Automatic Poetry