客户端打印报表

来源:互联网 发布:梦幻西游生死决数据 编辑:程序博客网 时间: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
原创粉丝点击