客户端保存打印设置

阅读(5091) 标签: 客户端, 保存, 打印, 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中接收和传送打印设置的方式与例子中一定要相同。