报表知识库
我要提问

数据库保存客户端打印设置

项目需求描述:

华南资讯科技有限公司的广东人口系统证件打印是基于润乾的套打实现的,打印在整个项目中有着举足轻重的作用。

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

润乾报表已经提供了此功能,具体类代码为com.runqian.report4.usermodel. PrintSetupServlet。但此代码的缺点是设置信息以properties类型的文件保存在user.home下。客户对以文件保存配置信息的做法不认可,并且后续可能使用web集群环境,那么就很有必要将以文件形式保存客户端打印设置改进为以数据库形式保存客户端打印设置。

解决思路:

重写PrintSetupServlet类,当客户点击打印按钮时即调用此方法,已有打印配置则读取,没有则保存。

保存到数据表时的主键:客户端电脑名+客户端电脑网卡IP+报表名

实现步骤:

一:实现将打印设置保存到数据库的代码

1)  jdbc工具类(以sqlserver为例)

public class JdbcUtil

{

    static{

      String d = “com.microsoft.sqlserver.jdbc.SQLServerDriver”;

      try{

        Class.forName(d);

      }catch(Exception e){

        e.printStackTrace();

      }

    }

    public static Connection getConnection(){

      String url =

       “jdbc:sqlserver://127.0.0.1:1433;DatabaseName=Demo”;

      String username = “sa”;

      String pwd = “jade”;

      Connection con = null;

      try{

        con = DriverManager.getConnection(url,username,pwd);

      }catch(Exception e){

        e.printStackTrace();

      }

      return con;

}

    public static close(Statement stmt,Connection conn) {

       try {

           if (stmt != null) {

              stmt.close();

           }

           if (conn != null && !conn.isClosed()) {

              conn.close();

           }

       } catch(Exception e){

             e.printStackTrace();

          }  

}

2)  存储打印信息到数据库的代码

package com.runqian.report4.usermodel;

import java.io.PrintWriter;

import java.sql.Connection;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Statement;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import com.runqian.base4.util.ArgumentTokenizer;

import com.runqian.base4.util.ReportError;

public class PrintSetupServlet extends HttpServlet  {

    public PrintSetupServlet () { }

    /**

     * 本方法由系统在打印对话框初始化与关闭时调用

     */

    public void service(HttpServletRequest request,

           HttpServletResponse response) {

       PrintWriter pw = null;  //向客户端输出打印设置对象

       Statement stmt = null

       Connection conn = null; //这个对象直接取润乾默认的数据库连接

       try {

           request.setCharacterEncoding(“GBK”);

           response.setContentType(“text/html; charset=GBK”);

           pw = response.getWriter();

           String action = request.getParameter(“action”); //取得action值(存/取)

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

           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 setup = width + “|” + height + “|” + x + “|” + y + “|”

                  + w + “|” + h + “|” + orientation + “|” + printerName;

           if( conn == null ) {

              //获得数据库连接(代码见JdbcUtil)

              conn = JdbcUtil.getConnection( );

           }

           stmt = conn.createStatement( );

           //进行打印设置的保存工作

//查询语句

           String selectSQL = “select * from printsetup where id = ‘”+ key+ “‘”;

           //更新语句

           String updateSQL = “update printsetup set config =’” + setup+”‘ where id = ‘”+ key+ “‘”;

           //插入语句

           String insertSQL = “insert into printsetup values(‘”+key+”‘,’”+setup+”‘)”;

           if( “write”.equalsIgnoreCase( action )){

              ResultSet rs = stmt.executeQuery( selectSQL );

              if( rs.next() ){

                  stmt.executeUpdate( updateSQL );

              }else{

                  stmt.executeUpdate( insertSQL );

              }

           }else{

              //进行打印设置的读取工作

              ResultSet rs = stmt.executeQuery( selectSQL );

              if( rs.next() ){

                  setup = rs.getString( “config” );

              }

              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=” + at.nextToken());

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

              } else

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

           }

       } catch (Exception e) {

           e.printStackTrace();

       } finally {

           //关闭输出对象与数据库连接

           pw.close( );

           JdbcUtil.close( stmt, conn );

       }

    }

}

编译后将classes文件替换原文件。

二:Web.xml配置servlet

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

<!– 客户端打印设置–>

<servlet>

    <servlet-name>com.runqian.report4.usermodel.PrintSetupServlet</servlet-name>

    <servlet-class>com.runqian.report4.usermodel.PrintSetupServlet</servlet-class>

  </servlet>

  <servlet-mapping>

    <servlet-name>com.runqian.report4.usermodel.PrintSetupServlet</servlet-name>

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

  </servlet-mapping>    

<!– 客户端打印设置–>

三:发布页面的Tag标签设置

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

<report:html ……

         savePrintSetup=”yes”

         ……

/>

四:sqlserver数据库中新建数据表

CREATE TABLE  printsetup (

         id varchar (255) NOT NULL ,

         config varchar (255) NOT NULL

)

五:重启应用服务器

总结:

 

对于打印设置的保存问题,可通过实际业务需求对此代码进行灵活的改进。举例说明:如果在真实的生产环境下,ip是动态生成的,那么我们可以修改key值的规则,即将 key:客户端电脑名+客户端电脑网卡IP+报表名 修改为 key:客户端电脑名+报表名 即可。