在客户端保存打印设置

阅读(659) 标签: 客户端, 保存, 打印, servlet,

在报表设计的时候,每张报表都有一个打印设置,但是这个设置可能与客户端电脑的打印机配置不相匹配(如设计的是A3纸,可是客户端打印机只支持A4);或者不同的报表需要用不同的打印机来打印(如发票打印机打印套打式报表等)。这样客户端用户在打印这些报表时每次都需要更改打印设置,用起来比较烦琐,因此需要将客户端的打印设置保存到服务器上,以便下次再打印这张报表时,可以从服务器读出打印设置,从而不需要再次设置。

保存时的主键是根据以下生成的:

客户端电脑名+客户端电脑网卡IP+报表名

 

报表系统配置:

要做到上述功能,报表系统需做以下几项工作:

1.web.xml的配置

需要增加一个servlet的配置如下:

<servlet>

  <servlet-name>com.raqsoft.report.usermodel.PrintSetupServlet</servlet-name>

  <servlet-class>com.raqsoft.report.usermodel.PrintSetupServlet</servlet-class>

  </servlet>

  <servlet>

  <servlet-name>com.raqsoft.report.view.PagedPrint</servlet-name>

  <servlet-class>com.raqsoft.report.view.PagedPrint</servlet-class>

  </servlet>

  <servlet-mapping>

  <servlet-name>com.raqsoft.report.usermodel.PrintSetupServlet</servlet-name>

  <url-pattern>/servlet/PrintSetupServlet </url-pattern>

  </servlet-mapping> 

 

蓝色字体部分“/servlet/PrintSetupServlet”是servlet的映射路径,不可更改。com.raqsoft.report.usermodel.PrintSetupServlet是润乾报表提供的一个缺省servlet实现,可以被替换。

2.tag属性设置

生成一个需要保存打印设置的报表,在tag标签中需增加一个属性设置,如下:

<report:html ......

  savePrintSetup=”yes”

  ......

/>

缺省servlet说明:

润乾报表提供的这个servlet是将打印配置以文件的形式保存在服务器上的用户主目录(user.home)中,文件名叫clientPrintSetup.properties。其源程序如下:

package com.raqsoft.report.usermodel;

 

import javax.servlet.*;

import javax.servlet.http.*;

import java.io.*;

import java.util.*;

import com.raqsoft.common.*;

import com.raqsoft.report.usermodel.*;

 

/* 保存和读取客户端报表打印设置的Servlet */

public class PrintSetupServlet

    extends HttpServlet {

  private boolean saveScale = false;

  public void init() throws ServletException {

    String scale = this.getServletConfig().getInitParameter("saveDisplayScale");

    this.saveScale = "yes".equalsIgnoreCase(scale);

  }

  public void service(HttpServletRequest request, HttpServletResponse response) {

    PrintWriter pw = null;

    try {

      request.setCharacterEncoding(Context.getJspCharset());

      response.setContentType("text/html; charset=" + Context.getJspCharset());

      pw = response.getWriter();

      String userHome = System.getProperty("user.home");

      String fileName = userHome + File.separator + "clientPrintSetup.properties";

      String action = request.getParameter("action");

      String key = request.getParameter("key"); //存取打印设置的关键字

      Properties p = new Properties();

      if ("write".equalsIgnoreCase(action)) { //保存

        FileInputStream fis = null;

        try {

          fis = new FileInputStream(fileName);

          p.load(fis);

        }

        catch (Exception e) {}

        finally {

          try {

            if (fis != null) {

              fis.close();

            }

          }

          catch (Exception ex) {}

        }

        String width = request.getParameter("width"); //纸张宽

        String height = request.getParameter("height"); //纸张高

        String x = request.getParameter("x"); //左边距

        String y = request.getParameter("y"); //上边距

        String w = request.getParameter("w"); //内容区宽

        String h = request.getParameter("h"); //内容区高

        String orientation = request.getParameter("orientation"); //纸张方向

        String printerName = request.getParameter("printerName"); //打印机名

        String a = request.getParameter("a"); //水平对齐

        String scale = request.getParameter("scale");

        String setup = width + "|" + height + "|" + x + "|" + y + "|" + w + "|" + h + "|"+ orientation + "|" + printerName + "|" + a + "|" + scale;

        p.setProperty(key, setup);

        FileOutputStream fos = null;

        try {

          fos = new FileOutputStream(fileName);

          p.store(fos, "Client user's print setup of report");

        }

        catch (Exception e) {}

        finally {

          try {

            if (fos != null) {

              fos.close();

            }

          }

          catch (Exception ex) {}

        }

        pw.println("ok");

      }

      else {

        FileInputStream fis = null;

        try {

          fis = new FileInputStream(fileName);

          p.load(fis);

        }

        catch (Exception e) {}

        finally {

          try {

            if (fis != null) {

              fis.close();

            }

          }

          catch (Exception ex) {}

        }

        String setup = p.getProperty(key);

        if (setup != null) {

          ArgumentTokenizer at = new ArgumentTokenizer(setup, '|');

  //以下是向客户端传送打印设置,每行一个属性,属性名含义与前面保存时的相同

          pw.println("width=" + at.nextToken());

          pw.println("height=" + at.nextToken());

          pw.println("x=" + at.nextToken());

          pw.println("y=" + at.nextToken());

          pw.println("w=" + at.nextToken());

          pw.println("h=" + at.nextToken());

          pw.println("orientation=" + at.nextToken());

          pw.println("printerName=" + Escape.add(at.nextToken()));

          if (at.hasMoreTokens()) {

            pw.println("a=" + at.nextToken());

          }

          if (at.hasMoreTokens()) {

            String scale = at.nextToken();

            if (saveScale) {

              pw.println("scale=" + scale);

            }

          }

        pw.println("setup=yes"); //输出这一行,说明此报表保存有打印配置

        }

        else {

        pw.println("setup=no"); //输出这一行,说明此报表没有保存打印配置

        }

      }

      pw.flush();

    }

    catch (Exception e) {

      if (pw != null) {

        pw.println("setup=no");

      }

    }

    finally {

      if (pw != null) {

        pw.close();

      }

    }

  }

}

 

替换缺省的servlet

如果你所需要的打印设置保存方式与缺省的形式不同,比如你想保存到数据库中,那么你可以自己写一个servlet来替换,同时修改前面介绍的servlet的配置,将类名换成你的,但是映射名不能更改。

你的这个servlet中接收和传送打印设置的方式与例子中一定要相同。